Treinando e avaliando RNNs

Aprendizagem profunda intermediária com PyTorch

Michal Oleszak

Machine Learning Engineer

Loss MSE (Erro Quadrático Médio)

  • Erro:

    $$prediction - target$$

  • Erro ao quadrado:

    $$(prediction - target)^2$$

  • Erro quadrático médio (MSE):

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

Elevar o erro ao quadrado:

  • Evita que erros + e − se cancelem
  • Penaliza mais erros grandes
  • No PyTorch:
      criterion = nn.MSELoss()
    
Aprendizagem profunda intermediária com PyTorch

Expandindo tensores

  • Camadas recorrentes esperam (batch_size, seq_length, num_features)
  • Recebemos (batch_size, seq_length)
  • Precisamos adicionar uma dimensão no fim
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])
Aprendizagem profunda intermediária com PyTorch

Compactando tensores

  • No loop de avaliação, precisamos reverter o reshape do treino
  • Labels têm shape (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • Saídas do modelo são (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Shapes de saídas e labels devem coincidir para a loss
  • Podemos remover a última dimensão da saída

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Aprendizagem profunda intermediária com PyTorch

Loop de treino

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()
  • Instanciar o modelo, definir loss e otimizador
  • Iterar por épocas e batches
  • Remodelar a sequência de entrada
  • O resto: como de praxe
Aprendizagem profunda intermediária com PyTorch

Loop de avaliação

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
  • Configurar a métrica MSE
  • Iterar nos dados de teste sem gradientes
  • Remodelar entradas do modelo
  • Remover dimensões extras da saída
  • Atualizar a métrica
  • Calcular o valor final
Aprendizagem profunda intermediária com PyTorch

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • Preferir GRU: igual ou melhor com menos processamento
Aprendizagem profunda intermediária com PyTorch

Vamos praticar!

Aprendizagem profunda intermediária com PyTorch

Preparing Video For Download...