Entraîner et évaluer des RNN

Deep learning intermédiaire avec PyTorch

Michal Oleszak

Machine Learning Engineer

Perte MSE (Mean Squared Error)

  • Erreur :

    $$prediction - target$$

  • Erreur au carré :

    $$(prediction - target)^2$$

  • Erreur quadratique moyenne :

    $$avg[(prediction - target)^2]$${3}}

Mettre l’erreur au carré :

  • Évite l’annulation des erreurs positives et négatives
  • Pénalise davantage les grandes erreurs
  • En PyTorch :
      criterion = nn.MSELoss()
    
Deep learning intermédiaire avec PyTorch

Étendre les tenseurs

  • Les couches récurrentes attendent une entrée (batch_size, seq_length, num_features)
  • Nous avons (batch_size, seq_length)
  • Il faut ajouter une dimension à la fin
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 intermédiaire avec PyTorch

Compresser les tenseurs

  • En évaluation, il faut annuler le remodelage fait à l’entraînement
  • Les étiquettes ont la forme (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • Les sorties du modèle sont (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Les formes des sorties et étiquettes doivent correspondre pour la perte
  • On peut supprimer la dernière dimension des sorties

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Deep learning intermédiaire avec PyTorch

Boucle d’entraînement

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()
  • Instancier le modèle, définir la perte et l’optimiseur
  • Itérer sur les époques et les lots de données
  • Remodeler la séquence d’entrée
  • Le reste : comme d’habitude
Deep learning intermédiaire avec PyTorch

Boucle d’évaluation

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
  • Configurer la métrique MSE
  • Parcourir les données de test sans gradients
  • Remodeler les entrées du modèle
  • Compresser les sorties du modèle
  • Mettre à jour la métrique
  • Calculer la valeur finale
Deep learning intermédiaire avec PyTorch

LSTM vs GRU

  • LSTM :
Test MSE: 0.13292162120342255
  • GRU :
Test MSE: 0.12187089771032333
  • GRU préféré : mêmes ou meilleurs résultats avec moins de calcul
Deep learning intermédiaire avec PyTorch

Passons à la pratique !

Deep learning intermédiaire avec PyTorch

Preparing Video For Download...