我是Keras的新手,正在构建模型。出于某种原因,我想在训练前几层时冻结模型最后几层的权重。我试图将横向模型的可训练属性设置为False,但似乎不起作用。这是代码和模型摘要:
opt = optimizers.Adam(1e-3)
domain_layers = self._build_domain_regressor()
domain_layers.trainble = False
feature_extrator = self._build_common()
img_inputs = Input(shape=(160, 160, 3))
conv_out = feature_extrator(img_inputs)
domain_label = domain_layers(conv_out)
self.domain_regressor = Model(img_inputs, domain_label)
self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])
self.domain_regressor.summary()
模型摘要: model summary
如您所见,model_1是可训练的。但是根据代码,它被设置为不可训练。
答案 0 :(得分:1)
单词“ trainable”中有一个错字(缺少“ a”)。可悲的是,keras并没有警告我该模型不具有“ trainable”属性。这个问题可以解决。
答案 1 :(得分:1)
尽管原始问题的解决方案是拼写错误,但让我添加一些有关keras培训对象的信息。
现代Keras包含以下用于查看和操纵可训练状态的工具:
tf.keras.Layer._get_trainable_state()
函数-打印字典,其中键是模型组件,值是布尔值。请注意,tf.keras.Model
也是tf.Keras.Layer
。tf.keras.Layer.trainable
属性-操纵各个图层的可训练状态。因此,典型的操作如下所示:
# Print current trainable map:
print(model._get_trainable_state())
# Set every layer to be non-trainable:
for k,v in model._get_trainable_state().items():
k.trainable = False
# Don't forget to re-compile the model
model.compile(...)
答案 2 :(得分:0)
您可以简单地为图层属性trainable
分配一个布尔值。
model.layers[n].trainable = False
您可以可视化可训练的图层:
for l in model.layers:
print(l.name, l.trainable)
您也可以通过模型定义传递它:
frozen_layer = Dense(32, trainable=False)
来自Keras documentation:
“冻结”层意味着将其从训练中排除,即,将其排除在训练之外 权重将永远不会更新。这在以下情况下很有用 微调模型,或使用固定的嵌入文本输入。
您可以将可训练的参数(布尔值)传递给图层构造函数以 将图层设置为不可训练。 此外,您可以将图层的可训练属性设置为True或 实例化后为False。为使此方法生效,您需要 修改可训练的属性后,在模型上调用compile()。
答案 3 :(得分:0)
更改代码的最后3行:
last_few_layers = 20 #number of the last few layers to freeze
self.domain_regressor = Model(img_inputs, domain_label)
for layer in model.layers[:-last_few_layers]:
layer.trainable = False
self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])