【问题标题】:What is the difference between setting a Keras model trainable vs making each layer trainable设置 Keras 模型可训练与使每一层可训练有什么区别
【发布时间】:2019-11-02 16:23:44
【问题描述】:

我有一个由一些密集层组成的 Keras Sequential 模型。我将整个模型的可训练属性设置为 False。但我看到各个层的可训练属性仍然设置为 True。我是否需要单独将图层的可训练属性也设置为 False?那么在整个模型上将 trainable 属性设置为 False 是什么意思呢?

【问题讨论】:

标签: python machine-learning keras keras-layer backpropagation


【解决方案1】:

要回答这个问题,您需要查看 Keras 的源代码,这样做后您可能会感到惊讶,因为您会意识到:

正如我所说,Keras 模型源自 Keras 层可能有点令人惊讶。但是如果你进一步思考,你会发现它是合理的,因为它们有很多共同的功能(例如,两者都获得一些输入,对它们进行一些计算,产生一些输出,并更新它们的内部权重/参数)。它们的共同属性之一是trainable 属性。现在,当您将 model 的 trainable 属性设置为 False 时,它将跳过权重更新步骤。换句话说,它不检查其底层的trainable 属性;相反,它首先检查自己的 trainable 属性(更准确地说是在Network 类中),如果是False,则跳过更新。因此,这并不意味着它的底层也将其trainable 属性设置为False。不这样做有一个很好的理由:一个层的单个实例可以在多个模型中使用。例如,考虑以下两个具有共享层的模型:

inp = Input(shape=...)

shared_layer = Dense(...)
sout = shared_layer(inp)

m1_out = Dense(...)(sout)
m2_out = Dense(...)(sout)

model1 = Model(inp, m1_out)
model2 = Model(inp, m2_out)

现在如果我们设置model1.trainable = False,这将冻结整个model1(即训练model1不会更新其底层的权重,包括shared_layer);然而,shared_layer 和 model2 仍然是可训练的(即训练 model2 将更新其所有层的权重,包括 shared_layer)。另一方面,如果我们设置model1.layers[1].trainable = False,则shared_layer 被冻结,因此在训练model1 或model2 时其权重不会更新。通过这种方式,您可以拥有更多的控制权和灵活性,因此您可以构建更复杂的架构(例如 GAN)。

【讨论】:

  • 所以我遇到了一个代码sn-p,作者首先设置所有layers.trainable = False,然后设置model.trainable=False,然后调用model.compile。现在,如果我想重用权重已被冻结的层(如上所述),那么我可以再次调用layers.trainable=True 并重用这些层,对吗?顺便说一句,感谢您的上述回答,消除了我最初的困惑。
  • @HarshitTrehan 如果“重用”是指要使层的权重再次可训练,那么您是对的:您首先将trainable 设置为True,然后编译模型(即调用compile 方法)以使此更改生效(否则,如果不编译模型,该层的可训练状态将不会更改)。
  • 知道了。谢谢!
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多