Я пытаюсь обучить очень простую модель Keras с бэкэндом TensorFlow на Python.
Мне известно, что потери эпохи, отображаемые в консоли во время обучения, рассчитываются на лету для повышения эффективности и, следовательно, не обязательно являются реальными потерями промежуточных моделей.Но, насколько я понимаю, так и должно быть, если бы каждая эпоха состояла из одной партии, то есть всего учебного набора.Причиной такого ожидания является то, что в этом случае веса модели обновляются только один раз в конце каждой эпохи, что означает, что модель не изменяется во время расчета потерь эпохи.
К сожалению, даже если яустановите размер пакета равным размеру обучающего набора, потеря лучшей эпохи отличается от потери модели, которая лучше всего соответствует обратному вызову ModelCheckpoint.
Может кто-нибудь объяснить мне такое поведение?Может ли 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))