【问题标题】:tensorflow transfer learning with pre-trained model that uses batch normalization张量流迁移学习与使用批量标准化的预训练模型
【发布时间】:2020-11-30 19:29:35
【问题描述】:

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. “培训=假”是什么意思?我认为这与反向传播有关。

提前致谢!

【问题讨论】:

    标签: tensorflow keras deep-learning


    【解决方案1】:

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

    因此:

    1. 一般我们在训练中设置training=True。程序。 但是,对于迁移学习,它是可选的,即“真”或“假”都是可以接受的,前者解冻了 BN 层,而后者使用了在过往数据集上尝试过的 BN 层。

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

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2020-11-07
      • 2020-05-21
      • 2021-01-18
      • 2020-02-29
      • 2021-04-17
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多