[yolov5]The size of tensor a (3078) must match the size of tensor b (3) at non-singleton dimension报错

问题描述:
在使用yolov5训练自己制作的数据集时出现报错
在这里插入图片描述
背景:
数据集是自己制作的yolo格式数据集,图片较大,没有做resize处理,分辨率为4000*3000,猜测可能是数据集出现问题

在网上搜索报错信息:

解决方案一:

img = Image.open(image_path) 改为
img = Image.open(image_path).convert(‘RGB’)。

解决方案二:

问题1::RuntimeError: DataLoader worker (pid XXX) is killed by signal: Bus error

问题原因:

一般这种问题发生在docker中,由于docker默认的共享内存为64M,导致工人数量多时空间不够用,发生错误。

解决方案:
1.自废武功

  • num_workers设置为0

2.解决问题

在创建docker时配置较大的共享内存,加入参数--shm-size="15g",设置15g(根据实际情况酌量设置)的共享内存:

nvidia-docker run -it --name [container_name] --shm-size="15g" ...
  • 通过 df -h查看
df -h
# df -h
Filesystem                                          Size  Used Avail Use% Mounted on
overlay                                             3.6T  3.1T  317G  91% /
tmpfs                                                64M     0   64M   0% /dev
tmpfs                                                63G     0   63G   0% /sys/fs/cgroup
/dev/sdb1                                           3.6T  3.1T  317G  91% /workspace/tmp
shm                                                  15G  8.1G  7.0G  54% /dev/shm
tmpfs                                                63G   12K   63G   1% /proc/driver/nvidia
/dev/sda1                                           219G  170G   39G  82% /usr/bin/nvidia-smi
udev                                                 63G     0   63G   0% /dev/nvidia3
tmpfs                                                63G     0   63G   0% /proc/acpi
tmpfs                                                63G     0   63G   0% /proc/scsi
tmpfs                                                63G     0   63G   0% /sys/firmware
  • 其中shm即为共享内存空间
问题2 RuntimeError: DataLoader worker (pid(s) ****) exited unexpectedly

问题原因:

由于dataloader使用了多线程操作,如果程序中存在其他有些问题的多线程操作时就有可能导致线程套线程,容易出现死锁的情况

解决方案:

1.自废武功
num_workers设置为0

2.解决问题

  • 在dataloader 的 __getitem__ 方法中禁用opencv的多线程:
def __getitem__(self, idx):
	import cv2
	cv2.setNumThreads(0)

解决方案三:

封装dataloader的时候,最后剩下的不足一个batchsize! 自带的dataloader就会有这个现象
改正:

batch_size_s = len(targets) #不足一个batch_size直接停止训练
if batch_size_s < BATCH_SIZE:
    break

解决方案四:

向上追溯原因,我的原因在于:

AutoAnchor: Running kmeans for 9 anchors on 3078 points...
AutoAnchor: Evolving anchors with Genetic Algorithm: fitness = 0.7565:  20%|██▉            | 198/1000 [01:42<06:55,  1.93it/s]
AutoAnchor: ERROR: DataLoader worker (pid 193674) is killed by signal: Killed. 

于是直接减小batch为32,训练参数如下:

python train.py --img 640 \
                --batch 32 \
                --epochs 300 \
                --data /ai/AD4/code/yolov5/data/waterpipewire_yolo.yaml \
                --weights /ai/AD4/code/yolov5/models/model/yolov5s.pt

开始训练!
在这里插入图片描述

参考资料:
1.Pytorch dataloader 错误 “DataLoader worker (pid xxx) is killed by signal” 解决方法
2. RuntimeError: The size of tensor a (128) must match the size of tensor b (16) at non-singleton dimen

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值