RNN's trainen en evalueren

Gevorderde Deep Learning met PyTorch

Michal Oleszak

Machine Learning Engineer

Mean Squared Error-loss

  • Fout:

    $$prediction - target$$

  • Kwadratische fout:

    $$(prediction - target)^2$$

  • Gemiddelde kwadratische fout (MSE):

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

Het kwadrateren van de fout:

  • Voorkomt dat positieve en negatieve fouten elkaar opheffen
  • Straft grote fouten zwaarder
  • In PyTorch:
      criterion = nn.MSELoss()
    
Gevorderde Deep Learning met PyTorch

Tensors uitbreiden

  • Recurrente lagen verwachten inputvorm (batch_size, seq_length, num_features)
  • We hebben (batch_size, seq_length)
  • We moeten achteraan één dimensie toevoegen
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])
Gevorderde Deep Learning met PyTorch

Tensors squeezën

  • In de evaluatielus moet je de reshaping uit de trainingslus terugdraaien
  • Labels hebben vorm (batch_size)

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

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Output- en labelvorm moeten overeenkomen voor de loss-functie
  • We kunnen de laatste dimensie van de outputs droppen

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Gevorderde Deep Learning met PyTorch

Trainingslus

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()
  • Model maken, loss & optimizer definiëren
  • Over epochs en batches itereren
  • Inputreeks reshapen
  • De rest: zoals gewoonlijk
Gevorderde Deep Learning met PyTorch

Evaluatielus

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-metric instellen
  • Testdata zonder gradients doorlopen
  • Modelinputs reshapen
  • Modeloutputs squeezën
  • Metric updaten
  • Eindwaarde berekenen
Gevorderde Deep Learning met PyTorch

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU verdient de voorkeur: gelijke of betere resultaten met minder rekenkracht
Gevorderde Deep Learning met PyTorch

Laten we oefenen!

Gevorderde Deep Learning met PyTorch

Preparing Video For Download...