Keras:根据ModelCheckpoint回调的最佳模型在训练集上产生的损失与训练时显示的最佳历时损失不同

时间:2018-12-27 21:45:49

标签: tensorflow callback keras training-data loss

我正在尝试在Python中使用TensorFlow后端训练非常简单的Keras模型。

我知道训练中控制台上显示的历时损失是为效率而“即时”计算的,因此不一定是中间模型的实际损失。但是据我所知,实际上每个纪元应该只包含一批,即整个训练集。产生这种期望的原因在于,在这种情况下,模型的权重在每个时期结束时仅更新一次,这意味着在计算时期损失时模型不会改变。

不幸的是,即使我将批次大小设置为训练集的大小,最佳时期的损失也不同于根据ModelCheckpoint回调所产生的最佳模型损失。

有人可以向我解释这种行为吗?难道ModelCheckpoint回调也可能只计算“即时”中间模型的损失?

这是我的代码,其中bestEpochLossbestModelLoss从来都不相同:

import numpy
import keras

#Create train data
trainInput = numpy.array([4,3,1,0,2])
trainOutput = numpy.array([0,2,2,0,1])

#Create and train model 
model = keras.Sequential([
    keras.layers.Dense(200, input_shape=(1,), activation='tanh'),
    keras.layers.Dense(1, activation='linear')
])
model.compile(loss='mean_squared_error', optimizer=keras.optimizers.Adam(lr=0.1))
callbacks = [keras.callbacks.ModelCheckpoint(filepath='model.hdf5', monitor='loss', verbose=1, save_best_only=True)]
history = model.fit(trainInput, trainOutput, callbacks=callbacks, epochs=20, batch_size=len(trainInput))

#Evaluate best training epoch's loss vs best model's loss
bestEpochLoss = numpy.min(history.history['loss'])
bestModel = keras.models.load_model('model.hdf5')
bestModelLoss = bestModel.evaluate(trainInput, trainOutput)
print('Best training epoch\'s loss: ' + str(bestEpochLoss))
print('Best model\'s loss: ' + str(bestModelLoss))

1 个答案:

答案 0 :(得分:0)

  

产生这种期望的原因是,在这种情况下,模型的   权重在每个时期结束时仅更新一次,这意味着   在一个时代的损失中模型不会改变   计算。

通常情况并非如此。权重将根据使用哪种梯度下降变量进行更新。在许多情况下,这是批次梯度下降,因此您将获得每批次的重量更新。