在使用张量流学习时逐渐解冻神经网络层的正确方法是什么?

Dan*_*tny 5 python neural-network deep-learning keras tensorflow

我将转移学习与 effectivenet_B0 结合使用,我想做的是在网络学习时逐渐解冻层。首先,我在整个网络之上训练 1 个密集层,而其他所有层都被冻结。我使用此代码来冻结图层:

for layer in model_base.layers[:-2]:
  layer.trainable = False
Run Code Online (Sandbox Code Playgroud)

然后我使用以下代码解冻整个模型并冻结我需要的确切层:

model.trainable = True
for layer in model_base.layers[:-13]:
  layer.trainable = False
Run Code Online (Sandbox Code Playgroud)

一切正常。我再进行一次 model.compile,它就开始从原来的地方开始训练,太棒了。但是,当我再次解冻所有层时

model.trainable = True
Run Code Online (Sandbox Code Playgroud)

并尝试进行微调,我的模型从头开始学习。

我尝试了不同的方法和方法来解决这个问题,但似乎没有任何效果。我也尝试对模型中的所有batch_normalization层使用layer.training = False和,但它也没有帮助。layer.trainable = False

Tim*_*lin 6

除了前面的答案之外,我想指出一个非常被忽视的因素:冻结/解冻还取决于您要解决的问题,即

  1. 您自己的数据集与网络预训练的数据集的相似程度。
  2. 新数据集的维度。

在做出决定之前,您应该查阅下图在此输入图像描述

此外,请注意,如果受到硬件的限制,您可以选择完全冻结某些层,因为这样您的可训练参数数量就会减少。

图片取自这里(虽然我记得在几个博客中看到过):https ://towardsdatascience.com/transfer-learning-from-pre-trained-models-f2393f124751

  • 你能链接一下这张图的出处吗? (3认同)

Mat*_*ava 4

这往往是特定于应用程序的,并不是每个问题都可以从重新训练整个神经网络中受益。

我的模型开始从头开始学习

虽然情况很可能不是这样(权重没有重新初始化),但看起来肯定是这样的。您的模型已经针对其他任务进行了微调,现在您迫使它重新训练自己以执行不同的操作。

如果您观察到这样的行为,最可能的原因是您只是使用了较大的学习率,这会破坏原始模型的那些微调权重。

正如您所描述的那样(最后一步)重新训练整个模型应该非常非常小心地以非常小的学习率进行(我见过 Adam 的学习率为 10^-8 太多的例子)。

我的建议是继续降低学习率,直到它开始改善,而不是损害权重,但这可能会导致学习率太小而没有实际用途。