RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0

记录一下遇到的改进网络模型时的错误。

起因:将CCNet的十字交叉注意力模块加入YOLOv5中,在写代码时,有部分方法用到了.cuda()这个方法来返回一个临时数据。YOLOv5在构建模型时,会跑一遍模型,此时数据类型是cpu类型的,当与cuda类型的临时数据进行计算时,自然会发生冲突。如果直接去掉.cuda()方法,临时数据变为cpu类型;虽然可以在第一次构建模型时不发生冲突,但是实际训练的时候,传入的数据是cuda类型的,因此会再次发生冲突。

解决方案:在传入的数据和临时数据计算之前,先将临时数据的类型转换为传入数据的类型就可以了。

def INF(B, H, W):
    return -torch.diag(torch.tensor(float("inf")).repeat(H), 0).unsqueeze(0).repeat(B * W, 1, 1)
    # return -torch.diag(torch.tensor(float("inf")).cuda().repeat(H), 0).unsqueeze(0).repeat(B * W, 1, 1)

......


energy_H = (torch.bmm(query_H, key_H) + self.INF(b2, h1, w1).to(query_H.device)).view(b2, w1, h1, h1).permute(0, 2, 1, 3)

如上面的代码所示,解决类型冲突的方法,就是令self.INF().to(传入数据.device)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值