Я сохраняю модель keras двумя способами: 1. "ModelCheckpoint" 2. "save_weights" после обучения модели.

Но производительность этих двух различается при загрузке обученной модели с использованием «load_weights» и «прогноз».

Мой код выглядит следующим образом

Обучить и сохранить модель

model_checkpoint = ModelCheckpoint("Model_weights.hdf5", verbose=1, save_best_only=True)

early_stopping = EarlyStopping(monitor='val_loss', patience=20, verbose=1, restore_best_weights=True)

hist = Model.fit(x=train_dict, y=train_label, 
                       batch_size=batch_size, epochs=epochs, 
                       validation_data=(valid_dict, valid_label),
                       callbacks=[csv_logger, early_stopping, model_checkpoint])

Model.save_weights("Model_weights.h5")

Нагрузка обученной модели и теста

Model = create_model() # Construct model skeleton 

hdf5_model = load_model("Model_weights.hdf5")

h5_model = load_model("Model_weights.h5")

Есть разница между "hdf5_model.predict (поезд)" и "h5_model.predict (поезд)"

1
hjs 15 Июн 2020 в 09:30

1 ответ

Лучший ответ

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

Предположим ситуацию. Вы тренируете свою модель на 50 эпох. Возможно, что вы получите убыток = 0,25 в 45-ю эпоху и потерю = 0,37 для 50-й эпохи. Это нормально. ModelCheckpoint сэкономит только вес 45-й эпохи. Он не будет обновляться в 50-ю эпоху. ModelCheckpoint сохраняет вес только в том случае, если потери уменьшаются (вы также можете изменить логику с помощью параметра). Но если вы сохраните веса после завершения тренировки, вы сэкономите с потерей 0,37, что выше.

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

Если вы посмотрите на график ниже, вы увидите, что наибольшая величина потерь была достигнута в 98-ю эпоху. Итак, ваш ModelCheckpoint сохраняет веса на 98-й эпохе и никогда не обновляет их.

enter image description here

1
Nazmul Hasan 15 Июн 2020 в 07:04