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



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

我知道,训练时控制台中显示的历元损失是为了效率而"动态"计算的,因此不一定是中间模型的实际损失。但据我所知,如果每个时期只由一批组成,那么它们实际上应该是整个训练集。这种期望的原因是,在这种情况下,模型的权重在每个历元结束时只更新一次,这意味着在计算历元损失时,模型不会改变。

不幸的是,即使我将批大小设置为训练集的大小,最佳epoch的损失也与根据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))

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

通常这不是真的。权重将根据使用的渐变下降变体进行更新。在许多情况下,这是批次梯度下降,因此每个批次都会更新权重。

最新更新