theano.scan()
scan是Theano中迭代的一般形式,所以可以用于类似循环(looping)的场景。 函数scan的输入也是一些序列(一维数组,或者多维数组,以第一维为leading dimension),将某个函数作用于输入序列上,得到每一步输出的结果。
Reduction和map都是scan的特殊形式,即将某函数依次作用一个序列的每个元素上。但scan在计算的时候,可以访问以前n步的输出结果,所以比较适合RNN网络。
result,updates = theano.scan(fn = lambda y, p, x_2, x_1,A: y+p+x_2+x_1+A, sequences=[Y, P], outputs_info=[dict(initial=X, taps=[-2, -1])]), non_sequences=A,no_steps=n)
- 参数fn是一个你需要计算的函数,函数可以在外部定义好,也可以在内部再定义.在内部在定义的fn一般用lambda来定义需要用到的参数,在外部就def好的函数,fn直接函数名即可。
- sequences就是需要迭代的序列(输入序列),它的值将会传给fn作为前面的参数。如果在output_info里有initial,那这个参数可以省略。
- outputs_info描述了需要用到的初始化值,以及是否需要用到前几次迭代输出的结果,dict(initial=X, taps=[-2, -1])表示使用序列x作为初始化值,taps表示会用到前一次和前两次输出的结果。如果当前迭代输出为x(t),则计算中使用了(x(t-1)和x(t-2)。 官网解释为:Initialization occurs in
outputs_info。(输出在起始的状态)
- non_sequences描述了非序列的输入(参数),它的值传给fn后面的参数,且每次迭代的A都是不变的。官网解释为:Unchanging variables are passed to scan as
non_sequences。
- n_steps描述了迭代的次数。
scan是Theano中迭代的一般形式,所以可以用于类似循环(looping)的场景。 函数scan的输入也是一些序列(一维数组,或者多维数组,以第一维为leading dimension),将某个函数作用于输入序列上,得到每一步输出的结果。
Reduction和map都是scan的特殊形式,即将某函数依次作用一个序列的每个元素上。但scan在计算的时候,可以访问以前n步的输出结果,所以比较适合RNN网络。