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
用于模型中的所有batch_normalization层,但也无济于事。
在以前的答案中,我想指出一个非常被忽视的因素:冻结/脱离的因素也取决于您要解决的问题,即。在您自己的数据集和网络预先培训的数据集的相似性级别上。
在选择决定之前,您应该咨询下图 请注意,如果您受到硬件的约束,则可以选择完全冷冻的某些图层,因为这样您就有少量的可训练参数。
图片从这里获取(尽管我记得在几个博客中看到过它):
我的模型开始从头开始学习
尽管情况很可能不是这种情况(重量没有重新引导),但绝对可以。您的模型已经对其他任务进行了微调,现在您正在迫使它进行重新训练以做不同的事情。
我的建议是保持降低学习率,直到开始改善而不是损害权重,但这可能会导致如此小的学习率,以至于没有实际用途。
冻结和解冻的方式是纠正,这就是在官方网站上完成的方式:
从
https://keras.io/guides/transfer_learning/在其他答案上讨论了,您遇到的问题确实是理论上的,与您对其进行编程的方式无关。
我以前遇到了这个问题。看来,如果我使用顺序API构建我的模型,则在设置
base_model.trainable = True
Https://www.tensorflow.org/tutorials/images/mimages/transfer_learning-