Entrenamiento y evaluación de RNN

Aprendizaje profundo intermedio con PyTorch

Michal Oleszak

Machine Learning Engineer

Pérdida del error cuadrático medio

  • ¡Error!

    $$predicción - objetivo$$

  • Error cuadrado:

    $$(predicción - objetivo)^2$$

  • Error cuadrático medio:

    $$avg[(predicción - objetivo)^2]$$

Cuadrando el error:

  • Garantiza que los errores positivos y negativos no se cancelen entre sí.
  • Penaliza más los errores graves.
  • En PyTorch:
      criterion = nn.MSELoss()
    
Aprendizaje profundo intermedio con PyTorch

Tensores expansivos

  • Las capas recurrentes esperan la forma de la entrada. (batch_size, seq_length, num_features)
  • Tenemos (batch_size, seq_length)
  • Debemos añadir una dimensión al final.
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])
Aprendizaje profundo intermedio con PyTorch

Tensores de compresión

  • En el bucle de evaluación, necesitamos revertir la remodelación realizada en el bucle de entrenamiento.
  • Las etiquetas tienen forma de (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    

    DNT_CURLY_TAG_2

  • Los resultados del modelo son (batch_size, 1)

`

----CODE_GLUE---- `out torch.Size([32, 1]) ```

  • Las formas de los resultados del modelo y las etiquetas deben coincidir para la función de pérdida.
  • Podemos eliminar la última dimensión de los resultados del modelo.

    out = net(seqs).squeeze()
    

    `out torch.Size([32]) ``` DNT_CURLY_TAG_5

Aprendizaje profundo intermedio con PyTorch

Bucle de entrenamiento

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 el modelo, definir la pérdida y el optimizador
  • Iterar sobre épocas y lotes de datos
  • Reformatear secuencia de entrada
  • El resto: como siempre.
Aprendizaje profundo intermedio con PyTorch

Bucle de evaluación

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 la métrica MSE
  • Iterar a través de los datos de prueba sin gradientes
  • Reformular las entradas del modelo
  • Comprimir resultados del modelo
  • Actualiza la métrica.
  • Calcular el valor métrico final
Aprendizaje profundo intermedio con PyTorch

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU preferido: mismos o mejores resultados con menos potencia de procesamiento.
Aprendizaje profundo intermedio con PyTorch

¡Vamos a practicar!

Aprendizaje profundo intermedio con PyTorch

Preparing Video For Download...