GadBaby 2024-05-06 10:10 采纳率: 0%
浏览 15

YOLOv5使用新的损失函数报错

博主,您好,最近正在看您写的YOLOv5涨点系列博文,在实现《高效涨点-Optimal Transport Assignment:OTA最优传输方法》这篇文章中的方法的时候,发现了一些问题,可以帮忙看一看嘛。
报错信息如下:

  File "F:\PythonCode\2024\DL-project\yolov5\utils\loss.py", line 325, in __call__
    tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * iou.detach().clamp(0).type(tobj.dtype)  # iou ratio
RuntimeError: shape mismatch: value tensor of shape [45, 1] cannot be broadcast to indexing result of shape [45]

仔细检查发现问题出在了这里:

img

希望博主抽时间可以帮忙看一下!感谢!

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-06 10:10
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据报错信息和代码片段,可以看出这个问题是一个形状不匹配的错误。具体来说,这是由于`tobj[b, a, gj, gi]`期望的形状是`[batch_size, num_anchors, grid_size, grid_size]`,而`iou.detach().clamp(0).type(tobj.dtype)`返回的形状是`[batch_size, num_anchors]`。这两个形状不匹配,无法广播到`tobj[b, a, gj, gi]`的形状。 解决这个问题,可以在调用`tobj[b, a, gj, gi]`之前,使用`unsqueeze()`方法来扩展张量的形状,以匹配期望形状。具体来说,可以使用以下代码解决这个问题:
    tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * iou.detach().clamp(0).unsqueeze(-1).unsqueeze(-1).type(tobj.dtype)
    

    在这个代码中,首先使用两次unsqueeze()方法将张量的形状从[batch_size, num_anchors]扩展为[batch_size, num_anchors, 1, 1],然后再将其广播到tobj[b, a, gj, gi]的形状。 另外,如果想要进一步调试这个代码,可以使用print()语句打印相关张量的形状和数值,以便更好地理解出问题的原因。 案例参考:Github issue

    评论

报告相同问题?

问题事件

  • 创建了问题 5月6日

悬赏问题

  • ¥30 不会,学习,有偿解答
  • ¥15 SQL查询语句报错(检查)
  • ¥15 此表中公式应该怎么写
  • ¥15 求HI-TECH PICC 9.50 PL3安装包
  • ¥15 下载ctorch报错,求解
  • ¥15 如何入门学习c语言,单片机
  • ¥15 idea 编辑语言的选择
  • ¥15 Windows下部署Asmjit
  • ¥15 请问双层规划模型的上下层目标函数不一致,是如何保证迭代收敛性的
  • ¥30 微信小程序 前端页面内容搜索