ResNet模型验证与手动测试阶段准确率差异原因排查
验证准确率与手动计算准确率不一致的原因分析
核心原因1:两次计算使用的验证数据集完全不同
代码中每次调用get_dataloader()都会重新生成全新的随机数据:
def get_dataloader(): # Create a simple synthetic dataset for demonstration purposes x = torch.randn(100, 3, 224, 224) y = torch.randint(0, 2, (100, 1)).float() dataset = TensorDataset(x, y) return DataLoader(dataset, batch_size=8)
- 训练阶段使用的
val_loader是第一次调用生成的随机数据集 - 手动测试时再次调用
get_dataloader()生成了另一组完全不同的随机数据
两者的样本分布、标签都没有关联,计算的是不同数据集的准确率,数值自然存在差异。
核心原因2:手动测试时模型未切换到评估模式
PyTorch Lightning在执行validation_step时,会自动将模型切换到评估模式(model.eval()),此时会关闭dropout、冻结BatchNorm的统计量;但手动测试时直接调用model.predict_step,模型默认处于训练模式(model.train()),训练模式下的随机化行为(比如dropout)会导致预测结果和验证阶段的输出不一致,进一步放大准确率差异。
修复方案
- 复用同一验证数据集:提前生成一次验证数据集,训练和手动测试都使用它
# 提前生成固定的验证数据集 val_dataset = TensorDataset(torch.randn(100, 3, 224, 224), torch.randint(0, 2, (100, 1)).float()) val_loader = DataLoader(val_dataset, batch_size=8) # 训练和手动测试都使用这个val_loader
- 手动测试前切换模型到评估模式:
model.eval() with torch.no_grad(): # 执行预测和手动计算
内容的提问来源于stack exchange,提问作者richbai90
相关产品推荐
相关产品推荐

