2015-11-02 63 views
1

我正在尝试累积矩阵值,并与步骤相乘: res = sum_i(i * a)。我的代码如下所示:使用Theano扫描功能进行简单累加时遇到的问题

import numpy as np 
from theano import function, scan 
import theano.tensor as T 

x = T.lmatrix() 
results, updates = scan(
    lambda res, step, x: res + step * x, 
    non_sequences=x, 
    sequences=T.arange(2), 
    outputs_info=T.zeros_like(x)) 

f = function([x], results) 
a = np.array([[0, 0], [2, 2]], 'int64') 
print(f(a)) 

此输出:

[[[0 0] 
    [0 0]] 

[[1 1] 
[1 1]]] 

尽管我希望这样的:

[[[0 0] 
    [0 0]] 

[[0 0] 
[2 2]]] 
+0

我已经提供了一个答案,解释了为什么你会得到你实际得到的输出,但不能评论为什么你的期望不同,因为它不清楚*你为什么期望输出[[[[0 0] [ 0 0]] [[0 0] [2 2]]]'。如果您通过更多关于期望的信息来更新问题,我可能会更新我的答案并提供更多信息。 –

回答

1

输出是(或许令人吃惊?)是正确的。你得到这个输出的原因如下:

在第一次迭代,

res = 0 
step = [[0, 0], [0, 0]] 
x = [[0, 0], [2, 2]] 

res + step * x = 0 + [[0, 0], [0, 0]] * [[0, 0], [2, 2]] 
       = 0 + [[0, 0], [0, 0]] 
       = [[0, 0], [0, 0]] 

在第二次迭代,

res = 1 
step = [[0, 0], [0, 0]] 
x = [[0, 0], [2, 2]] 

res + step * x = 1 + [[0, 0], [0, 0]] * [[0, 0], [2, 2]] 
       = 1 + [[0, 0], [0, 0]] 
       = [[1, 1], [1, 1]] 

请注意,1广播的形状与stepx的元素相乘得到的矩阵相同。

+0

感谢您的洞察力。我现在明白我的错误。 lambda函数中参数的顺序与我所假设的不同。它应该是'lambda step,res,x:res + step * x' –

+1

它有助于保持传递给step函数的参数的顺序,以反映这些参数类型传递给step函数的顺序。因此,使用'scan(sequences = [...],outputs_info = [...],non_sequences = [...])“,因为step函数总是先给出序列,然后是循环值('outputs_info')最后是非序列。 –