Keras:在模型中加载保存的模型权重以进行评估

5

我完成了模型训练过程。在训练过程中,我使用了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%的准确率?

我做错了什么吗?

为了安全起见,是否有直接保存最佳模型而不是模型权重的方法?

3个回答

0
将 model.load_weights(filepath) 放在编译模型之后可以解决问题!!
但我仍然对在训练过程中保存最佳模型感到好奇。

在训练过程中保存最佳模型是什么意思?模型在训练时不会改变。如果您想这样做,可以使用标志save_weights_only = False,它将在每个epoch保存模型。您提醒了我一个问题,我曾经问过:https://stackoverflow.com/questions/48139494/tensorflow-keras-modelcheckpoint-saving-model-while-training-why - Stav Bodik

0
假设您有一堆数据正在进行训练,并决定仅保存最佳迭代的权重。现在,如果您在找到“最佳”模型权重之前尚未遍历所有数据,则将有效地丢弃数据,并且使用所谓的最佳权重进行任何后续评估将不会与批内评估相关联。

0

确保您使用最佳训练模型的两个提示:

将val_acc添加到文件名中

您可以像这样创建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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接