Python-Theano scan()函数
我无法完全理解theano.scan()的行为 下面是一个例子:Python-Theano scan()函数,python,theano,Python,Theano,我无法完全理解theano.scan()的行为 下面是一个例子: import numpy as np import theano import theano.tensor as T def addf(a1,a2): return a1+a2 i = T.iscalar('i') x0 = T.ivector('x0') step= T.iscalar('step') results, updates = theano.scan(fn=addf,
import numpy as np
import theano
import theano.tensor as T
def addf(a1,a2):
return a1+a2
i = T.iscalar('i')
x0 = T.ivector('x0')
step= T.iscalar('step')
results, updates = theano.scan(fn=addf,
outputs_info=[{'initial':x0, 'taps':[-2]}],
non_sequences=step,
n_steps=i)
f=theano.function([x0,i,step],results)
print f([1,1],10,2)
上面的代码段打印了以下顺序,这是完全合理的:
[ 3 3 5 5 7 7 9 9 11 11]
但是,如果我将抽头索引从-2切换到-1,即
outputs_info=[{'initial':x0, 'taps':[-1]}]
结果是:
[[ 3 3]
[ 5 5]
[ 7 7]
[ 9 9]
[11 11]
[13 13]
[15 15]
[17 17]
[19 19]
[21 21]]
而不是我认为合理的(只需取向量的最后一个值并加2):
任何帮助都将不胜感激
谢谢 使用taps=[-1]时,假设输出信息中的信息按原样使用。这意味着addf函数将以向量和非_序列作为输入调用。如果将x0转换为标量,它将按预期工作:
import numpy as np
import theano
import theano.tensor as T
def addf(a1,a2):
print a1.type
print a2.type
return a1+a2
i = T.iscalar('i')
x0 = T.iscalar('x0')
step= T.iscalar('step')
results, updates = theano.scan(fn=addf,
outputs_info=[{'initial':x0, 'taps':[-1]}],
non_sequences=step,
n_steps=i)
f=theano.function([x0,i,step],results)
print f(1,10,2)
这将提供以下输出:
TensorType(int32, scalar)
TensorType(int32, scalar)
[ 3 5 7 9 11 13 15 17 19 21]
在您的例子中,与addf(vector,scalar)一样,它广播elemwise值
以另一种方式解释,如果抽头为[-1],x0将“按原样”传递给内部函数。如果抽头包含任何其他内容,则传递给内部函数的内容的维数将小于x0,因为x0必须提供许多初始步长值(-2和-1)
TensorType(int32, scalar)
TensorType(int32, scalar)
[ 3 5 7 9 11 13 15 17 19 21]