我有一个由一些密集层组成的 Keras 顺序模型。我将整个模型的可训练属性设置为 False。但我看到各个层的可训练属性仍然设置为 True。我是否需要将图层的可训练属性也单独设置为 False?那么将整个模型的trainable属性设置为False有什么意义呢?
为了能够回答这个问题,您需要查看 Keras 的源代码,这样做后您可能会感到惊讶,因为您会意识到:
- The
Sequential
class 是一个子类 of Model
类,以及
- the
Model
class 是一个子类 of Network
类,以及
- the
Network
class 是一个子类 of Layer
class!
正如我所说,Keras 模型源自 Keras 层,这可能有点令人惊讶。但如果你进一步思考,你会发现它是合理的,因为它们有很多共同的功能(例如,两者都获取一些输入,对它们进行一些计算,产生一些输出,并更新它们的内部权重/参数)。它们的共同属性之一是trainable
属性。现在当你设置trainable
的财产model as False
它会skip权重更新步骤。换句话说,它不检查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
or model2
。这样你就可以拥有更多的控制权和灵活性,因此你可以构建更复杂的架构(例如 GAN)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)