【问题标题】:Pretrained NN Finetuning with Keras. How to freeze Batch Normalization?使用 Keras 进行预训练的 CNN 微调。如何冻结批量标准化?
【发布时间】:2020-05-25 08:16:51
【问题描述】:

所以我没有在 tf.keras 中编写代码,并根据本教程使用预训练的 NN 进行微调:https://keras.io/guides/transfer_learning/#freezing-layers-understanding-the-trainable-attribute

我在调用预训练模型时必须设置参数training=False,这样当我稍后解冻进行微调时,Batch Normalization 不会破坏我的模型。但是我如何在 keras 中做到这一点(记住:我没有在 tf.keras 中编写它)。在 keras 中是否有必要这样做?

代码:

def baseline_model():
    pretrained_model = Xception(include_top=False, weights="imagenet")

    for layer in pretrained_model.layers:
        layer.trainable = False

    general_input = Input(shape=(256, 256, 3))

    x = pretrained_model(general_input,training=False)
    x = GlobalAveragePooling2D()(x)
...

在调用 model = baseline_model() 时给我错误:

TypeError: call() got an unexpected keyword argument 'training'

我怎样才能做到最好?我尝试重写 tf.keras 中的所有内容,但是当我尝试这样做时,到处都会弹出错误...

编辑:我的 keras 版本是 2.3.1 和 tensorflow 2.2.0

【问题讨论】:

    标签: python tensorflow keras neural-network conv-neural-network


    【解决方案1】:

    在做了一些额外的研究后编辑了我之前的答案:
    我做了一些阅读,似乎 BatchNorm 层在冻结时的行为有一些技巧。这是一个很好的话题:github.com/keras-team/keras/issues/7085 似乎training=false 参数是正确冻结 BatchNorm 层所必需的,它是在 Keras 2.1.3 中添加的,所以我给你的建议是为了确保你的 Keras/TF 版本更高

    【讨论】:

    • 所以你说微调似乎有效?即预训练模型中的批量标准化层没有更新/当我解冻+重新训练它们时不会破坏模型?
    • 正确。你这样做的人:layer.trainable = False 它冻结了所述层中的所有权重,并且不再可训练。您可以稍后通过运行 model.summary() 来检查它 - 它应该显示整个模型的可训练和不可训练参数的数量
    • 是的,但是在微调时我会为某些/所有层设置 layer.trainable = True?
    • 是的,你会的。关于 BatchNorm,我做了一些阅读,似乎 BatchNorm 层在冻结时的行为方式有些诡计。这是一个很好的话题:github.com/keras-team/keras/issues/7085 似乎training=false 参数是在 Keras 2.1.3 中添加的,所以请确保您的 Keras/TF 版本是最新的
    • 我的 keras 版本是 2.3.1 和 tensorflow 2.2.0,所以上面的代码必须工作。还是我必须以其他方式将其设置为 False?
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2017-07-07
    • 2017-11-30
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多