RuntimeError: expected scalar type Half but found Float

在尝试将CCNet的十字交叉注意力模块移植到YOLOv5的过程中,作者遇到了CUDA和CuPy类型不匹配的问题,导致训练时出现错误。问题出现在torch.bmm()函数的矩阵乘法运算中,由于两个输入数据的类型不同,引发了冲突。为了解决这个问题,作者采取了使用to()方法将数据类型统一为另一数据的类型,从而成功避免了冲突。修复后的代码在验证阶段运行正常。
部署运行你感兴趣的模型镜像

起因:将CCNet的十字交叉注意力模块移植到YOLOv5中。

经过:在注意力模块中,会有较多的矩阵运算,在训练时出现了cuda和cup类型的冲突(另一篇我写的文章);而在验证时出现了上述错误。

出错的代码如下:

        # [b1*w1, c1, h1] -> [b1, w1, c1, h1] -> [b1, c1, h1, w1]
        out_H = torch.bmm(value_H, att_H.permute(0, 2, 1)).view(b1, w1, -1, h1).permute(0, 2, 3, 1)
        # [b1 * h1, c1, w1] -> [b1, h1, c1, w1] -> [b1, c1, h1, w1]
        out_W = torch.bmm(value_W, att_W.permute(0, 2, 1)).view(b1, h1, -1, w1).permute(0, 2, 1, 3)

出错的位置在torch.bmm()处,在这里进行了一次矩阵乘法运算。由于两个数据的类型不同,因此发生冲突。

解决方案:仍然是用to()方法,修改数据类型为另一个数据的类型。

        # [b1*w1, c1, h1] -> [b1, w1, c1, h1] -> [b1, c1, h1, w1]
        out_H = torch.bmm(value_H, att_H.permute(0, 2, 1).to(value_H.dtype)).view(b1, w1, -1, h1).permute(0, 2, 3, 1)
        # [b1 * h1, c1, w1] -> [b1, h1, c1, w1] -> [b1, c1, h1, w1]
        out_W = torch.bmm(value_W, att_W.permute(0, 2, 1).to(value_W.dtype)).view(b1, h1, -1, w1).permute(0, 2, 1, 3)

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值