Python Keras如何使用Adam Optimizer恢复培训

Python Keras如何使用Adam Optimizer恢复培训,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我的模型需要运行多个时代才能得到好的结果,在谷歌云上使用v100需要几个小时 因为我是一个先发制人的例子,在训练中我就被踢了。我希望能够从它停止的地方继续 在我的自定义回调中,我运行self.model.save(…)\u epoch\u end。此外,如果分数在过去50个时期内没有提高,它将停止训练 以下是我尝试的步骤: 我一直运行model.fit,直到第250纪元之后的早期停止(最好的分数是在第200纪元) 我加载了第100个纪元后保存的模型 我运行model.fit,初始值为100。(它

我的模型需要运行多个时代才能得到好的结果,在谷歌云上使用v100需要几个小时

因为我是一个先发制人的例子,在训练中我就被踢了。我希望能够从它停止的地方继续

在我的自定义回调中,我运行self.model.save(…)\u epoch\u end。此外,如果分数在过去50个时期内没有提高,它将停止训练

以下是我尝试的步骤:

  • 我一直运行model.fit,直到第250纪元之后的早期停止(最好的分数是在第200纪元)
  • 我加载了第100个纪元后保存的模型
  • 我运行model.fit,初始值为100。(它从第101纪元开始。)
  • 然而,要赶上第一轮需要一些时间。此外,每个历元的准确度得分都接近第一次,但更低。最后,早停以大约300分开始,最终得分低于第一轮。我能得到相同最终分数的唯一方法是从头开始创建模型,并从epoch 1开始运行

    我还尝试使用float(K.get_值(self.model.optimizer.lr))和K.set_值(self.model.optimizer.lr,new_-lr)。 但是,self.model.optimizer.lr始终返回相同的数字。我假设这是因为adam优化器根据我使用adam设置的初始lr(lr=1e-4)计算实际lr


    我想知道使用Adam optimizer恢复培训的正确方法是什么?

    关于
    model.load('saved.h5')
    呢。如果使用
    model.save()
    保存优化器,它也应该加载优化器

    我想知道使用Adam optimizer恢复培训的正确方法是什么

    如本文所述:,
    model.save()
    后跟
    load\u model()
    将负责使用保存的培训配置编译模型

    if not os.path.exists('tf_keras_cifar10.h5'):
        model = get_model() #this method constructs the model and compiles it 
    else:
        model = load_model('tf_keras_cifar10.h5') #load the model from file
        print('lr is ', K.get_session().run(model.optimizer.lr))
        initial_epoch=10
        epochs=13
    
    history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,validation_data=(x_test, y_test), initial_epoch=initial_epoch)
    model.save('tf_keras_cifar10.h5')
    
    • 在保存模型之前的初始运行结束时
    纪元10/10 50000/50000[=====================================================================13s 255us/样品-损耗:0.6257-acc:0.7853-val_损耗:0.8886-val_acc:0.6985

    • 从保存的模型恢复:
    纪元11/13 50000/50000[============================================================15s 293us/样品-损耗:0.6438-acc:0.7777-val_损耗:0.8732-val_acc:0.7083

    请检查此问题以及与使用Adam Optimizer(tf.keras)恢复培训相关的问题:

    建议升级TF版本。

    • 关于
      self.model.optimizer.lr
      :它返回您设置的初始学习速率,根据该速率计算历元和梯度上使用的实际学习速率
    • Adam optimizer使用的变量不仅仅是学习率,因此为了确保完全恢复其状态,您可以调用
      model.optimizer
    • 一个好的做法是初始化模型和优化器,然后使用检查点更新状态字典:

      # ============ Load Checkpoint ============
      model = keras.models.load_model('trained_model.h5')
      # get weights
      modelWeights = model.get_weights()
      # get optimizer state as it was on last epoch
      modelOptimizer = model.optimizer
      
      # ============ Compile Model ============
      # redefine architecture (newModel=models.Sequential(), etc.)
      newModel= redefine_your_model_architecture()
      # compile
      newModel.compile(optimizer=modelOptimizer,
                       loss=loss,
                       metrics=['accuracy'])
      # set trained weights
      newModel.set_weights(modelWeights)
      
      # ============ Resume Training ============
      history = newModel.fit(...)
      
    重要提示:您不能使用Tensorflow在GPU上重现完全相同的训练(损失、精度等),如下所述:

    简而言之:GPU并行运行许多操作,因此执行顺序并不总是有保证的。由于浮点的精度有限,即使将多个数字相加,结果也可能略有不同,具体取决于相加的顺序

    另一方面,PyTorch确实具有修复CuDNN设置中此执行顺序的功能,如下所述:


    你是说tf.keras.models.load\u model?这就是我正在使用的,但它没有按预期工作。我怀疑这是因为LR没有得到恢复,而是从初始值开始。如果您运行像您提供的示例那样的几个历元,它看起来是有效的,但是如果您运行一个需要许多历元(如100或更多)的示例,它会有相当大的效果。我使用的是Tensorflow v1.13.1。我还没有试过Tensorflow 2.0 beta版。
    initial\u epoch
    arg是否会与“fresh”优化器一起工作,并通过
    load\u weights()
    仅加载模型的权重?我问bc我的h5型文件在保存过程中由于VM崩溃而损坏,我只剩下h5型文件(一个单独的文件)…:/