gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:04 25 4
gpt4 key购买 nike

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

最佳答案

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

正如我所说,Keras 模型源自 Keras 层,这可能有点令人惊讶。但如果你进一步思考,你会发现它是合理的,因为它们有很多共同的功能(例如,两者都获取一些输入,对它们进行一些计算,产生一些输出,并更新它们的内部权重/参数)。它们的共同属性之一是可训练属性。现在,当您将模型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 将被卡住,因此在训练时其权重不会更新 模型1模型2。这样您就可以拥有更多的控制权和灵 active ,因此您可以构建更复杂的架构(例如 GAN)。

关于python - 设置 Keras 模型可训练与使每一层可训练之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56675964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com