numpy乘形状数组(20L,),(20L,)会产生广播错误?

时间:2017-03-22 16:47:19

标签: python numpy python-2.x numpy-broadcasting

我有两个数组,打印输出声明的大小都相同((20L,))。我想在元素方面将它们相乘。使用A*Bnp.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循环中(因此ij索引)。 self.HidNumlearning_rateself.HidDim都是非零正整数。

  • self.WHLayers是一个矩阵列表
  • self.BHid是一个向量列表
  • self.WHidback是一个矩阵列表
  • forward_pass是一个列表,其中每个内部列表包含三个对象:list of ndarrayssingle 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

0 个答案:

没有答案