概要
使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval
eval()
时,框架会自动把 BN
和 DropOut
固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!
model.train()
启用 BatchNormalization
和 Dropout
model.eval()
不启用 BatchNormalization
和 Dropout
训练完train样本后,生成的模型model要用来测试样本。在model(test)
之前,需要加上model.eval()
,否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization
层所带来的的性质。
Batch Normalization
BN的作用主要是对网络中间的每层进行归一化处理,保证每层提取的特征分布不会被破坏。
训练时是针对每个mini-batch的,但是测试是针对单张图片的,即不存在batch的概念。由于网络训练完成后参数是固定的,因此每个batch的均值和方差是不变的.
Dropout
Dropout能够克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象。详细见文章:《Dropout: A Simple Way to Prevent Neural Networks from Overtting》
总结
如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train(),在测试时添加model.eval()。
其中model.train()是保证BN层用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差;
而对于Dropout,model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接。