【发布时间】:2020-04-26 10:53:36
【问题描述】:
我正在尝试使用 Keras 中的 ModelCheckpoint 保存模型。我使用以下代码 sn-p 保存模型。
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 保存的模型和使用 save 函数直接保存的模型时,它们为我们提供了不同的模型摘要。
使用 ModelCheckpoint 保存的模型摘要: 使用模型的保存功能保存的模型总结:
为什么 ModelCheckpoint 会引入三个附加层并将模型移动到 model_1 层?我必须进行哪些更改才能确保 ModelCheckpoint 保存的模型与使用 save 函数获得的模型具有相同的结构?任何帮助都感激不尽。如果您需要任何其他信息,请告诉我。
【问题讨论】:
标签: python python-3.x keras deep-learning