如何解决使用批处理归一化的预训练模型进行张量流转移学习
在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,否则会导致测试数据泄露,导致测试精度不可靠。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。