Dogelike 发表于 2023-2-25 12:36:21

为什么调用np.multiply函数时总会广播失败呢?

在建立一个三层的神经网络,其中ReLU层反向传播需要进行一个np.multiply运算,按理说两个矩阵行数相同不是会进行自动填充吗?为什么总是报错:
ValueError: operands could not be broadcast together with shapes (100,32) (100,16)

附上代码:
class ReLULayer(object):
    def forward(self, input):# 前向传播的计算
      self.input = input
      output = np.maximum(self.input,0)
      return output
    def backward(self, top_diff):# 反向传播的计算
      b = self.input
      b =1
      b = 0
      bottom_diff = np.multiply(b,top_diff)
      return bottom_diff

isdkz 发表于 2023-2-25 12:46:37

在进行 np.multiply 运算时,两个矩阵的维度需要完全匹配,否则会报错。在你的代码中,报错信息说明了两个矩阵的形状分别为 (100,32) 和 (100,16),因此无法进行 np.multiply 运算。这个错误信息说明了两个矩阵的第二个维度不同,因此无法匹配。

在这种情况下,你需要手动调整代码,以确保两个矩阵的形状匹配。可以考虑在 ReLU 层之前添加一个全连接层,将输入的维度从 16 扩展到 32。这样,在 ReLU 层之后,两个矩阵的形状就会完全匹配,就可以进行 np.multiply 运算了。如果你不想添加额外的层,也可以手动调整代码,以确保两个矩阵的形状匹配,比如通过对其中一个矩阵进行切片操作,以保证其维度和另一个矩阵相同。

dolly_yos2 发表于 2023-2-25 13:37:57

看一下可广播的条件:https://numpy.org/doc/stable/user/basics.broadcasting.html#general-broadcasting-rules
简单的说,双方的 shape 从右向左看,对应位置上的值必须或者相等或者其中一方是 1 才能广播
您的情况是 (100, 32) 和 (100, 16),最右边的 32 和 16 既不相等也没有任何一个是 1,因此无法广播

dolly_yos2 发表于 2023-2-25 13:43:14

然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该和输入的形状完全一致,这部分看不出问题,也检查一下其他部分吧

Dogelike 发表于 2023-2-25 15:33:57

dolly_yos2 发表于 2023-2-25 13:43
然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该 ...

好吧,是建立模型的时候有一个地方写错了
页: [1]
查看完整版本: 为什么调用np.multiply函数时总会广播失败呢?