我正在尝试在Python中使用TensorFlow后端训练非常简单的Keras模型。
我知道训练中控制台上显示的历时损失是为效率而“即时”计算的,因此不一定是中间模型的实际损失。但是据我所知,实际上每个纪元应该只包含一批,即整个训练集。产生这种期望的原因在于,在这种情况下,模型的权重在每个时期结束时仅更新一次,这意味着在计算时期损失时模型不会改变。
不幸的是,即使我将批次大小设置为训练集的大小,最佳时期的损失也不同于根据ModelCheckpoint回调所产生的最佳模型损失。
有人可以向我解释这种行为吗?难道ModelCheckpoint回调也可能只计算“即时”中间模型的损失?
这是我的代码,其中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))
答案 0 :(得分:0)
产生这种期望的原因是,在这种情况下,模型的 权重在每个时期结束时仅更新一次,这意味着 在一个时代的损失中模型不会改变 计算。
通常情况并非如此。权重将根据使用哪种梯度下降变量进行更新。在许多情况下,这是批次梯度下降,因此您将获得每批次的重量更新。