使用批处理归一化的预训练模型进行张量流转移学习

问题描述

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时,准确率令人满意。

所以,这是我的问题:

  1. 在使用BN建模时,将训练设置为True是错误的吗?
  2. “训练=错误”是什么意思?我认为这与反向传播有关。

谢谢!

解决方法

一个 BN 层有 4 个参数,其中 2 个是训练尺度因子,另外 2 个是输入特征的均值和标准差(对于这个 BN 层)。

因此:

  1. 一般我们在训练中设置training=True。程序。 然而,当谈到迁移学习时,它是可选的,即“真”或“假”是可以接受的,前者解冻BN层,而后者使用BN层在之前的数据集上进行试验。

  2. 'Training=False' 表示不更新 BN 层的“mean”、“std”和比例因子。测试时需要设置training=False,否则会导致测试数据泄露,导致测试精度不可靠。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...