我完成了模型训练处理。在训练期间,我使用ModelCheckpint通过以下方式保存最佳模型的权重:
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1,
save_best_only=True, mode='max')
训练之后,我将模型权重加载到模型中进行评估,但我发现模型在训练期间没有给出最佳准确度。我按如下方式重新加载模型:
model.load_weights(filepath) #load saved weights
model = Sequential()
model.add(Convolution2D(32, 7, 7, input_shape=(3, 128, 128)))
....
....
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
#evaluate the model
scores = model.evaluate_generator(test_generator,val_samples)
print("Accuracy = ", scores[1])
Modelcheckpoint保存的最高精度约为85%,但重新编译的模型只能提供16%的准确度?
我有什么不对劲吗?
为了安全起见,有没有办法直接保存最佳模型而不是模型权重?
答案 0 :(得分:0)
在编译模型后放置model.load_weights(filepath)可以解决问题!!
但我仍然对在训练期间保存最佳模型感到好奇
答案 1 :(得分:0)
确保您使用经过培训的最佳模特的两个提示:
您可以像这样创建ModelCheckpoint
:
checkpoint = ModelCheckpoint('my-model-{val_acc:.2f}.hdf5', monitor='val_acc', verbose=1,
save_best_only=True, mode='max')
这样,您将拥有多个文件,并且您可以确保选择最佳模型。
当您在拟合时查看Keras的输出时,您会看到:
Epoch 000XX: val_acc improved from 0.8 to 0.85, saving model to my-model-0.85.hdf5
答案 2 :(得分:0)
假设您有一大堆正在训练的数据,并且您决定仅为最佳迭代保存权重。现在,如果您在找到“最佳”模型权重之前没有遍历所有数据,那么您将有效地丢弃数据,并且使用所谓的最佳权重进行的任何后续评估都不会与您的批次内评估相关联。