当前位置:   article > 正文

RuntimeError: expected scalar type Half but found Float

runtimeerror: expected scalar type half but found float

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

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

出错的代码如下:

  1. # [b1*w1, c1, h1] -> [b1, w1, c1, h1] -> [b1, c1, h1, w1]
  2. out_H = torch.bmm(value_H, att_H.permute(0, 2, 1)).view(b1, w1, -1, h1).permute(0, 2, 3, 1)
  3. # [b1 * h1, c1, w1] -> [b1, h1, c1, w1] -> [b1, c1, h1, w1]
  4. 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()方法,修改数据类型为另一个数据的类型。

  1. # [b1*w1, c1, h1] -> [b1, w1, c1, h1] -> [b1, c1, h1, w1]
  2. 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)
  3. # [b1 * h1, c1, w1] -> [b1, h1, c1, w1] -> [b1, c1, h1, w1]
  4. 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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/649851
推荐阅读
相关标签
  

闽ICP备14008679号