YOLOv7训练时报错TypeError: No loop matching...,求修复方法
解决YOLOv7训练时的
TypeError: No loop matching the specified signature and casting was found for ufunc greater错误 错误场景
运行YOLOv7训练命令时触发该错误:
python train.py --workers 0 --weights yolov7_training.pt --data data\plane.yaml --batch-size 4 --device 0 --img 640 640 --name yolov7-plane --hyp data\hyp.scratch.custom.yaml --epochs 200 --cfg cfg\training\yolov7-plane.yaml
错误回溯指向TensorBoard的summary.py中np.greater(counts, 0, dtype=np.int32)行,本质是数据类型不兼容或numpy与TensorBoard版本冲突导致的ufunc运算失败。
修复方案
方案1:临时禁用类别直方图记录(最快解决)
直接修改train.py第268行,注释或删除TensorBoard的类别直方图添加代码:
# tb_writer.add_histogram('classes', c, 0) # 注释掉该行
此方法不影响训练流程,仅取消类别分布的TensorBoard可视化记录。
方案2:修复numpy与TensorBoard版本兼容问题
- 降级numpy版本:numpy 1.24+与部分旧版TensorBoard存在兼容性问题,执行以下命令降级到稳定兼容版本:
pip install numpy==1.23.5
- 或修改TensorBoard源码:找到
C:\Users\yildi\anaconda3\envs\yolov7-gpu-env\lib\site-packages\torch\utils\tensorboard\summary.py文件,将第386行的:
cum_counts = np.cumsum(np.greater(counts, 0, dtype=np.int32))
修改为:
cum_counts = np.cumsum(np.greater(counts.astype(np.int32), 0))
先将counts强制转换为int32类型,再执行比较运算,避免类型不匹配。
方案3:检查数据集合法性
确认数据集配置文件(plane.yaml)中的类别数量与标注文件中的类别ID完全匹配:
- 确保yaml中
nc参数值等于实际类别数 - 标注文件中的类别ID未超出
0~nc-1的范围
异常的类别ID会导致类别张量c的数据异常,进而触发直方图生成错误。
内容的提问来源于stack exchange,提问作者KAAN YILDIZ
相关产品推荐
相关产品推荐

