训练与评估 RNN

PyTorch 深度学习进阶

Michal Oleszak

Machine Learning Engineer

均方误差损失(MSE)

  • 误差:

    $$prediction - target$$

  • 平方误差:

    $$(prediction - target)^2$$

  • 均方误差:

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

将误差平方:

  • 避免正负误差相互抵消
  • 更严惩大误差
  • 在 PyTorch 中:
      criterion = nn.MSELoss()
    
PyTorch 深度学习进阶

扩展张量

  • 循环层期望输入形状为 (batch_size, seq_length, num_features)
  • 我们得到的是 (batch_size, seq_length)
  • 需在末尾添加一个维度
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])
PyTorch 深度学习进阶

压缩张量

  • 在评估循环中,需要还原训练时的重塑
  • 标签形状为 (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • 模型输出为 (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • 损失函数要求输出与标签形状一致
  • 可去掉输出的最后一维

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
PyTorch 深度学习进阶

训练循环

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()
  • 实例化模型,定义损失与优化器
  • 迭代轮次与数据批
  • 重塑输入序列
  • 其余:常规流程
PyTorch 深度学习进阶

评估循环

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 指标
  • 无梯度遍历测试数据
  • 重塑模型输入
  • 压缩模型输出
  • 更新指标
  • 计算最终值
PyTorch 深度学习进阶

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • 更偏向 GRU:相同或更好结果,且算力更省
PyTorch 深度学习进阶

Passons à la pratique !

PyTorch 深度学习进阶

Preparing Video For Download...