[yolov5] El tamaño del tensor a (3078) debe coincidir con el tamaño del tensor b (3) en la dimensión no singleton报错

Descripción del problema:
se produce un error al usar yolov5 para entrenar el conjunto de datos que hice.
inserte la descripción de la imagen aquí
Fondo:
el conjunto de datos es un conjunto de datos en formato yolo creado por mí. La imagen es grande y no se ha redimensionado. La resolución es 4000 * 3000 La conjetura puede ser que el conjunto de datos parece pregunta

Busque mensajes de error en Internet:

Solución uno:

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

Solución dos:

问题1::RuntimeError: el trabajador de DataLoader (pid XXX) es eliminado por la señal: Error de bus

causas del problema:

Generalmente, este tipo de problema ocurre en Docker.Dado que la memoria compartida predeterminada de Docker es 64M, cuando la cantidad de trabajadores es grande, el espacio no es suficiente y se produce un error.

Solución:
1. Artes marciales autodestructivas

  • se num_workersestablecerá en 0

2. Resuelve el problema

Configure una memoria compartida más grande al crear la ventana acoplable, agregue parámetros --shm-size="15g"y configure una memoria compartida de 15 g (configurada de acuerdo con la situación real):

nvidia-docker run -it --name [container_name] --shm-size="15g" ...
  • viendo 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
  • Donde shm es el espacio de memoria compartida

问题2 RuntimeError: el trabajador de DataLoader (pid(s) ****) salió inesperadamente

causas del problema:

Dado que el cargador de datos utiliza operaciones de subprocesos múltiples, si hay otras operaciones de subprocesos múltiples con algunos problemas en el programa, puede hacer que los subprocesos aniden subprocesos, lo que es propenso a interbloqueos.

solución:

1. Las artes marciales de autodestrucción
se num_workersestablecerán en 0

2. Resuelve el problema

  • __getitem__ Deshabilite los subprocesos múltiples de opencv en el método del cargador de datos :
def __getitem__(self, idx):
	import cv2
	cv2.setNumThreads(0)

Solución tres:

Al encapsular el cargador de datos, ¡el último que queda tiene menos de un tamaño de lote! El cargador de datos incorporado tendrá este fenómeno
Corrección:

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

Solución cuatro:

Rastreando la razón hacia arriba, mi razón es:

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. 

Entonces, reduzca directamente el lote a 32, y los parámetros de entrenamiento son los siguientes:

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

¡Empezar a entrenar!
inserte la descripción de la imagen aquí

Referencias:
1. Error del cargador de datos de Pytorch "El trabajador del cargador de datos (pid xxx) es eliminado por la señal" Solución
2. RuntimeError: el tamaño del tensor a (128) debe coincidir con el tamaño del tensor b (16) en la dimensión no singleton

Supongo que te gusta

Origin blog.csdn.net/weixin_48936263/article/details/124674410
Recomendado
Clasificación