我是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
是可训练的。但是根据代码,它被设置为不可训练的。
5条答案
按热度按时间jdgnovmf1#
您可以简单地为图层属性
trainable
指定一个布尔值。字符串
您可以可视化哪个层是可训练的:
型
你也可以通过模型定义传递它:
型
关于Keras documentation:
“冻结”层意味着将其从训练中排除,即其权重永远不会更新。这在微调模型或对文本输入使用固定嵌入的情况下很有用。
您可以将一个可训练参数(boolean)传递给层构造函数,以将层设置为不可训练。此外,您可以在示例化后将层的可训练属性设置为True或False。要使其生效,您需要在修改可训练属性后在模型上调用compile()。
30byixjq2#
在单词“trainble”中有一个错别字(缺少一个“a”)。Saddly keras没有警告我模型没有属性“trainble”。这个问题可以关闭。
mxg2im7a3#
尽管原来的问题的解决方案是一个错字修复,让我添加一些关于keras trainables的信息。
Modern Keras包含以下工具来查看和操作可训练状态:
tf.keras.Layer._get_trainable_state()
函数-打印字典,其中键是模型组件,值是布尔值。注意tf.keras.Model
也是tf.Keras.Layer
。tf.keras.Layer.trainable
属性-操作各个层的可训练状态。典型的操作如下:
字符串
9w11ddsr4#
更改代码中的最后3行:
字符串
bn31dyow5#
我知道使用trainable = False,我可以冻结层的所有权重。但我想为组件工作。(kernel,recursive_kernel和bias)。我想冻结特定层的kernel和recursive_kernel,使其成为trainable = False和trainable = True。我该如何做?我尝试了下面的代码,但得到了一个错误。有人能建议我如何使用标准Keras使kernel和recursive_kernel trainable = False吗?
字符串
错误代码:
lstm_layer.cell.kernel.trainable = False AttributeError:无法设置属性