鱼C论坛

 找回密码
 立即注册
查看: 2788|回复: 4

[已解决]为什么调用np.multiply函数时总会广播失败呢?

[复制链接]
发表于 2023-2-25 12:36:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在建立一个三层的神经网络,其中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[b>0] =1
        b[b<0] = 0
        bottom_diff = np.multiply(b,top_diff)
        return bottom_diff
最佳答案
2023-2-25 13:43:14
然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该和输入的形状完全一致,这部分看不出问题,也检查一下其他部分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-25 12:46:37 | 显示全部楼层
在进行 np.multiply 运算时,两个矩阵的维度需要完全匹配,否则会报错。在你的代码中,报错信息说明了两个矩阵的形状分别为 (100,32) 和 (100,16),因此无法进行 np.multiply 运算。这个错误信息说明了两个矩阵的第二个维度不同,因此无法匹配。

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

使用道具 举报

发表于 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,因此无法广播
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-25 13:43:14 | 显示全部楼层    本楼为最佳答案   
然而我推测问题的根本应该不在这里。怀疑您在其他部分对梯度的计算出了问题
ReLU 接收的回传梯度形状应该和输入的形状完全一致,这部分看不出问题,也检查一下其他部分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧,是建立模型的时候有一个地方写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表