上QQ阅读APP看书,第一时间看更新
2.9.2 scan循环演示
一般情况下,一个for循环可以表示成一个scan操作,而且scan是与Theano的循环联系最紧密的。使用scan而不是for循环的优势如下:
· 迭代的次数是符号graph的一部分。
· 最小化GPU的迁移(如果用到GPU)。
· 通过连续的步骤计算梯度。
· 比Python中使用Theano编译后的for循环稍微快一点。
· 通过检测实际用到的内存的数量,来降低总的内存使用情况。
接下来通过几个案例来帮助理解scan的使用方法。
以逐元素计算为例,通过scan循环演示计算A的k次方。
运行结果如下所示。
[ 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也会对此做相应的优化(不保存中间迭代结果)。