【问题标题】:How can I get the model to resume training from the epoch it left off on?我怎样才能让模型从它停止的时代恢复训练?
【发布时间】:2021-08-29 10:39:23
【问题描述】:

我正在为 Deepfake 训练两个自动编码器,它需要经过一轮 150,000 轮。我在 10,000 时停止了它,但我希望它能够从它停止的时代恢复训练。有没有办法做到这一点?

train_setA = video.loading_images(setA_path)/255.0
train_setB = video.loading_images(setB_path)/255.0


train_setA += train_setB.mean( axis=(0,1,2) ) - train_setA.mean( axis=(0,1,2) )


batch_size = int(len(os.listdir(setA_path))/20)

print( "press 'q' to stop training and save model" )

for epoch in range(1000000):
    batch_size = 64
    warped_A, target_A = train_util.training_data( train_setA, batch_size )
    warped_B, target_B = train_util.training_data( train_setB, batch_size )

    loss_A = aeA.train_on_batch( warped_A, target_A )
    loss_B = aeB.train_on_batch( warped_B, target_B )
    print( loss_A, loss_B )
    print('Current epoch no... ' + str(epoch))

    if epoch % 100 == 0:
        save_model_weights()
        print('Model weights saved')
        test_A = target_A[0:14]
        test_B = target_B[0:14]

    figure_A = np.stack([
        test_A,
        aeA.predict( test_A ),
        aeB.predict( test_A ),
        ], axis=1 )
    figure_B = np.stack([
        test_B,
        aeB.predict( test_B ),
        aeA.predict( test_B ),
        ], axis=1 )

    figure = np.concatenate( [ figure_A, figure_B ], axis=0 )
    figure = figure.reshape( (4,7) + figure.shape[1:] )
    figure = train_util.stack_images( figure )

    figure = np.clip( figure * 255, 0, 255 ).astype('uint8')

    cv2.imshow( "", figure )
    key = cv2.waitKey(1)
    if key == ord('q'):
        save_model_weights()
        exit()

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    我会在'Keras'中更详细地告诉你我对这个话题的了解

    如果您在每个 epoch 之后保存权重(例如,ModelCheckpoint),那么您可以加载保存的权重。

    例如:

    保存:

    weight_save_callback = ModelCheckpoint('/path/to/weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss', save_best_only=False) # or True(Best result)
    model.fit(X_train,y_train,batch_size=batch_size,nb_epoch=nb_epoch,callbacks=[weight_save_callback]) 
    

    加载:

    model = Sequential()
    model.add(...)
    model.load('path/to/weights.hf5') 
    

    模型相同很重要。

    由于在某些优化器中,它们的一些内部值(例如,learning rate)是使用当前的“epoch”值设置的,甚至您可能有(自定义)回调依赖于当前的epoch,@ 987654326@ 允许您指定初始 epoch 值,以便在训练时开始。 这主要是当您已经为模型训练了一些 epoch,并且在保存后,您想要加载它并继续训练几个 epoch 而不会干扰依赖于 epoch 的对象的状态(例如,优化器)。因此,您应该将initial_epoch = 设置为小于 epoch 总数的值(即,我们训练模型例如 20 个 epoch,并且 epochs = 40,然后一切都会恢复,就像您最初训练了在一次培训课程中为 20 个epochs 建模。 但是,请注意,当使用内置 Keras 优化器时,您不需要使用initial_epoch,因为它们在内部存储和更新其状态(不考虑当前 epoch 的值),并且在保存模型时,优化器的状态也会被保存。

    希望对你有帮助

    【讨论】:

    • 终于有人真正读懂了这个问题
    • @Tehnorobot 我是否需要在编译两个自动编码器的文件或训练它们的代码所在的文件中使用模型检查点。
    • @pasho_6798 分配ModelCheckpoint 时指定的路径。我编辑了我的答案,您可以在示例中看到它。
    • @Tehnorobot 谢谢你,这对我帮助很大,我还有一个小问题是我可以使用ModelCheckpoint 并设置初始时期而不必使用model.fit 而是保持model.train_on_batch。我似乎无法找到继续使用train_on_batch 的方法,因为它没有callbacksfit 这样的参数。非常感谢您的帮助
    • @pasho_6798 我建议看这里:github.com/keras-team/keras/issues/485
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2019-05-12
    • 2021-05-27
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多