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

时间:2019-06-19 21:17:12

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

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

1 个答案:

答案 0 :(得分:0)

要回答这个问题,您需要查看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)。