Fehler bei der Verwendung der Stapelgröße von mehr als 1 in Pytorch
Posted: 28 Mar 2025, 13:55
Ich baue ein neuronales Netzwerk auf, um vorherzusagen, wie ein Bild während der Komprimierung mit VVC (vielseitige Videocodierung) verteilt wird. Das Modell nimmt einen einzelnen Y-Frame aus einem YUV420-Bild als Eingabe und verwendet eine CSV-Datei, die die Positionen und Größen für die Bodenwahrheit enthält. /> Grundwahrheit: < /strong> Eine CSV -Datei mit Blockpositionen, Größen und zusätzlichen Partitionierungsflags. />
example(388016_320x480_37.csv)
Bildbeschreibung Geben Sie hier
Problembeschreibung:
Ich habe Training implementiert. Dataloader . Mit einer Stapelgröße von 1 funktioniert das Modell korrekt, aber das Erhöhen der Stapelgröße führt zu Laufzeitfehlern.
Beobachtungen:
Wenn batch_size = 1 , ist die blocks_batch in der Trainingsschleife eine Liste mit einem einzigen Satz von Blockdaten. Listen, die bei der Indexierung Fehler verursachen.
Meine Annahme:
Es scheint, dass sich das Problem aus der Handhabung blocks_batch ergibt, wenn batch_size> 1 . Die verschachtelte Listenstruktur macht es schwierig, mehrere Chargen zu verarbeiten. Umgang mit Blockdaten mit variabler Länge würde ich mich über einen Rat freuen.
example(388016_320x480_37.csv)
Bildbeschreibung Geben Sie hier
Problembeschreibung:
Ich habe Training implementiert. Dataloader . Mit einer Stapelgröße von 1 funktioniert das Modell korrekt, aber das Erhöhen der Stapelgröße führt zu Laufzeitfehlern.
Code: Select all
def custom_collate_fn(batch):
frames = [item[0] for item in batch] # Y-frame tensors
blocks = [item[1] for item in batch] # Block information
frames = torch.stack(frames, dim=0) # Stacking frames along batch dimension
return frames, blocks
dataloader = DataLoader(
dataset,
batch_size=batch_size,
shuffle=True,
collate_fn=custom_collate_fn
)
Wenn batch_size = 1 , ist die blocks_batch in der Trainingsschleife eine Liste mit einem einzigen Satz von Blockdaten. Listen, die bei der Indexierung Fehler verursachen.
Code: Select all
for i, (frame, blocks_batch) in enumerate(dataloader):
frame = frame.to(device) # Shape: [batch_size, 1, H, W]
blocks = blocks_batch[0] # Works with batch_size=1 but fails with larger sizes
Es scheint, dass sich das Problem aus der Handhabung blocks_batch ergibt, wenn batch_size> 1 . Die verschachtelte Listenstruktur macht es schwierig, mehrere Chargen zu verarbeiten. Umgang mit Blockdaten mit variabler Länge würde ich mich über einen Rat freuen.
Code: Select all
File "C:\Users\Administrator\Documents\VVC_fast\test4\train.py", line 91, in
loss1 = criterion(out_split, target_split)
File "C:\ProgramData\miniconda3\envs\newenv3\lib\site-packages\torch\nn\modules\module.py", line 1518, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File "C:\ProgramData\miniconda3\envs\newenv3\lib\site-packages\torch\nn\modules\module.py", line 1527, in _call_impl
return forward_call(*args, **kwargs)
File "C:\ProgramData\miniconda3\envs\newenv3\lib\site-packages\torch\nn\modules\loss.py", line 725, in forward
return F.binary_cross_entropy_with_logits(input, target,
File "C:\ProgramData\miniconda3\envs\newenv3\lib\site-packages\torch\nn\functional.py", line 3193, in binary_cross_entropy_with_logits
raise ValueError(f"Target size ({target.size()}) must be the same as input size ({input.size()})")
ValueError: Target size (torch.Size([1, 1])) must be the same as input size (torch.Size([2, 1]))