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

moiiocjp  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(175)

我是Keras新手,正在构建一个模型。我想在训练之前的层时冻结模型最后几层的权重。我试图将横向模型的可训练属性设置为False,但似乎不起作用。下面是代码和模型摘要:

  1. opt = optimizers.Adam(1e-3)
  2. domain_layers = self._build_domain_regressor()
  3. domain_layers.trainble = False
  4. feature_extrator = self._build_common()
  5. img_inputs = Input(shape=(160, 160, 3))
  6. conv_out = feature_extrator(img_inputs)
  7. domain_label = domain_layers(conv_out)
  8. self.domain_regressor = Model(img_inputs, domain_label)
  9. self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])
  10. self.domain_regressor.summary()

字符串
型号:model summary
正如你所看到的,model_1是可训练的。但是根据代码,它被设置为不可训练的。

jdgnovmf

jdgnovmf1#

您可以简单地为图层属性trainable指定一个布尔值。

  1. model.layers[n].trainable = False

字符串
您可以可视化哪个层是可训练的:

  1. for l in model.layers:
  2. print(l.name, l.trainable)


你也可以通过模型定义传递它:

  1. frozen_layer = Dense(32, trainable=False)


关于Keras documentation
“冻结”层意味着将其从训练中排除,即其权重永远不会更新。这在微调模型或对文本输入使用固定嵌入的情况下很有用。
您可以将一个可训练参数(boolean)传递给层构造函数,以将层设置为不可训练。此外,您可以在示例化后将层的可训练属性设置为True或False。要使其生效,您需要在修改可训练属性后在模型上调用compile()。

展开查看全部
30byixjq

30byixjq2#

在单词“trainble”中有一个错别字(缺少一个“a”)。Saddly keras没有警告我模型没有属性“trainble”。这个问题可以关闭。

mxg2im7a

mxg2im7a3#

尽管原来的问题的解决方案是一个错字修复,让我添加一些关于keras trainables的信息。
Modern Keras包含以下工具来查看和操作可训练状态:

  • tf.keras.Layer._get_trainable_state()函数-打印字典,其中键是模型组件,值是布尔值。注意tf.keras.Model也是tf.Keras.Layer
  • tf.keras.Layer.trainable属性-操作各个层的可训练状态。

典型的操作如下:

  1. # Print current trainable map:
  2. print(model._get_trainable_state())
  3. # Set every layer to be non-trainable:
  4. for k,v in model._get_trainable_state().items():
  5. k.trainable = False
  6. # Don't forget to re-compile the model
  7. model.compile(...)

字符串

展开查看全部
9w11ddsr

9w11ddsr4#

更改代码中的最后3行:

  1. last_few_layers = 20 #number of the last few layers to freeze
  2. self.domain_regressor = Model(img_inputs, domain_label)
  3. for layer in model.layers[:-last_few_layers]:
  4. layer.trainable = False
  5. self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])

字符串

bn31dyow

bn31dyow5#

我知道使用trainable = False,我可以冻结层的所有权重。但我想为组件工作。(kernel,recursive_kernel和bias)。我想冻结特定层的kernel和recursive_kernel,使其成为trainable = False和trainable = True。我该如何做?我尝试了下面的代码,但得到了一个错误。有人能建议我如何使用标准Keras使kernel和recursive_kernel trainable = False吗?

  1. # transfer model layer
  2. lstm_layer = modelTL.layers[0]
  3. # kernel non-trainable
  4. lstm_layer.cell.kernel.trainable = False

字符串
错误代码:
lstm_layer.cell.kernel.trainable = False AttributeError:无法设置属性

相关问题