Träna och utvärdera RNN:er

Fördjupad djupinlärning med PyTorch

Michal Oleszak

Machine Learning Engineer

Medelkvadratiskt felförlust

  • Fel:

    $$prediction - target$$

  • Kvadratiskt fel:

    $$(prediction - target)^2$$

  • Medelkvadratiskt fel:

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

Kvadrering av felet:

  • Förhindrar att positiva och negativa fel tar ut varandra
  • Straffar stora fel hårdare
  • I PyTorch:
      criterion = nn.MSELoss()
    
Fördjupad djupinlärning med PyTorch

Utöka tensorer

  • Återkommande lager förväntar sig indataform (batch_size, seq_length, num_features)
  • Vi fick (batch_size, seq_length)
  • Vi måste lägga till en dimension i slutet
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])
Fördjupad djupinlärning med PyTorch

Komprimera tensorer

  • I utvärderingsloopen behöver vi återställa omformningen från träningsloopen
  • Etiketter har formen (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • Modellens utdata är (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Modellens utdata och etiketter måste ha samma form för förlustfunktionen
  • Vi kan ta bort den sista dimensionen från modellens utdata

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Fördjupad djupinlärning med PyTorch

Träningsloop

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()
  • Instansiera modellen, definiera förlust och optimerare
  • Iterera över epoker och databatcher
  • Omforma indatasekvensen
  • Resten: som vanligt
Fördjupad djupinlärning med PyTorch

Utvärderingsloop

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
  • Konfigurera MSE-måttet
  • Iterera genom testdata utan gradienter
  • Omforma modellens indata
  • Komprimera modellens utdata
  • Uppdatera måttet
  • Beräkna det slutliga måttvärdet
Fördjupad djupinlärning med PyTorch

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU att föredra: samma eller bättre resultat med mindre beräkningskraft
Fördjupad djupinlärning med PyTorch

Nu kör vi en övning!

Fördjupad djupinlärning med PyTorch

Preparing Video For Download...