关于 theano.scan函数一些简单的应用只包括fn ,sequences 和outputs_info 。自己通过实验总结的不一定对 后期更正……
1) 只有一个序列 和 只有一个循环中更新的数
__author__ = 'Administrator'
import theano
import theano.tensor as T
A = T.vector("A")
B = T.vector("B")
def step(a,b):
return 2*b, a - b
[result_mul,result_test],updates=theano.scan(step,sequences=[A],outputs_info = [2.,None])
result_mul = theano.function([A],[result_mul,result_test])
m = result_mul([4,2,1,1])
print m
print result_mul([1,4,2,3]) ##test
输出为:(注意返回值包含两个元素)
[array([ 4., 8., 16., 32.], dtype=float32),array([ 2., -2., -7., -15.], dtype=float32)]
[array([ 4., 8., 16., 32.], dtype=float32),array([ -1., 0., -6., -13.], dtype=float32)]
结论:outputs_info 中的2 为step中b的初始值,sequences中每个元素一次执行 b的更新为return的第一个返回值代替b ,step函数中第一个参数a表示sequences中的元素
这种情况是比较常用的
2) 多个序列 和只有一个循环中更新的数
__author__ = 'Administrator' import theano import theano.tensor as T A = T.vector("A") B = T.vector("B") def step(a,b,c): return 2*b, a - c [result_mul,result_test],updates=theano.scan(step,sequences=[A,B],outputs_info = [2.,None]) result_mul = theano.function([A,B],[result_mul,result_test]) m = result_mul([4,2,1,1],[1,2,3,4]) print m
输出为:
[array([ 2., 4., 6., 8.], dtype=float32), array([ 2., 0., -3., -5.], dtype=float32)]
这个就比较明确了: step函数中前两个参数分别表示两个序列, outputs_info 中的2 就为初始的step中的c的值。
另外两个序列都是依次往后取元素直到一个序列取完停止。 意思是两个序列可以不等长, 但是长序列中长出来的序列不执行。 依旧是return中的第一个返回值更新c的值……
3) 单序列 多循环更新数
__author__ = 'Administrator' import theano import theano.tensor as T A = T.vector("A") B = T.vector("B") def step(a,c,d): return a + c, a + d [result_mul,result_test],updates=theano.scan(step,sequences=[A],outputs_info = [2.,1.]) result_mul = theano.function([A],[result_mul,result_test]) m = result_mul([4,2,1,1]) print m
输出为:[array([ 6., 8., 9., 10.], dtype=float32), array([5., 7., 8., 9.], dtype=float32)]
Outputs_info中的[2,1]分别为c,d的初始值 a为序列的元素值return的前两个表示c,d 的每次的更新值
4) 多个序列 和 多个需要更新的数
__author__ = 'Administrator' import theano import theano.tensor as T A = T.vector("A") B = T.vector("B") def step(a,b,c,d): return a + c, b + d [result_mul,result_test],updates=theano.scan(step,sequences=[A,B],outputs_info = [2.,1.]) result_mul = theano.function([A,B],[result_mul,result_test]) m = result_mul([4,2,1,1],[1,2,3,4]) print m
输出为:
[array([ 6., 8., 9., 10.], dtype=float32), array([ 2., 4., 7., 11.], dtype=float32)]
Return返回值的前两个表示更新的两个数c,d。