"numpy对维度为(20L,)、(20L,)的数组进行乘法会导致广播错误吗?"

2024-09-30 18:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组,打印输出声明它们的大小都相同((20L,))。我想把它们按元素相乘。使用A*Bnp.multiply(A,B)给出相同的错误:

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) *\
        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 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中。你知道吗


Tags: inself列表forratelineupdatepass