我有一个Keras顺序模型,其中包含一些密集层。我将整个模型的trainable属性设置为False。但是我发现各个层仍然具有可训练的属性。我需要单独将每个层的trainable属性也设置为False吗?那么将整个模型的trainable属性设置为False的意义是什么?
我有一个Keras顺序模型,其中包含一些密集层。我将整个模型的trainable属性设置为False。但是我发现各个层仍然具有可训练的属性。我需要单独将每个层的trainable属性也设置为False吗?那么将整个模型的trainable属性设置为False的意义是什么?
Sequential
类是Model
类的子类,Model
类是Network
类的子类,Network
类是Layer
类的子类!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
时,它的权重不会被更新。这样,您可以拥有更多的控制和灵活性,因此可以构建更复杂的架构(例如GANs)。layers.trainable = False
设置为False,然后将model.trainable=False
设置为False,最后调用model.compile
。现在,如果我想重复使用已经被冻结权重的层(如上所做),那么我只需要再次调用layers.trainable=True
并重复使用这些层,对吗?顺便说一下,感谢您上面的答案,解决了我的初步困惑。 - Harshit Trehantrainable
设置为True
,然后编译模型(即调用compile
方法)以使此更改生效(否则,层的可训练状态将不会在不编译模型的情况下更改)。 - today