使用 Theano 扫描功能进行简单累加的问题

Troubles with simple accumulation with Theano scan function

我正在尝试在乘以步长时累加矩阵值: res = sum_i(i * a)。我的代码如下所示:

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]]]

输出是正确的(也许不足为奇?)。您得到此输出的原因如下:

在第一次迭代中,

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.

的元素相乘结果矩阵相同的形状