Keras: лучшая модель в соответствии с ModelCheckpoint-callback приводит к потере в обучающем наборе иными потерями, чем лучшая потеря эпохи, отображаемая во время тренировки - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь обучить очень простую модель 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))

1 Ответ

0 голосов
/ 28 декабря 2018

Причина такого ожидания заключается в том, что в этом случае веса модели обновляются только один раз в конце каждой эпохи, что означает, что модель не изменяется во время расчета потерь эпохи.

Обычно это не так.Веса обновляются в зависимости от того, какой вариант градиентного спуска используется.Во многих случаях это градиентный спуск, так что вы будете иметь вес обновления каждой партии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...