在冻结的Keras模型中,dropout层是否仍然有效(即trainable=False)?

我有两个训练好的模型(model_Amodel_B),它们都包含dropout层。我已经冻结了model_Amodel_B,并将它们与一个新的全连接层合并,得到model_AB(但我没有移除model_Amodel_B的dropout层)。model_AB的权重将是不可训练的,除了新添加的全连接层之外。

现在我的问题是:当我在训练model_AB时,model_Amodel_B中的dropout层是否仍然有效(即是否会丢弃神经元)?


回答:

简答:即使你将dropout层的trainable属性设置为False,在训练过程中,dropout层仍然会继续丢弃神经元。

详答:在Keras中,有两个不同的概念:

  • 更新层的权重和状态:这是通过该层的trainable属性来控制的,即如果你设置layer.trainable = False,那么该层的权重和内部状态将不会被更新。

  • 层在训练和测试阶段的行为:如你所知,一些层(如dropout)在训练和测试阶段可能有不同的行为。Keras中的学习阶段是通过keras.backend.set_learning_phase()来设置的。例如,当你调用model.fit(...)时,学习阶段会自动设置为1(即训练),而当你使用model.predict(...)时,它会自动设置为0(即测试)。此外,请注意,学习阶段为1(即训练)并不一定意味着更新层的权重/状态。你可以以学习阶段为1(即训练阶段)运行模型,但不会更新任何权重;只是层会切换到它们的训练行为(有关更多信息,请参见这个答案)。此外,还可以通过在调用层时传递training=True参数来为每个单独的层设置学习阶段(有关更多信息,请参见这个答案)。

因此,根据上述几点,当你将dropout层的trainable设置为False并在训练模式下使用它时(例如通过调用model.fit(...),或手动将学习阶段设置为训练模式,如下面的示例所示),dropout层仍然会丢弃神经元。

这里是一个可复现的示例来说明这一点:

from keras import layersfrom keras import modelsfrom keras import backend as Kimport numpy as npinp = layers.Input(shape=(10,))out = layers.Dropout(0.5)(inp)model = models.Model(inp, out)model.layers[-1].trainable = False  # 将dropout层设置为不可训练model.compile(optimizer='adam', loss='mse') # 重要:在更改`trainable`属性后,我们必须始终重新编译模型# 创建一个自定义的后端函数,以便我们可以控制学习阶段func = K.function(model.inputs + [K.learning_phase()], model.outputs)x = np.ones((1,10))# 学习阶段 = 1,即训练模式print(func([x, 1]))# 输出将是:[array([[2., 2., 2., 0., 0., 2., 2., 2., 0., 0.]], dtype=float32)]# 如你所见,一些神经元已经被丢弃# 现在设置学习阶段 = 0,即测试模式print(func([x, 0]))# 输出将是:[array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], dtype=float32)]# 不出所料,在测试阶段没有神经元被丢弃

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注