RNNs trainieren und bewerten

Deep Learning mit PyTorch für Fortgeschrittene

Michal Oleszak

Machine Learning Engineer

Mean Squared Error Loss

  • Fehler:

    $$prediction - target$$

  • Quadratischer Fehler:

    $$(prediction - target)^2$$

  • Mittlerer quadratischer Fehler:

    $$avg[(prediction - target)^2]$$

Quadratisieren bewirkt:

  • Positive/negative Fehler heben sich nicht auf
  • Große Fehler werden stärker bestraft
  • In PyTorch:
      criterion = nn.MSELoss()
    
Deep Learning mit PyTorch für Fortgeschrittene

Tensors erweitern

  • Rekurrente Schichten erwarten (batch_size, seq_length, num_features)
  • Wir haben (batch_size, seq_length)
  • Am Ende eine Dimension hinzufügen
for seqs, labels in dataloader_train:
    print(seqs.shape)
torch.Size([32, 96])
seqs = seqs.view(32, 96, 1)
print(seqs.shape)
torch.Size([32, 96, 1])
Deep Learning mit PyTorch für Fortgeschrittene

Tensors squeez'en

  • Im Evaluations-Loop die Umformung aus dem Training rückgängig machen
  • Labels haben Form (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • Modelloutputs sind (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Formen von Outputs und Labels müssen für die Loss-Funktion übereinstimmen
  • Letzte Dimension der Outputs entfernen

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Deep Learning mit PyTorch für Fortgeschrittene

Training-Loop

net = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(
  net.parameters(), lr=0.001
)


for epoch in range(num_epochs): for seqs, labels in dataloader_train:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()
  • Modell instanziieren, Loss & Optimizer definieren
  • Über Epochen und Batches iterieren
  • Eingabesequenz umformen
  • Rest: wie üblich
Deep Learning mit PyTorch für Fortgeschrittene

Evaluations-Loop

mse = torchmetrics.MeanSquaredError()


net.eval() with torch.no_grad(): for seqs, labels in test_loader:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs).squeeze()
mse(outputs, labels)
print(f"Test MSE: {mse.compute()}")
Test MSE: 0.13292162120342255
  • MSE-Metrik einrichten
  • Testdaten ohne Gradienten durchlaufen
  • Modellinputs umformen
  • Modelloutputs squeez'en
  • Metrik updaten
  • Endwert berechnen
Deep Learning mit PyTorch für Fortgeschrittene

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU bevorzugt: gleiche/ bessere Ergebnisse mit weniger Rechenleistung
Deep Learning mit PyTorch für Fortgeschrittene

Lass uns üben!

Deep Learning mit PyTorch für Fortgeschrittene

Preparing Video For Download...