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