问题描述
在Tensorflow guide about transfer learning中,他们说:
当您解冻包含BatchNormalization图层的模型以进行微调时,应在调用基本模型时通过传递training = False来使BatchNormalization图层保持推理模式。
据我了解,即使我解冻图层,如果预训练的模型包含BatchNormalization图层,我也应该像下面的代码一样设置“ traininig = False”:
resnet = ResNet50(weights='imagenet',include_top=False)
resnet.trainable = True # unfreeze
inputs = Input(shape=(150,150,3))
x = resnet(inputs,training=False) # because of BN
x = GlobalAveragePooling2D()(x)
x = Dropout(0.2)(x)
outputs = Dense(150,kernel_regularizer=regularizers.l2(0.005),activation='softmax')(x)
但是,我的准确率很低,学习很少发生,而当我将训练设置为True时,准确率令人满意。
所以,这是我的问题:
- 在使用BN建模时,将训练设置为True是错误的吗?
- “训练=错误”是什么意思?我认为这与反向传播有关。
谢谢!
解决方法
一个 BN 层有 4 个参数,其中 2 个是训练尺度因子,另外 2 个是输入特征的均值和标准差(对于这个 BN 层)。
因此:
-
一般我们在训练中设置training=True。程序。 然而,当谈到迁移学习时,它是可选的,即“真”或“假”是可以接受的,前者解冻BN层,而后者使用BN层在之前的数据集上进行试验。
-
'Training=False' 表示不更新 BN 层的“mean”、“std”和比例因子。测试时需要设置training=False,否则会导致测试数据泄露,导致测试精度不可靠。