2015-11-02 57 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')最後是非序列。 –