Сначала проверьте документацию Keras: https://keras.io/callbacks/
Возможно, существует несоответствие между "save_best_only = True" и весами для последней эпохи. Вы должны использовать веса для последней эпохи вместо лучшей.
Скелет (см. Ниже раздел за разделом):
#{model}
{model = Sequential()}
{Your model}
#{model.comply}
#{model.compile()}
#{model.fit()}
#{model.save('your_name.h5')}
Мой пример ниже:
# model
input_shape=(100,50,layers)
model = Sequential()
activation = 'relu'
model.add(Conv2D(filters=16, kernel_size=(3,3),data_format='channels_last', input_shape=input_shape, padding='same', activation=activation))
model.add(Flatten())
model.add(Dense(256, activation=activation))
model.add(Dropout(0.2))
model.add(Dense(n_levels, activation='softmax'))
# model.save() # if you want to save model structure only (no weights)
# or (if you have saved model in JSON)
#with open(os.path.join(models_wd,model_name), 'r') as model_file:
# model = model_from_json(model_file.read())
# model_file.close()
#{model.compile}
adam = optimizers.Adam()
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.001, patience=12, verbose=1, mode='auto', baseline=None, restore_best_weights=False)
learning_rate_reduction = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, verbose=1, mode='auto', cooldown=0, min_lr=0.00001)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=adam)
#{model.summary}
model.summary()
#{model.fit}
history = model.fit(xtr, ytr, batch_size=8, epochs=n_epochs, verbose=2, validation_data=(xest,yest), callbacks=[learning_rate_reduction, early_stopping])
#{model.save('your_name.h5')}
model.save('your_name.h5')
Тогда в файле your_name.h5 вы получите те же веса, что и в прошлую эпоху, что даст вам тот же результат после загрузки модели.