You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch训练过程中执行模型评估是否会影响模型最终精度?

训练周期中调用评估函数影响模型性能的异常现象

最近在PyTorch里折腾简单训练循环的时候,发现了一个挺奇怪的现象——是否在训练周期中间调用评估函数,居然会影响模型最终的性能。我用非常简单的MLP模型搭配Adam优化器,在CIFAR10数据集上跑10个训练周期,对比了两种完全不同的训练流程:

两种训练循环的核心差异

我设置了两种主训练循环做对比,唯一的区别就是验证时机:

  1. 每个训练周期结束后立即验证集精度
  2. 仅在所有训练完成后进行一次验证

Main Loop 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')

Main Loop 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}")
print('Finished Training')

出乎意料的实验结果

从理论层面分析,这两种循环的模型最终性能应该完全一致,但实际跑出来的结果却存在明显差异:

  • 采用Main Loop 1的模型:验证损失1.526,验证精度0.523
  • 采用Main Loop 2的模型:验证损失1.501,验证精度0.528

值得注意的是,我已经设置了所有随机种子来保证实验的可复现性,而且这个性能差异从第二个训练周期开始就能观察到。

内容的提问来源于stack exchange,提问作者Sandro1888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:27:35