yolov5 v3.0版本训练报错:torch.nn.modules.module.ModuleAttributeError: 'BatchNorm2d' object has no attribute '_non_persistent_buffers_set'
文章目录:
首先说明一下我的环境:
Ubuntu
:18.04
Cuda
:10.2
Python
:3.8
Pytorch
:1.6.0
torchvision
:0.7.0
yolov5
:v3.0
1 错误问题描述
1、在使用yolov5 v3.0版本的时候,使用如下的命令进行训练
python train.py --img 640 --batch 16 --epochs 300 --data ./data/my_data.yaml --cfg ./models/yolov5l.yaml --weights ./weights/yolov5l.pt --device 1
2、然后报错:torch.nn.modules.module.ModuleAttributeError: 'BatchNorm2d' object has no attribute '_non_persistent_buffers_set'
2 错误原因分析
我在官网的issues中查看了,很多答案说是pytorch的版本问题,但是yolov5在几个月之内已经发布了三个版本了:
- yolov5 v1.0
- yolov5 v2.0
- yolov5 v3.0
至于每个版本有什么不同,大家自己去参考:yolov5 的GitHub主页
官网的issues中给出的解决方法有:
- 把pytorch的版本降低到
torch1.5.1
,我在yolov5 v3.0
中尝试不可以,yolov5 v3.0
必须torch的版本必须是torch>=1.6.0
(从提交的issues时间可以看到,用这种方法的yolov5版本应该是低于v3.0的) - 使用低版本的yolov5,例如使用
yolov5 v1.0
,然而我就是想要使用yolov5 v3.0
版本 - 官网也说这可能是
torch1.6.0中的bug
,但是并没有给出解决的方法
后面我想起来可能的问题,我在用yolov5 v3.0 中使用的预训练模型yolov5l.pt是yolov5 V1.0的中下载的,因为预训练的模型yolov5l.pt下载的比较慢,而我又比较懒,所以我把yolov5 v1.0中下载的yolov5l.pt拷贝到yolov5 v3.0中,因此出现错误:torch.nn.modules.module.ModuleAttributeError: 'BatchNorm2d' object has no attribute '_non_persistent_buffers_set'
4 解决方法
4.1 解决方法一
直接在yolov5 v3.0中重新下载一下yolov5l.pt的预训练模型
然后训练就正常了:
4.2 解决方法二
原则上,你可以简单地为每个YOLOv5模块添加一个非持久缓冲区集
来解决这个问题,但是我建议使用最新的模型
来代替。添加代码如下:
for k, m in model.named_modules():
m._non_persistent_buffers_set = set() # pytorch 1.6.0 compatability
注意:
这个方法我没有尝试,我问题已经解决了,如果你要尝试请自行尝试!
5 PS:比较开心的事情
- 我在官网的issues中描述了我的遇到的问题,大概时间:
20200825 上午11:00
- 然后大概过了
十几分钟
,官网作者glenn-jocher很快就给了我回复 - 后面给出了一些指导性的意见,就是上面的方法二(作者不建议这种方法,我也就没有尝试)
- 我在官网提交的issues
然后
,我看到了glenn-jocher给我提交的issues
点了一个赞
和笑脸
!
哈哈哈,来自官方
的点赞
!!!


♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠