使用 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 被广播为与 step
和 x
.
的元素相乘结果矩阵相同的形状
我正在尝试在乘以步长时累加矩阵值: 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 被广播为与 step
和 x
.