【发布时间】:2018-12-27 21:45:48
【问题描述】:
我正在尝试使用 Python 中的 TensorFlow 后端训练一个非常简单的 Keras 模型。
我知道,训练时控制台中显示的历元损失是为了提高效率而“动态”计算的,因此不一定是中间模型的实际损失。但据我了解,如果每个 epoch 只包含一个批次,即整个训练集,它们实际上应该是这样。这种期望的原因是,在这种情况下,模型的权重仅在每个 epoch 结束时更新一次,这意味着在计算 epoch 的损失时模型不会改变。
不幸的是,即使我将批量大小设置为训练集的大小,最佳时期的损失与根据 ModelCheckpoint-callback 最佳的模型损失不同。
有人可以向我解释这种行为吗? ModelCheckpoint-callback 是否也只能在某种“动态”中计算中间模型的损失?
这是我的代码,其中bestEpochLoss 和bestModelLoss 永远不会相同:
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