我有两个数组,打印输出声明的大小都相同((20L,))
。我想在元素方面将它们相乘。使用A*B
或np.multiply(A,B)
会出现同样的错误:
ValueError:形状为(20,)的不可广播输出操作数与广播形状(20,20)不匹配
具体来说,我试过了:
for k in xrange(1,self.HidNum):
self.WHLayers[k-1]-=learning_rate*(\
self.WHidback[k][j].dot(forward_pass[-(i+1)][2]).reshape(self.HidDim,1)*\
(forward_pass[-(i+1)-j][0][k] * (1- forward_pass[-(i+1)-j][0][k])).reshape(self.HidDim,1) *\
forward_pass[-(i+1)-j][0][k-1]
)
self.BHid[k-1]-= learning_rate*\
self.WHidback[k][j].dot(forward_pass[-(i+1)][2].reshape(self.HidDim,1) *\
np.multiply(forward_pass[-(i+1)-j][0][k], (1 - forward_pass[-(i+1)-j][0][k])))
这给了我这个错误信息:
Traceback (most recent call last):
File "<pyshell#83>", line 1, in <module>
vectrain(bob,1)
line 178, in vectrain
cur_cost=net.update(inputs,exp_y,learning_rate)
line 105, in update
np.multiply(forward_pass[-(i+1)-j][0][k],(1 - forward_pass[-(i+1)-j][0][k])
ValueError: non-broadcastable output operand with shape (20,) doesn't match the broadcast shape (20,20)
和
for k in xrange(1,self.HidNum):
self.WHLayers[k-1]-=learning_rate*(\
self.WHidback[k][j].dot(forward_pass[-(i+1)][2]).reshape(self.HidDim,1)*\
(forward_pass[-(i+1)-j][0][k] * (1- forward_pass[-(i+1)-j][0][k])).reshape(self.HidDim,1) *\
forward_pass[-(i+1)-j][0][k-1]
)
self.BHid[k-1]-= learning_rate*\
self.WHidback[k][j].dot(forward_pass[-(i+1)][2].reshape(self.HidDim,1) *\
(forward_pass[-(i+1)-j][0][k] * (1 - forward_pass[-(i+1)-j][0][k])))
让我:
Traceback (most recent call last):
File "<pyshell#85>", line 1, in <module>
vectrain(bob,1)
line 178, in vectrain
cur_cost=net.update(inputs,exp_y,learning_rate)
line 106, in update
(1 - forward_pass[-(i+1)-j][0][k])
ValueError: non-broadcastable output operand with shape (20,) doesn't match the broadcast shape (20,20)
我列出了self.WHLayers
更新,因为它没有遇到问题,而且几乎完全一样。 self.BHid update
的最后一行是问题,如果我尽可能地分解每一行,我会遇到错误:
(1 - forward_pass[-(i+1)-j][0][k])
引用的for循环嵌套在另外两个for循环中(因此i
和j
索引)。 self.HidNum
,learning_rate
和self.HidDim
都是非零正整数。
self.WHLayers
是一个矩阵列表self.BHid
是一个向量列表self.WHidback
是一个矩阵列表forward_pass
是一个列表,其中每个内部列表包含三个对象:list of ndarrays
,single ndarray
和另一个ndarray
。在引用的for循环之前的打印输出显示
forward_pass[-(i+1)-j][0][k].shape,
(1 - forward_pass[-(i+1)-j][0][k]).shape,
(forward_pass[-(i+1)-j][0][k] *(1 - forward_pass[-(i+1)-j][0][k])).shape
都具有相同的形状:(20L,)
我不知道为什么广播形状在(20,20)
这里,而不在self.WHLayers update
。