Python 使用Keras进行预训练NN微调。如何冻结批量正常化?

Python 使用Keras进行预训练NN微调。如何冻结批量正常化?,python,tensorflow,keras,neural-network,conv-neural-network,Python,Tensorflow,Keras,Neural Network,Conv Neural Network,所以我没有用tf.keras编写代码,根据本教程中关于使用预训练NN进行微调的内容: 调用预训练模型时,我必须设置参数training=False,以便在以后解冻进行微调时,批标准化不会破坏我的模型。但是我在keras中如何做到这一点(请记住:我并没有在tf.keras中编写它)。在凯拉斯有必要这样做吗 代码: def baseline_model(): pretrained_model = Xception(include_top=False, weights="imagenet")

所以我没有用tf.keras编写代码,根据本教程中关于使用预训练NN进行微调的内容:

调用预训练模型时,我必须设置参数
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)
...
TypeError: call() got an unexpected keyword argument 'training'
调用
model=baseline\u model()时,给出错误信息:

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)
...
TypeError: call() got an unexpected keyword argument 'training'
我怎样才能做到最好?我试着重写tf.keras中的所有内容,但每次尝试都会出现错误


编辑:我的keras版本是2.3.1,tensorflow 2.2.0在做了一些额外的研究后编辑了我以前的答案:

我读了一些书,看起来BatchNorm层在冻结时的行为有些诡计。这是一个很好的话题:github.com/keras-team/keras/issues/7085似乎
training=false
参数是正确冻结BatchNorm层所必需的,它是在keras 2.1.3中添加的,所以我给你们的建议是确保你们的keras/TF版本更高

,所以你们说微调似乎有效?i、 e.预训练模型中的批量标准化层未更新/在我解冻+重新训练时不破坏模型?正确。你可以这样做:
layer.trainable=False
它冻结了所述层中的所有权重,并且不再可训练。您可以稍后通过运行
model.summary()
-它应该显示整个模型的可训练和不可训练参数的数量是的,但当微调时,我会为某些/所有层设置layer.trainable=True?是的,您会这样做。关于BatchNorm,我做了一些阅读,看起来BatchNorm层在冻结时的行为有些诡计。这是一个很好的话题:似乎在Keras 2.1.3中添加了
training=false
参数,因此请确保您的Keras/TF版本是最新的。我的Keras版本是2.3.1,tensorflow 2.2.0,因此上述代码必须工作。或者我必须以不同的方式将其设置为False?