与Keras一起进行预训练的NN微调。如何冻结批量归一化?

时间:2020-05-25 08:16:51

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

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

调用预训练模型时,必须设置参数 training=False ,以便以后取消冻结进行微调时,批处理规范化不会破坏我的模型。但是我该如何在keras中做到这一点(请记住:我没有在tf.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

1 个答案:

答案 0 :(得分:0)

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