多输出模型评估与损失加权

PyTorch 深度学习进阶

Michal Oleszak

Machine Learning Engineer

模型评估

acc_alpha = Accuracy(
    task="multiclass", num_classes=30
)
acc_char = Accuracy(
    task="multiclass", num_classes=964
)


net.eval() with torch.no_grad(): for images, labels_alpha, labels_char \ in dataloader_test: out_alpha, out_char = net(images)
_, pred_alpha = torch.max(out_alpha, 1) _, pred_char = torch.max(out_char, 1)
acc_alpha(pred_alpha, labels_alpha) acc_char(pred_char, labels_char)
  • 为每个输出设置度量
  • 遍历测试加载器并获取输出
  • 计算各输出的预测
  • 更新准确率度量
  • 计算最终准确率
print(f"Alphabet: {acc_alpha.compute()}")
print(f"Character: {acc_char.compute()}")
Alphabet: 0.3166305720806122
Character: 0.24064336717128754
PyTorch 深度学习进阶

多输出训练循环回顾

for epoch in range(10):
    for images, labels_alpha, labels_char \
    in dataloader_train:
        optimizer.zero_grad()
        outputs_alpha, outputs_char = net(images)
        loss_alpha = criterion(
          outputs_alpha, labels_alpha
        )
        loss_char = criterion(
          outputs_char, labels_char
        )
        loss = loss_alpha + loss_char
        loss.backward()
        optimizer.step()
  • 两个损失:字母表与字符
  • 最终损失为二者之和:loss = loss_alpha + loss_char
  • 两个分类任务同等重要
PyTorch 深度学习进阶

调整任务重要性

字符分类比字母表分类重要 2 倍

  • 方法 1:将更重要的损失放大 2 倍

    loss = loss_alpha + loss_char * 2
    
  • 方法 2:分配权重且权重和为 1

    loss = 0.33 * loss_alpha + 0.67 * loss_char
    
PyTorch 深度学习进阶

警示:损失量级不一致

  • 在加权求和前,损失需在同一量级
  • 示例任务:

    • 预测房价 -> MSE 损失
    • 预测质量:低/中/高 -> CrossEntropy 损失
  • CrossEntropy 通常为个位数

  • MSE 可达上万
  • 模型会忽视质量评估任务
  • 解决:先归一化两者再加权求和
    loss_price = loss_price / torch.max(loss_price)
    loss_quality = loss_quality / torch.max(loss_quality)
    loss = 0.7 * loss_price + 0.3 * loss_quality
    
PyTorch 深度学习进阶

Ayo berlatih!

PyTorch 深度学习进阶

Preparing Video For Download...