【发布时间】:2021-12-22 06:00:01
【问题描述】:
在 PyTorch 的简单训练循环中,观察到了一种奇怪的效果。 评估函数是否被调用似乎对模型的最终性能有影响。
我们使用非常简单的 MLP 模型在 CIFAR10 上进行训练,Adam 使用 10 个训练 epoch。
我们尝试两个主循环:
-
在每个训练 epoch 结束后,我们测量验证集的准确性
-
我们只在所有训练结束时计算一次验证。
我们在下面的代码中展示了不同之处:
主循环 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')
虽然不应该有任何变化,但模型变化的最终表现。
- Val 损失:1.526 - Val 准确度:0.523
- Val 损失:1.501 - Val 准确度:0.528
当然,为了重现性,我们设置了所有种子。此外,在第二个训练时期开始时就已经可以观察到这种效果。
我将整个代码共享为 Colab 笔记本: https://colab.research.google.com/drive/1BODeKHZmcT8lH3r2bxYVHNR2KOpT9O9Y?usp=sharing
【问题讨论】:
标签: machine-learning deep-learning pytorch data-science