解决pytorch每次推理预测结果不一致问题

使用pytorch框架进行推理torchvison库里的mobileNetv2时,每次推理结果都不一致,取消了数据增强里面的随机处理算子后仍然推理结果不一致。
在这里插入图片描述

反复排查代码后发现模型没有转为eval模式,添加到model.eval()后推理结果测试后一致了。
在这里插入图片描述

Batch Normalization
其作用对网络中间的每层进行归一化处理,并且使用变换重构(Batch Normalization Transform)保证每层提取的特征分布不会被破坏。训练时是针对每个mini-batch的,但是测试是针对单张图片的,即不存在batch的概念。由于网络训练完成后参数是固定的,每个batch的均值和方差是不变的,因此直接结算所有batch的均值和方差。所有Batch Normalization的训练和测试时的操作不同。
Dropout
其作用克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象。

train()
设置模型为训练模式,启用 BatchNormalization 和 Dropout,保证 BN 层能够用到 每一批数据 的均值和方差。对于 Dropout,model.train() 是 随机取一部分网络连接来训练更新参数。
eval()
在模型中,我们通常会加上Dropout层和batch normalization层,在模型预测阶段,我们需要将这些层固定住,不会取平均,而是用训练好的值。model.eval()就是帮我们一键搞定的,如果在预测的时候忘记使用model.eval(),会导致不一致的预测结果。

model.train放在网络训练前,model.eval放在网络测试前。不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化,pytorch框架会自动把BN和Dropout固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层影响结果。

猜你喜欢

转载自blog.csdn.net/threestooegs/article/details/127937130