繁体   English   中英

设置Keras模型可训练与使每层可训练之间有什么区别

[英]What is the difference between setting a Keras model trainable vs making each layer trainable

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

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

正如我所说,这可能有点令人惊讶,Keras模型源自Keras层。 但是如果你进一步思考,你会发现它是合理的,因为它们有很多共同的功能(例如,它们都获得一些输入,对它们进行一些计算,产生一些输出,并更新它们的内部权重/参数)。 他们的共同属性之一是trainable属性。 现在,当您将模型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_layermodel2 仍然可训练 (即培训model2将更新其所有层,包括的权重shared_layer )。 另一方面,如果我们设置model1.layers[1].trainable = False ,那么shared_layer被冻结,因此在训练model1model2时不会更新其权重。 这样您就可以拥有更多的控制和灵活性,因此您可以构建更复杂的架构(例如GAN)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM