【问题标题】:Keras: Best model according to ModelCheckpoint-callback produces different loss on training set than best epoch loss displayed while trainingKeras:根据 ModelCheckpoint-callback 的最佳模型在训练集上产生的损失与训练时显示的最佳时期损失不同
【发布时间】:2018-12-27 21:45:48
【问题描述】:

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

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

不幸的是,即使我将批量大小设置为训练集的大小,最佳时期的损失与根据 ModelCheckpoint-callback 最佳的模型损失不同。

有人可以向我解释这种行为吗? ModelCheckpoint-callback 是否也只能在某种“动态”中计算中间模型的损失?

这是我的代码,其中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))

【问题讨论】:

    标签: tensorflow callback keras training-data loss


    【解决方案1】:

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

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

    【讨论】:

    • 如果每个 epoch 只包含一个批次(如我的情况),这意味着每个 epoch 结束时只有权重更新,对吧?
    • 是的,在这种情况下应该是
    猜你喜欢
    • 2022-06-30
    • 2019-04-02
    • 2019-09-27
    • 1970-01-01
    • 2017-07-17
    • 2018-03-30
    • 2020-04-07
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多