Keras 中的 TensorBoard 回调不尊重 initial_epoch 适合度?
TensorBoard Callback in Keras does not respect initial_epoch of fit?
我正在尝试在单个显卡上并行训练多个模型。为此,我需要从保存的权重中恢复模型训练,这不是问题。 model.fit()
方法甚至有一个参数 initial_epoch 让我告诉模型加载的模型处于哪个纪元。但是,当我将 TensorBoard 回调传递给 fit()
方法以监控模型的训练时,在 Tensorboard 上所有数据都显示在 x=0.
有没有办法克服这个问题并调整 tensorboard 上的纪元?
顺便说一下:我 运行 Keras 2.0.6 和 Tensorflow 1.3.0。
self.callbacks = [TensorBoardCallback(log_dir='./../logs/'+self.model_name, histogram_freq=0, write_graph=True, write_images=False, start_epoch=self.step_num)]
self.model.fit(x=self.data['X_train'], y=self.data['y_train'], batch_size=self.input_params[-1]['batch_size'], epochs=1, validation_data=(self.data['X_test'], self.data['y_test']), verbose=verbose, callbacks=self.callbacks, shuffle=self.hyperparameters['shuffle_data'], initial_epoch=self.step_num)
self.model.save_weights('./weights/%s.hdf5'%(self.model_name))
self.model.load_weights('./weights/%s.hdf5'%(self.model_name))
self.model.fit(x=self.data['X_train'], y=self.data['y_train'], batch_size=self.input_params[-1]['batch_size'], epochs=1, validation_data=(self.data['X_test'], self.data['y_test']), verbose=verbose, callbacks=self.callbacks, shuffle=self.hyperparameters['shuffle_data'], initial_epoch=self.step_num)
self.model.save_weights('./weights/%s.hdf5'%(self.model_name))
Tensorboard 上的结果图看起来像这样,这不是我所希望的:
更新:
当将 epochs=10
传递给第一个 model.fit()
时,TensorBoard 中会显示 10 个 epoch 结果(见图)。
然而,当重新加载模型并 运行 它(附加相同的回调)时,回调的 on_epoch_end
方法永远不会被调用。
事实证明,当我将集数传递给 model.fit() 以告诉它训练多长时间时,它必须是指定的 initial_epoch 中的数字。因此,如果 initial_epoch=self.step_num 那么,epochs=self.step_num+10 如果我想训练 10 集。
假设我们刚刚开始拟合我们的模型,我们的第一次纪元计数是 30
(请忽略其他参数只看 epochs 和 initial_epoch)
model.fit(train_dataloader,validation_data = test_dataloader,epochs =30,steps_per_epoch = len(train_dataloader),callbacks = callback_list )
现在说,在 30 个 epoch 之后,我们想通过改变我们的 Adam 优化器(或 nay 优化器)学习率从第 31 个 epoch(你可以在 tesnorboard 中看到这个)重新开始
所以我们能做的是
model.optimizer.learning_rate = 0.0005
model1.fit(train_dataloader,validation_data = test_dataloader,initial_epoch=30,epochs =55,steps_per_epoch = len(train_dataloader),回调=callback_list)
=> 所以这里 initial_epoch= 我们上次训练结束的地方;
epochs= initial_epoch+num_epoch 我们想要 运行 第二次拟合
我正在尝试在单个显卡上并行训练多个模型。为此,我需要从保存的权重中恢复模型训练,这不是问题。 model.fit()
方法甚至有一个参数 initial_epoch 让我告诉模型加载的模型处于哪个纪元。但是,当我将 TensorBoard 回调传递给 fit()
方法以监控模型的训练时,在 Tensorboard 上所有数据都显示在 x=0.
有没有办法克服这个问题并调整 tensorboard 上的纪元?
顺便说一下:我 运行 Keras 2.0.6 和 Tensorflow 1.3.0。
self.callbacks = [TensorBoardCallback(log_dir='./../logs/'+self.model_name, histogram_freq=0, write_graph=True, write_images=False, start_epoch=self.step_num)]
self.model.fit(x=self.data['X_train'], y=self.data['y_train'], batch_size=self.input_params[-1]['batch_size'], epochs=1, validation_data=(self.data['X_test'], self.data['y_test']), verbose=verbose, callbacks=self.callbacks, shuffle=self.hyperparameters['shuffle_data'], initial_epoch=self.step_num)
self.model.save_weights('./weights/%s.hdf5'%(self.model_name))
self.model.load_weights('./weights/%s.hdf5'%(self.model_name))
self.model.fit(x=self.data['X_train'], y=self.data['y_train'], batch_size=self.input_params[-1]['batch_size'], epochs=1, validation_data=(self.data['X_test'], self.data['y_test']), verbose=verbose, callbacks=self.callbacks, shuffle=self.hyperparameters['shuffle_data'], initial_epoch=self.step_num)
self.model.save_weights('./weights/%s.hdf5'%(self.model_name))
Tensorboard 上的结果图看起来像这样,这不是我所希望的:
更新:
当将 epochs=10
传递给第一个 model.fit()
时,TensorBoard 中会显示 10 个 epoch 结果(见图)。
然而,当重新加载模型并 运行 它(附加相同的回调)时,回调的 on_epoch_end
方法永远不会被调用。
事实证明,当我将集数传递给 model.fit() 以告诉它训练多长时间时,它必须是指定的 initial_epoch 中的数字。因此,如果 initial_epoch=self.step_num 那么,epochs=self.step_num+10 如果我想训练 10 集。
假设我们刚刚开始拟合我们的模型,我们的第一次纪元计数是 30 (请忽略其他参数只看 epochs 和 initial_epoch) model.fit(train_dataloader,validation_data = test_dataloader,epochs =30,steps_per_epoch = len(train_dataloader),callbacks = callback_list )
现在说,在 30 个 epoch 之后,我们想通过改变我们的 Adam 优化器(或 nay 优化器)学习率从第 31 个 epoch(你可以在 tesnorboard 中看到这个)重新开始
所以我们能做的是
model.optimizer.learning_rate = 0.0005
model1.fit(train_dataloader,validation_data = test_dataloader,initial_epoch=30,epochs =55,steps_per_epoch = len(train_dataloader),回调=callback_list)
=> 所以这里 initial_epoch= 我们上次训练结束的地方; epochs= initial_epoch+num_epoch 我们想要 运行 第二次拟合