Traceback (most recent call last): File "D:\codeworkspace\project6\yolov5\train.py", line 643, in <module> main(opt) File "D:\codeworkspace\project6\yolov5\train.py", line 539, in main train(opt.hyp, opt, device, callbacks) File "D:\codeworkspace\project6\yolov5\train.py", line 331, in train loss, loss_items = compute_loss(pred, targets.to(device)) # loss scaled by batch_size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\codeworkspace\project6\yolov5\utils\loss.py", line 125, in __call__ tcls, tbox, indices, anchors = self.build_targets(p, targets) # targets ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\codeworkspace\project6\yolov5\utils\loss.py", line 223, in build_targets indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1))) # image, anchor, grid indices ^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: result type Float can't be cast to the desired output type __int64
时间: 2025-05-25 13:58:10 浏览: 19
### YOLOv5 训练过程中 `RuntimeError` 错误解决方案
在运行 YOLOv5 的训练代码时,如果遇到错误提示 `'result type Float can’t be cast to the desired output type __int64'`,这通常是因为 PyTorch 版本更新后引入了更严格的类型转换规则。旧版本的 PyTorch 可能会隐式地处理浮点数到整型的转换,而较新的版本则不再支持这种隐式的强制类型转换。
#### 问题分析
该错误的核心在于某些张量操作试图将浮点类型的张量 (`float`) 转换为整型张量 (`int64`),但在当前使用的 PyTorch 版本中未被允许。具体来说,在损失函数计算部分 (位于 `utils/loss.py`) 中存在如下代码片段:
```python
gain = torch.ones(7, device=targets.device)
```
这段代码创建了一个全为 1 的张量,默认数据类型为 `torch.float32`。然而后续的操作可能期望其为整型张量 (`torch.int64`),从而引发上述错误。
---
#### 解决方案
为了修复这个问题,可以通过显式指定张量的数据类型来避免类型不匹配的情况。以下是具体的解决方法:
1. **修改 `utils/loss.py` 文件中的代码**
找到并定位以下代码行:
```python
gain = torch.ones(7, device=targets.device)
```
将其替换为以下内容:
```python
gain = torch.ones(7, device=targets.device).long()
```
这里通过调用 `.long()` 方法将张量的数据类型从默认的 `float32` 显式转换为 `int64`[^2]。
2. **验证更改后的效果**
修改完成后重新启动训练过程。如果问题仅由这一处引起,则应该不会再出现类似的 `RuntimeError` 提示。
---
#### 注意事项
- 如果仍然存在问题,请确认是否有其他地方也涉及类似的数据类型转换逻辑。例如,检查整个项目中是否存在其他需要显式类型转换的地方。
- 此外,建议升级或降级 PyTorch 至兼容版本以减少潜在冲突。对于 YOLOv5 来说,官方推荐的 PyTorch 版本通常是经过测试的最佳选择。可以尝试安装特定版本的 PyTorch(如 v1.8 或更高),并通过以下命令完成安装:
```bash
pip install torch==1.9.0 torchvision==0.10.0 torchaudio===0.9.0 --extra-index-url https://download.pytorch.org/whl/cu111
```
---
#### 总结
通过对 `utils/loss.py` 文件中相关代码进行调整,并确保所有必要的张量都具有正确的数据类型,能够有效解决因类型转换引起的 `RuntimeError` 错误。此外,保持依赖库版本的一致性和最新状态也是预防此类问题的重要手段之一。
---
阅读全文
相关推荐

















