千锋教育-做有情怀、有良心、有品质的IT职业教育机构

400-811-9990
当前位置:千锋视频教程 >  python视频教程  >  千锋Python视频教程之Theano中的符号计算图模型

千锋Python视频教程之Theano中的符号计算图模型

时间:2018-09-12 15:49     来源:千锋教育 作者:千锋Python

  前面章节中详细讲解了符号变量(tensorvariable)的定义方法,本节将对符号计算图的相关概念进行讲解。

  Theano处理符号表达式时是通过将符号表达式转换为计算图(graph)来处理的,因此,理解计算图的基本原理和底层的工作机制对于编写和调试Theano代码有着重要意义。

  符号计算图的节点有4种节点类型构成:variable节点(variable nodes,符号变量节点)、type节点(type nodes,类型节点)、apply节点(apply nodes,应用节点)和op节点(op nodes,操作符节点)。接下来将对这四种节点分别进行讲解。

  variable节点

  variable节点是符号表达式中存放信息的数据结构,是Theano使用中最常用到的数据结构,可以分为输入符号变量和输出符号变量。

  一个符号变量通常具有下面4个重要的域。

  type:定义可以在计算中使用的变量,指向type节点(本节后续内容将进行讲解)。

  owner:可以为None 或者一个变量的apply节点的一个输出(本节后续内容将进行讲解)。

  index:一个索引值,当owner的值不为None时,如果变量是输入符号变量,则表示该变量在owner所指向的符号表达式中是第index个输入变量;当owner的值为None时,如果变量是输出符号变量,则表示该变量在owner所指向的符号表达式中是第index个输出。

  l name:为变量定义名称,方便用于打印或调试。

  例如,输入以下的命令定义一个符号表达式y=-x

  import theano

  x = theano.tensor.ivector('x')

  y = -x

  x和y都是变量,即变量类的实例。x和y的type都是 theano.tensor.ivector。y是输出符号变量,而x是输入符号变量。计算的自身是通过apply节点和y.owner来进行访问的。更具体的说,Theano中的每一个变量都是一个基本结构,用来表示在计算中某个具体的点上的基准。通常是符号变量类或者是它的一个子类的实例。

  符号变量中有一个特殊的子类:Constant(常量)。常量就是有着一个额外域data的符号变量,它的值初始化(initialize)后不能再改变。当在计算图中用作Opapplication的输入时,需要假设该输入总是常量的数据域部分,也就是说,需要假设op不会修改该输入。在一个 函数的输入列表中,常量是无需指定的。

  type节点

  type节点定义了一种具体的变量类型以及变量类型的数据类型时,Theano为其指定了数据存储的限制条件,以irow的约束为例,定义type节点的表达式如下所示。

  w = theano.tensor.irow('w')

  上述表达式中定义了一个变量w。代码“irow”中的“i”是“int32”的缩写,表示变量w的数据类型为int32;代码“irow”中的“row”代表变量w的变量类型为row。在Theano中,type用来表示潜在数据对象上的一组约束,这些约束允许Theano定制C代码来处理需要被约束的变量,并对计算图进行静态优化。例如上面的变量w被指定了以下限制条件:

  底层必须以numpy.ndarray作为数据结构。

  数据类型必须是int32,即变量w必须是一个int32的整数数组。

  变量的形态大小必须为(1,n),即第一维的大小必须为1。

  如果不满足上述约束,则会返回TypeError错误。在这些约束条件下,Theano可以生成额外的C代码,用来声明正确的数据类型和基于维度上进行准确次数的循环。

  Theano的type不等同于Python的type或者class。在Theano中,irow和dmatrix都是使用numpy.ndarray来作为潜在的类型进行计算和数据存储的,实际上,在Theano中这两者是不同的type。使用dmatrix时候的约束如下:

  底层必须以numpy.ndarray作为数据结构。

  数据类型必须是64位的浮点数数组。

  变量的形态大小必须为(m,n),在m或n上都没有限制。

  除非特殊声明,后续内容中提到的“type”特指Theano中的type。

  apply节点

  apply节点是内部节点的类型,在theano中表示某一种类型的符号操作符应用到具体的符号变量中。不同于变量节点,apply节点不需要直接被最终用户操作,它们可以通过变量的onwer域来访问,一个apply节点包括三个重要的域。

  op:指向符号表达式使用函数或转换的位置。

  inputs:表示函数的参数,即符号表达式的输入参数变量列表。

  outputs:表示函数的返回值,即符号表达式的输出结果变量列表。

  应该用节点通常是apply类的一个实例。它表示op在一个或多个输入上的应用,这里每个输入都是一个变量。通常,每个op反应了如何从一个输入列表中构建一个apply节点。因此,apply节点可以在 op和输入列表的基础上,通过调用如下代码获得:

  op.make_node(*inputs)

  与Python语言相比,apply节点是Theano中的函数调用,op是Theano中的函数定义。

  op节点

  op节点是在某些类型的输入上定义一个具体的计算,并生成某些类型的输出。它等价于大部分编程语言中的函数定义,op定义了一个符号变量间的运算,以某种类型的符号变量作为输入,输出另一种符号变量,如+、-、sum()、tanh()等。

  理解op节点(函数的定义)和apply节点(函数的应用)之间的差别是十分重要的。通过以下示例来解释两者之间的差异。

  通过Python的语法来理解Theano的计算图结构,假设定义了一个函数f(x),将会对该函数生成一个op节点。

  def f(x)

  如果在代码中调用了该函数,那么将生成一个apply节点,并且该节点的op域将指向f节点。

  a = f(x)

  符号计算图模型

  Theano是将符号数学化的计算表示成计算图。这些计算图是由将apply节点和variable节点连接而成,apply节点与函数的应用相连,variable节点与数据相连。具体操作由op实例表示,而数据类型是由type实例表示。接下来通过一个具体的示例来理解符号计算图的结构。

  import theano.tensor as T

  x = T.dmatrix('x')

  y = T.dmatrix('y')

  z = x + y

  上述代码的逻辑非常简单,可以看出,分别定义了两个矩阵变量x和y,定义符号表达式z=x+y。该符号表达式转化为对应的符号计算图如图所示。

图片1

  图2.1 符号计算图

  图中,箭头表示各节点对所指向的Python对象的引用。变量指向Apply节点的过程是用来表示函数通过对应的owner域来生成自身。这些Apply节点是通过它们的inputs和outputs域来得到它们的输入和输出变量的。例如,变量x和变量y的值不是来自其他计算的结果,因此这两个变量的owner域指向了None,说明这两个变量的值不是由某个Apply节点生成;变量z的owner域指向了图中的Apply节点,这说明该变量的值来自该Apply节点。

  Apply节点的输出指向z,而z的owner域也指回Apply节点的,通过符号变量z的owner域获取其Apply节点:

  >>>z.owner

  Elemwise(add,no_inplace)(x,y)

  通过Apply节点的inputs和outputs域来获取表达式的所有输入符号变量和所有输出符号变量:

  >>>z.owner.inputs

  [x,y]

  >>>z.owner.outputs

  [Elemwise{add,no_inplace}.0]

  上述示例中,表达式是两个矩阵相加,形式比较简单,但对于复杂的表达式或函数,要画出完整的符号计算图是非常困难的。因此,Theano支持把计算图打印到终端或打印到外部文件。打印符号计算图之前需要先对printing模块进行定义。

  有两种模式可以将计算图打印到终端:pp模式和debugprint模式。pp模式的输出结果简洁紧凑,类似于数学表达式;debug print模式的输出更加详细,但相对繁琐。以前文中提到的z=x+y为例,分别用pp模式和debugprint模式来查看z的结果,具体如下所示。

  >>>theano.printing.pprint(z)

  '(x+y)'

  >>>theano.printing.debugprint(z)

  Elemwise{add,no_inplace}[id A] ' '

  |x [id B]

  |y [id C]

  学习Python开发,可以参考千锋推出的Python学习路线,该学习路线对从零基础小白到Python初级开发工程师,Python高级开发工程师,后面的Python大神级数据分析师都有一个明确清晰的指导,结合千锋全套Python视频教程,可以让你对学习Python需要掌握的知识有个清晰的了解,并快速入门Python开发

  • 北京天丰利校区(总部)地址:北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼2、3层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 深圳西部硅谷校区地址:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619
    深圳大学城校区地址:深圳市南山区留仙大道1201号大学城创客小镇16栋3楼
    咨询电话: 0755-23015275/23015546-801(硅谷) 0755-86660670-801(大学城)
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990 021-65233829-609
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 郑州校区地址:郑州市二七区航海中路60号海为科技园C区10层、12层
    咨询电话:0371-55191750
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 广州校区地址:广州市天河区元岗路200号慧通产业园B9三层
    咨询电话:020-38035223 020-38035220
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 武汉金融港校区地址:武汉市东湖高新技术开发区光谷大道77号金融港B18栋3楼
    武汉智慧园校区地址:武汉市东湖高新技术开发区光谷大道61号智慧园21栋2楼
    咨询电话:027-59313371
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、360网络安全、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训
  • 成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    咨询电话:400-811-9990 028-83178771
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85363390
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 杭州旺田校区:浙江省杭州市江干区九堡旺田书画城A座4层
    杭州龙驰校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层
    咨询电话:400-811-9990 0571-86893632/0571-86094032
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 青岛校区地址:青岛市市北区龙城路卓越世纪中心3号楼8层801
    咨询电话:0532-80911190
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 重庆校区地址:重庆市高新区科园一路2号大西洋国际12-1
    咨询电话:400-811-9990 023-68883009
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:0731-85513210
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 哈尔滨校区地址:哈尔滨市松北区创新一路699号 科技创新城19号楼B座五楼
    咨询电话:400-811-9990/0451-87173191
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 南京校区地址:南京市建邺区应天大街780号应天智汇产业园弘辉园1幢2楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱