2014-11-03 70 views
9

我不能完全理解theano.scan()的行为。Python - Theano扫描()函数

下面是一个例子:

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):

[ 3 5 7 9 11 13 15 17 19 21] 

任何帮助将非常感激。

谢谢!

回答

10

当您使用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(向量,标量),它广播elemwise值。

另一种解释是,如果tap是[-1],x0将按原样传递给内部函数。如果水龙头包含其他任何东西,传递给内部函数的内容将比X0小1,因为x0必须提供许多初始步骤值(-2和-1)。