Python 在使用tensorflow学习时,逐步解冻神经网络层的正确方法是什么?

Python 在使用tensorflow学习时,逐步解冻神经网络层的正确方法是什么?,python,tensorflow,keras,neural-network,Python,Tensorflow,Keras,Neural Network,我使用迁移学习和efficientnet_B0,我试图做的是在网络学习的同时逐渐解冻层次。首先,我在整个网络的顶部训练一个密集层,而每一层都被冻结。我使用以下代码冻结图层: for layer in model_base.layers[:-2]: layer.trainable = False 然后,我使用以下代码解冻整个模型并冻结所需的确切层: model.trainable = True for layer in model_base.layers[:-13]: layer.tra

我使用迁移学习和efficientnet_B0,我试图做的是在网络学习的同时逐渐解冻层次。首先,我在整个网络的顶部训练一个密集层,而每一层都被冻结。我使用以下代码冻结图层:

for layer in model_base.layers[:-2]:
  layer.trainable = False
然后,我使用以下代码解冻整个模型并冻结所需的确切层:

model.trainable = True
for layer in model_base.layers[:-13]:
  layer.trainable = False
一切正常。我再编译一次,它就从它离开的地方开始训练了,太好了。但是,当我再次用

model.trainable = True
并尝试进行微调,我的模型开始从零开始学习


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

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

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

虽然这很可能不是权重没有重新初始化的情况,但它看起来肯定是这样的。您的模型已经被微调到其他任务,现在您正迫使它重新训练自己以做一些不同的事情

如果你观察到这样的行为,最可能的原因是你只是使用了一个大的学习率,这将破坏原始模型的微调权重

正如您所描述的,对整个模型进行再培训最后一步应该非常、非常小心地进行,学习率非常低。我看到过Adam学习率为10^-8的情况太多


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

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

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

虽然这很可能不是权重没有重新初始化的情况,但它看起来肯定是这样的。您的模型已经被微调到其他任务,现在您正迫使它重新训练自己以做一些不同的事情

如果你观察到这样的行为,最可能的原因是你只是使用了一个大的学习率,这将破坏原始模型的微调权重

正如您所描述的,对整个模型进行再培训最后一步应该非常、非常小心地进行,学习率非常低。我看到过Adam学习率为10^-8的情况太多


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

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

在您自己的数据集和网络预训练数据集的相似性级别上。 新数据集的维度。 在选择决策之前,您应该参考下一个图表


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

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

在您自己的数据集和网络预训练数据集的相似性级别上。 新数据集的维度。 在选择决策之前,您应该参考下一个图表


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

我以前遇到过这个问题。似乎如果我用顺序API构建模型,当我设置base_model.trainable=True时,网络将从头开始学习。但如果我用函数式API创建模型,似乎一切都正常。我创建模型的方法与本官方教程中的方法类似

我以前遇到过这个问题。似乎如果我用顺序API构建模型,当我设置base_model.trainable=True时,网络将从头开始学习。但如果我用函数式API创建模型,似乎一切都正常。我创建模型的方法与本官方教程中的方法类似

你是在寻求编程部分还是理论部分的帮助?你是在寻求编程部分还是理论部分的帮助?谢谢你的回答,我自己永远也不会明白你在说什么
ally导致了这个问题。我一直在使用学习率10^-5,因为在tenserflow指南中提到它非常小。谢谢你的回答,我自己永远都不会明白这个问题的真正原因。我一直在使用learning rate 10^-5,因为tenserflow指南中提到它非常小。你能链接这个图表的来源吗?@Timbus Calin你能添加一个链接吗?或者你在哪里找到了这样的信息图表?谢谢你链接这张图是从哪里来的?@Timbus Calin你能添加一个链接吗?或者你在哪里找到这张图的信息?谢谢