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

400-811-9990
当前位置:千锋视频教程 >  python视频教程  >  千锋Python视频教程之Theano中的循环

千锋Python视频教程之Theano中的循环

时间:2018-09-11 16:02     来源:千锋教育 作者:千锋Python

  循环是程序语言中重要的模块之一,Theano的循环操作使用scan模块来实现。scan模块类似于Python的for语句,接下来,本节将对Theano中的循环语句进行讲解(由于scan的参数众多,本书将只对几个相对重要的参数进行讲解,其他参数可以通过访问theano官方文档进一步了解)。

  scan循环的参数

  scan循环的参数有很多,本书仅对以下几个主要参数进行讲解:sequences,outputs_info,non_sequences,fn,n_steps,truncate_gradient,strict。

  1.sequences

  sequences是一个由Theano变量或字典构成的列表,他们的值将作为参数传递给函数fn。列表中的每一个元素都是一个序列,每一次迭代可以传递序列的一个元素或多个元素,具体示例代码如下所示。

  >>> theano.scan(……,

  sequences=[dict(input=sequence1,taps=[-1,-2]),

  sequences2,

  dict(input=sequence3,taps = 3)],

  ……)

  上述代码的sequences参数包含了以下三个参数:sequence1、sequence2、sequence3三个输入序列。

  sequence1:通常以字典的形式表示,字典中可以包括input(输入序列)和taps(索引)两个key值。上述代码表示在第t次迭代时,sequence1传递给fn的参数有sequence1[t-1]和sequence1[t-2]。

  sequence2:以普通的Theano变量形式传递,该参数等价于下列代码。

  dict(input = squence2,taps=[0])

  当忽略taps参数时,Theano会默认taps的值为0,因此,在第t次迭代时,sequence2传递给fn的参数为sequence2[t]。

  sequence3:结合前两个参数的传递过程可以看出,在第t次迭代时,sequence3传递给fn的参数为sequence3[t+3]。

  2.outputs_info

  与sequences的表达相似,outputs_info也是一个由Theano变量或字典构成的列表,列表中的每一个元素是函数fn的输出结果的初始值,具体示例如下所示。

  >>>theano.scan(……,

  outputs_info = [ dict(initial = output1, taps = [-3,-5]),

  output2,

  dict(initial = output 3,taps = 3)]

  ……)

  上述代码的sequences参数包含了以下三个参数:output1,output2,output3

  output1:以字典的形式进行表示。用字典形式表示outputs_info时,可以包括initial(定义初始值)和taps(索引)两个key值。表示在第t次迭代时,output1传递给fn的参数为output1[t-3]和output1[t-5]。

  output2:以普通的Theano变量形式传递,该参数等价于下列代码。

  dict(initial = output2,taps=[-1])

  与前面提到的sequence2情况一样,在忽略taps的值时,系统会为taps自动添加默认值,但是要注意,这里的taps默认值为-1。表示在第t次迭代时,output2传递给fn的参数为output2[t-1]。

  output3:结合前两个参数的传递过程可以看出,output3表示在第t次迭代时,传递给fn的参数为sequence3[t+3]。

  3.non_sequences

  该参数是一个不变量或常数值列表,与前两个参数不同,该参数在迭代过程中不可改变。在实际应用中,一般把该参数设置为模型的权重参数列表。

  4.fn

  该参数是一个函数,fn是scan最核心的组成部分,它定义了每一次循环的处理逻辑,可以返回sequences变量的更新updates。fn既可以用lambda匿名函数来表示,也可以通过自定义函数表示。fn对函数参数的定义顺序和函数输出有严格对应的要求,输入变量顺序为sequences中的变量,outputs_info的变量,non_sequences中的变量。

  5.n_steps

  用来指定scan的迭代次数。sequences与n_steps两个参数中至少存在一个,否则scan无法知道迭代的步数。

  6.truncate_gradient

  这是一个专为循环神经网络训练设计的参数。利用scan来实现BPTT时,truncate_gradient用于指定向前传播的步长值,当值为-1时,表示采用的是传统的BPTT算法;当值大于0时,表示向前执行步长达到truncate_gradient设定值时,会提前结束并返回。这种截断策略可以用于处理传统的BPTT中的梯度消失问题。

  7.strict

  当该参数的值为True时,必须保证所有用到的Theano共享变量都放置在non_sequences参数中。

  scan循环演示

  一般情况下,一个for循环可以表示成一个scan()操作,而且scan是与theano的循环联系最紧密的。使用scan而不是for循环的优势:

  迭代的次数是符号graph的一部分。

  最小化GPU的迁移(如果用到GPU的话)。

  通过连续的步骤计算梯度。

  比python中使用theano编译后的for循环稍微快一点。

  通过检测实际用到的内存的数量,来降低总的内存使用情况。

  接下来通过几个案例来帮助理解scan的使用方法。

  以逐元素计算为例,通过scan循环演示计算A的k次方。

  import theano

  import theano.tensor as T

  k = T.iscalar('k')

  A = T.vector('A')

  outputs, updates = theano.scan(lambda result, A : result * A,

  non_sequences = A,

  outputs_info=T.ones_like(A), n_steps = k)

  result = outputs [-1]

  fn_Ak = theano.function([A,k], result, updates=updates)

  print(fn_Ak(range(10), 2))

  运行结果如下所示。

  [ 0. 1. 4. 9. 16. 25. 36. 49. 64. 81.]

  上述程序中outputs_info初始化为于A大小相同的全1向量,匿名函数(lambda)的输入依次为outputs_info和non_sequences,分别对应于匿名函数的输入result和A。由于scan函数的输出结果会记录每次迭代fn的输出,result = outputs [-1]表示Theano只需要取最后一次迭代结果,Theano也会对此做相应的优化(不保存中间迭代结果)。

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

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

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

  • 千锋教育移动站

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

  • 千锋互联服务号

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