为什么调用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
在进行 np.multiply 运算时,两个矩阵的维度需要完全匹配,否则会报错。在你的代码中,报错信息说明了两个矩阵的形状分别为 (100,32) 和 (100,16),因此无法进行 np.multiply 运算。这个错误信息说明了两个矩阵的第二个维度不同,因此无法匹配。
在这种情况下,你需要手动调整代码,以确保两个矩阵的形状匹配。可以考虑在 ReLU 层之前添加一个全连接层,将输入的维度从 16 扩展到 32。这样,在 ReLU 层之后,两个矩阵的形状就会完全匹配,就可以进行 np.multiply 运算了。如果你不想添加额外的层,也可以手动调整代码,以确保两个矩阵的形状匹配,比如通过对其中一个矩阵进行切片操作,以保证其维度和另一个矩阵相同。 看一下可广播的条件:https://numpy.org/doc/stable/user/basics.broadcasting.html#general-broadcasting-rules
简单的说,双方的 shape 从右向左看,对应位置上的值必须或者相等或者其中一方是 1 才能广播
您的情况是 (100, 32) 和 (100, 16),最右边的 32 和 16 既不相等也没有任何一个是 1,因此无法广播 然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该和输入的形状完全一致,这部分看不出问题,也检查一下其他部分吧 dolly_yos2 发表于 2023-2-25 13:43
然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该 ...
好吧,是建立模型的时候有一个地方写错了
页:
[1]