首页 文章

如何在keras中设置参数是不可训练的?

提问于
浏览
0

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

3 回答

  • 1

    Word“trainble”中有一个拼写错误(缺少“a”) . Saddly keras没有警告我该模型没有属性“trainble” . 问题可以结束 .

  • 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'])
    
  • 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() .

相关问题