[yolov5]Die Größe von Tensor a (3078) muss mit der Größe von Tensor b (3) in der Nicht-Singleton-Dimension übereinstimmen

Beschreibung des Problems:
Bei der Verwendung von yolov5 zum Trainieren des von mir erstellten Datensatzes tritt ein Fehler auf.
Fügen Sie hier eine Bildbeschreibung ein
Hintergrund:
Der Datensatz ist ein von mir selbst erstellter Datensatz im Yolo-Format. Das Bild ist groß und wurde nicht in der Größe geändert. Die Auflösung beträgt 4000 * 3000 . Die Vermutung könnte sein, dass der Datensatz fraglich erscheint

Suche nach Fehlermeldungen im Internet:

Lösung eins:

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

Lösung zwei:

Fehler 1::RuntimeError: DataLoader-Worker (pid XXX) wird durch Signal: Busfehler getötet

Problemursachen:

Im Allgemeinen tritt diese Art von Problem in Docker auf. Da der standardmäßige gemeinsame Speicher von Docker 64 MB beträgt, reicht der Speicherplatz nicht aus, wenn die Anzahl der Arbeiter groß ist, und es tritt ein Fehler auf.

Lösung:
1. Selbstzerstörerische Kampfkunst

  • wird num_workersauf 0 gesetzt

2. Lösen Sie das Problem

Konfigurieren Sie beim Erstellen von Docker einen größeren gemeinsam genutzten Speicher, fügen Sie Parameter hinzu --shm-size="15g"und legen Sie einen gemeinsam genutzten Speicher von 15 g fest (entsprechend der tatsächlichen Situation eingestellt):

nvidia-docker run -it --name [container_name] --shm-size="15g" ...
  • durch df -hAnsehen
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
  • Wobei shm der gemeinsam genutzte Speicherplatz ist

Fehler 2 RuntimeError: DataLoader-Worker (pid(s) ****) wurde unerwartet beendet

Problemursachen:

Da der Datenlader Multithread-Vorgänge verwendet, kann es bei anderen Multithread-Vorgängen mit einigen Problemen im Programm dazu kommen, dass Threads verschachtelt werden, was zu Deadlocks führt

Lösung:

1. Selbstzerstörerische Kampfkünste
werden num_workersauf 0 gesetzt

2. Lösen Sie das Problem

  • __getitem__ Deaktivieren Sie das Multithreading von opencv in der Dataloader- Methode:
def __getitem__(self, idx):
	import cv2
	cv2.setNumThreads(0)

Lösung drei:

Beim Kapseln des Datenladers beträgt der letzte verbleibende Wert weniger als eine Stapelgröße! Der eingebaute Datenlader wird dieses Phänomen haben
. Korrektur:

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

Lösung vier:

Wenn ich den Grund nach oben zurückverfolge, ist mein Grund:

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. 

Reduzieren Sie den Stapel also direkt auf 32, und die Trainingsparameter lauten wie folgt:

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

Beginne zu trainieren!
Fügen Sie hier eine Bildbeschreibung ein

Referenzen:
1. Pytorch-Dataloader-Fehler „DataLoader-Worker (pid xxx) wird durch Signal getötet“ Lösung
2. RuntimeError: Die Größe von Tensor a (128) muss mit der Größe von Tensor b (16) bei Nicht-Singleton-Dimensionen übereinstimmen

Ich denke du magst

Origin blog.csdn.net/weixin_48936263/article/details/124674410
Empfohlen
Rangfolge