Я пытаюсь сохранить модель, используя ModelCheckpoint в Keras. Я сохраняю модель, используя следующий фрагмент кода.
model = load_vgg()
parallel_model = keras.utils.multi_gpu_model(model_1, gpus=2)
parallel_model.compile(loss="binary_crossentropy", metrics=['accuracy'], optimizer=Adam())
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=1, mode='min')
checkpoint = ModelCheckpoint(os.path.join(ouput_dir, "model.h5"), monitor='val_loss', verbose=1, save_best_only=True, mode='auto')
history = parallel_model.fit_generator(train_gen, steps_per_epoch=math.ceil(num_train_samples / batch_size), validation_data=val_gen, validation_steps=math.ceil(num_val_samples / batch_size), epochs=200, verbose=1, class_weight=class_weights, callbacks=[checkpoint, early_stopping])
model.save(os.path.join(ouput_dir, 'model_2.h5'))
Модель определяется с использованием следующего кода:
def load_vgg(in_shape=(x, y), n_classes=1, n_stages_per_blocks=[2, 2, 2, 2, 2]):
in_layer = keras.layers.Input(in_shape)
block1 = _block(in_layer, 64, n_stages_per_blocks[0])
pool1 = keras.layers.MaxPool1D()(block1)
block2 = _block(pool1, 128, n_stages_per_blocks[1])
pool2 = keras.layers.MaxPool1D()(block2)
block3 = _block(pool2, 256, n_stages_per_blocks[2])
pool3 = keras.layers.MaxPool1D()(block3)
block4 = _block(pool3, 512, n_stages_per_blocks[3])
pool4 = keras.layers.MaxPool1D()(block4)
block5 = _block(pool4, 512, n_stages_per_blocks[4])
pool5 = keras.layers.MaxPool1D()(block5)
flattened = keras.layers.Flatten()(pool5)
dense1 = keras.layers.Dense(2048, activation='relu')(flattened)
dense2 = keras.layers.Dense(1024, activation='relu')(dense1)
preds = keras.layers.Dense(n_classes, activation='sigmoid')(dense2)
model = keras.models.Model(in_layer, preds)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
convBlock = partial(keras.layers.Conv1D, kernel_size=3, strides=1, padding='same', activation='relu')
def _block(in_tensor, filters, n_convs):
conv_block = in_tensor
for _ in range(n_convs):
conv_block = convBlock(filters=filters)(conv_block)
return conv_block
Проблема: Когда мы загружаем модель, сохраненную с помощью ModelCheckpoint, и модель сохраняется напрямую используя функцию сохранения, они предоставляют нам различные сводки моделей.
Сводка модели, сохраненной с помощью ModelCheckpoint: Сводка модели, сохраненной с помощью функции сохранения модели:
Почему ModelCheckpoint вводит три дополнительных слоя и перемещает модель в слой model_1? Какие изменения нужно сделать, чтобы модель, сохраненная в ModelCheckpoint, имела ту же структуру, что и модель, полученная с помощью функции сохранения? Любая помощь будет высоко ценится. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.