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

时间:2018-05-22 02:33:26

标签: python tensorflow neural-network keras deep-learning

我正在使用最新的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的改变并不存在 由模型实现。

知道我可能做错了吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这是部分答案,指的是您在此处写的内容:

从浏览Internet来看,某些优化器(如ADAM或RMSPROP)在重新编译后重新设置权重时存在问题(目前无法找到链接)

诸如ADAM RMSPROP,ADAGRAD,ADADELTA之类的自适应优化器以及这些优化器的任何变体都依赖于先前的更新步骤来改善当前对模型权重进行调整的方向和幅度。

因此,他们采取的前几个步骤往往相对“不好”,因为它们会使用先前步骤中的信息进行“校准”。

在随机初始化中使用时,这不是问题,但是在预训练的模型上使用时,这最初的几个步骤会使模型降级很多,从而几乎失去了所有预训练的工作。

更糟糕的是,现在的训练不是从精心选择的随机初始化(例如Xavier初始化)开始的,而是从某个次优的起点开始的,这可能会阻止模型收敛到将要达到的局部最优值如果它是从良好的随机初始化开始的。

不幸的是,我不确定如何避免这种情况...也许使用一个优化程序进行预训练->节省重量->替换优化程序->恢复重量->进行一些训练并希望新的自适应优化器学习了“有用的历史记录”->而不是从保存的预训练模型权重中恢复权重,并且无需重新编译即可开始训练,现在有了更好的优化器“历史”。

请告知我们是否可行。