如何将keras中的参数设置为不可训练?

时间:2018-11-27 15:52:34

标签: python keras deep-learning

我是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是可训练的。但是根据代码,它被设置为不可训练。

4 个答案:

答案 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'])