Theano.Tensor.Sum 函数有什么问题?
What is wrong in Theano.Tensor.Sum function?
我正在尝试在 Theano 中实现一个新节点,为了测试每一步,我将所有内容都放在一边并测试输出结果。这些步骤之一是在二维中测试 sum 函数。第一维的输出很好,但是当我应用第二维时,结果很奇怪。我将输出与 Numpy 进行了比较。请查看下面的代码和结果。
我做了另一个实验,所以我将把它分成两个问题:
第一个问题:
arr = np.ones((2, 100, 100)).astype(np.float32)
x = T.ftensor3('x')
tester = T.sum(x)
tester2k = T.sum(x, axis=2)
s1 = theano.function([x], tester)
s2k = theano.function([x], tester2k)
print s1(arr)
print s2k(arr)
The first gives 5625 instead of 20000
The second gives 30 instead of 100
[30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.
30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.
30...................
第二题
arr = np.array([[[.1,.2],[.3,.4]],[[.2,.5],[.6,.7]],[[.2,.6],[.7,.4]]]).astype(np.float32)
x = T.ftensor3('x')
y = T.max(x)
z2 = T.sum(T.exp(x), axis=(2,1))
tester1 = T.exp(x)
tester2 = T.sum(tester1, axis=2)
tester3 = T.sum(tester2, axis=1)
s1 = theano.function([x], tester1)
s2 = theano.function([x], tester2)
s3 = theano.function([x], tester3)
final = theano.function([x], z2)
firstValue = s1(arr)
print firstValue
print "\n"
secValue = s2(arr)
print secValue
print "\n"
thirdValue = s3(arr)
print thirdValue
print '\n'
print final(arr)
print "-----------------\n"
print firstValue[0,:,:]
print "\n"
# print firstValue[0,:,:].sum()
firstSum = np.sum(firstValue, axis=2)
print firstSum
print np.sum(firstSum, axis=1)
这是输出。
[[[ 1.10517097 1.22140276]
[ 1.34985888 1.49182475]]
[[ 1.22140276 1.64872122]
[ 1.82211888 2.01375294]]
[[ 1.22140276 1.82211888]
[ 2.01375294 1.49182475]]]
[[ 2.32657385 2.84168363]
[ 2.87012386 3.8358717 ]
[ 3.04352164 3.50557756]]
[ 3.67643261 4.69224262 5.05727482]
[ 3.67643261 4.69224262 5.05727482]
-----------------
[[ 1.10517097 1.22140276]
[ 1.34985888 1.49182475]]
[[ 2.32657385 2.84168363]
[ 2.87012386 3.8358717 ]
[ 3.04352164 3.50557756]]
[ 5.16825771 6.70599556 6.54909897]
AS 你可以看到轴 = 2 的第一个维度得到正确求和的结果,但是当我对轴 1 求和时,结果不匹配任何数字。我用 2 然后用 1 测试了两次求和,并通过给出两个轴 (2,1) 来测试函数。
更新:
第一个问题,结果不代表真实值
第二个问题,当按顺序使用 keepdims=True
应用求和函数时,结果总结得很好,但是当使用一个函数给出两个轴 (1,2) 即使 keepdims=True
结果是错误的。
该问题与Theano.0.10以下版本有关,更新后问题解决。如果有人面临同样的问题。
我正在尝试在 Theano 中实现一个新节点,为了测试每一步,我将所有内容都放在一边并测试输出结果。这些步骤之一是在二维中测试 sum 函数。第一维的输出很好,但是当我应用第二维时,结果很奇怪。我将输出与 Numpy 进行了比较。请查看下面的代码和结果。
我做了另一个实验,所以我将把它分成两个问题:
第一个问题:
arr = np.ones((2, 100, 100)).astype(np.float32) x = T.ftensor3('x') tester = T.sum(x) tester2k = T.sum(x, axis=2) s1 = theano.function([x], tester) s2k = theano.function([x], tester2k) print s1(arr) print s2k(arr) The first gives 5625 instead of 20000 The second gives 30 instead of 100 [30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30...................
第二题
arr = np.array([[[.1,.2],[.3,.4]],[[.2,.5],[.6,.7]],[[.2,.6],[.7,.4]]]).astype(np.float32) x = T.ftensor3('x') y = T.max(x) z2 = T.sum(T.exp(x), axis=(2,1)) tester1 = T.exp(x) tester2 = T.sum(tester1, axis=2) tester3 = T.sum(tester2, axis=1) s1 = theano.function([x], tester1) s2 = theano.function([x], tester2) s3 = theano.function([x], tester3) final = theano.function([x], z2) firstValue = s1(arr) print firstValue print "\n" secValue = s2(arr) print secValue print "\n" thirdValue = s3(arr) print thirdValue print '\n' print final(arr) print "-----------------\n" print firstValue[0,:,:] print "\n" # print firstValue[0,:,:].sum() firstSum = np.sum(firstValue, axis=2) print firstSum print np.sum(firstSum, axis=1)
这是输出。
[[[ 1.10517097 1.22140276] [ 1.34985888 1.49182475]] [[ 1.22140276 1.64872122] [ 1.82211888 2.01375294]] [[ 1.22140276 1.82211888] [ 2.01375294 1.49182475]]] [[ 2.32657385 2.84168363] [ 2.87012386 3.8358717 ] [ 3.04352164 3.50557756]] [ 3.67643261 4.69224262 5.05727482] [ 3.67643261 4.69224262 5.05727482] ----------------- [[ 1.10517097 1.22140276] [ 1.34985888 1.49182475]] [[ 2.32657385 2.84168363] [ 2.87012386 3.8358717 ] [ 3.04352164 3.50557756]] [ 5.16825771 6.70599556 6.54909897]
AS 你可以看到轴 = 2 的第一个维度得到正确求和的结果,但是当我对轴 1 求和时,结果不匹配任何数字。我用 2 然后用 1 测试了两次求和,并通过给出两个轴 (2,1) 来测试函数。
更新:
第一个问题,结果不代表真实值
第二个问题,当按顺序使用 keepdims=True
应用求和函数时,结果总结得很好,但是当使用一个函数给出两个轴 (1,2) 即使 keepdims=True
结果是错误的。
该问题与Theano.0.10以下版本有关,更新后问题解决。如果有人面临同样的问题。