加载模型后更改优化器或lr会产生奇怪的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载模型后更改优化器或lr会产生奇怪的结果相关的知识,希望对你有一定的参考价值。

我正在使用最新的Keras和Tensorflow后端(Python 3.6)

当我上次训练时,我正在加载一个训练精度在86%左右的模型。

我使用的原始优化器是:

r_optimizer = optimizer=Adam(lr=0.0001, decay = .02)
model.compile(optimizer= r_optimizer,
              loss='categorical_crossentropy', metrics = ['accuracy'])

如果我加载模型并继续训练而不重新编译,我的准确率将保持在86%左右(即使在10个左右的更多时期之后)。所以我想尝试改变学习率或优化器。

如果我重新编译模型并尝试更改学习速率或优化器,如下所示:

new_optimizer = optimizer=Adam(lr=0.001, decay = .02)

或者这个:

sgd = optimizers.SGD(lr= .0001)

然后编译:

model.compile(optimizer= new_optimizer ,
              loss='categorical_crossentropy', metrics = ['accuracy'])

model.fit ....

准确度将重置为大约15% - 20%,而不是大约86%,我的损失会更高。即使我使用较小的学习率,并重新编译,我仍然会从非常低的准确度开始。从浏览互联网看起来像ADAM或RMSPROP这样的优化器在重新编译后重置权重有问题(目前找不到链接)

所以我做了一些挖掘并尝试重置我的优化器而不重新编译,如下所示:

    model = load_model(load_path)
    sgd = optimizers.SGD(lr=1.0) # very high for testing
    model.optimizer = sgd   #change optimizer

    #fit for training

     history =model.fit_generator(
     train_gen,
    steps_per_epoch = r_steps_per_epoch,
    epochs = r_epochs,
    validation_data=valid_gen,
    validation_steps= np.ceil(len(valid_gen.filenames)/r_batch_size),
    callbacks = callbacks,
    shuffle= True,
    verbose = 1)

但是,这些变化似乎没有反映在我的培训中。尽管显着提高了lr,我仍然以同样的损失挣扎86%左右。在每个时代,我看到很少的损失或准确的运动。我预计损失将更加不稳定。这让我相信我的优化器和lr的变化没有被模型实现。

知道我可能做错了吗?

答案

我认为您的更改不会为优化器分配新的lr,并且我在Keras中加载模型后找到solution来重置lr值,希望它能帮到你。

以上是关于加载模型后更改优化器或lr会产生奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

切换到特定片段会产生奇怪的 java.lang.NullPointerException

为啥加载模型时需要加载优化器模型参数

ExtJS 4 奇怪的树加载行为

在视图大小更改时更改 UIView 阴影大小会产生奇怪的效果

更改片段(子片段)时 RecyclerView 中的奇怪叠加

PyTorch:如何在任何给定时刻更改优化器的学习率(无 LR 计划)