【问题标题】:Does model evaluation during training affect final accuracy in PyTorch?训练期间的模型评估是否会影响 PyTorch 中的最终准确性?
【发布时间】:2021-12-22 06:00:01
【问题描述】:

在 PyTorch 的简单训练循环中,观察到了一种奇怪的效果。 评估函数是否被调用似乎对模型的最终性能有影响。

我们使用非常简单的 MLP 模型在 CIFAR10 上进行训练,Adam 使用 10 个训练 epoch。

我们尝试两个主循环:

  1. 在每个训练 epoch 结束后,我们测量验证集的准确性

  2. 我们只在所有训练结束时计算一次验证。

我们在下面的代码中展示了不同之处:

主循环 1:

# Main Loop 1
num_epochs = 10 
print(f"num_epochs: {num_epochs}")

for epoch in range(num_epochs):  # loop over the dataset multiple times
    print(f"\nStart Epoch {epoch}")
    
    model.train()
    
    train_loss, train_accuracy = training_epoch(trainloader,optimizer,model,criterion)
    print(f"Training Loss: {train_loss:.3f} - Training Accuracy: {train_accuracy:.3f}")

    model.eval()
    
    with torch.no_grad():
        val_loss, val_accuracy = val_epoch(testloader, model, criterion)
    print(f"Val Loss: {val_loss:.3f} - Val Accuracy: {val_accuracy:.3f}")

print('Finished Training')

主循环 2:

# Main Loop 2
num_epochs = 10 
print(f"num_epochs: {num_epochs}")

for epoch in range(num_epochs):  # loop over the dataset multiple times
    print(f"\nStart Epoch {epoch}")
    
    model.train()
    
    train_loss, train_accuracy = training_epoch(trainloader,optimizer,model,criterion)
    print(f"Training Loss: {train_loss:.3f} - Training Accuracy: {train_accuracy:.3f}")
    
model.eval()    
with torch.no_grad():
    val_loss, val_accuracy = val_epoch(testloader, model, criterion)
print(f"Val Loss: {val_loss:.3f} - Val Accuracy: {val_accuracy:.3f}")

print('Finished Training')

虽然不应该有任何变化,但模型变化的最终表现。

  1. Val 损失:1.526 - Val 准确度:0.523
  2. Val 损失:1.501 - Val 准确度:0.528

当然,为了重现性,我们设置了所有种子。此外,在第二个训练时期开始时就已经可以观察到这种效果。

我将整个代码共享为 Colab 笔记本: https://colab.research.google.com/drive/1BODeKHZmcT8lH3r2bxYVHNR2KOpT9O9Y?usp=sharing

【问题讨论】:

    标签: machine-learning deep-learning pytorch data-science


    【解决方案1】:

    观察到的差异可能是由于优化算法中的随机性引起的方差。您执行的评估对模型的权重没有影响。

    同样在您提供的链接中,您正在重新初始化两个实验的 SimpleMLP。由于模块的权重是随机实例化的,因此推理自然会产生不同的结果。

    【讨论】:

    • 嗨@Ivan。为了避免随机性的影响,我在一开始就设置了种子,所以我不清楚你的意思。此外,如果您多次执行相同的代码,则没有随机性。
    • 如果你使用 GPU 来执行计算,你仍然会有随机性,因为某些算法的随机性即使在设置种子之后也是如此。
    • 我不确定你是否正确播种了所有内容,我只在 cpu 实例上运行了两个循环,但都没有给出预期的结果。
    • @figbar 我相信 OP 会两次初始化模型。请参阅上面的编辑...
    • 嗨@figbar。感谢您对此事的关注。我很想有一个代码,给定种子可以允许重现性。有什么建议可以阻止这种随机性吗?显然,在研究中,代码/模型应该是可重现的,因此应该有办法避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多