加载 Keras 中 callbakcs.ModelCheckpoint() 保存的模型时出错

Posted

技术标签:

【中文标题】加载 Keras 中 callbakcs.ModelCheckpoint() 保存的模型时出错【英文标题】:Error in load a model saved by callbakcs.ModelCheckpoint() in Keras 【发布时间】:2019-03-16 04:03:42 【问题描述】:

我通过callbacks.ModelCheckpoint() 使用 HDF5 文件自动保存了我的模型。

# Checkpoint In the /output folder
filepath = "./model/mnist-cnn-best.hd5"

# Keep only a single checkpoint, the best over test accuracy.
checkpoint = keras.callbacks.ModelCheckpoint(filepath, monitor='val_acc', 
                                             verbose=1, save_best_only=True,
                                             mode='max')

# Train
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test),
          callbacks=[checkpoint])

当我加载模型时,发生了错误。

  model = keras.models.load_model("./mnist-cnn-best.hd5")

  File "D:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\saving.py", line 251, in load_model
    training_config['weighted_metrics'])
KeyError: 'weighted_metrics'

如果我使用参数 'compile=False' 加载模型,它可以正常工作。

我知道在keras中保存模型的正常方法是:

from keras.models import load_model

model.save('my_model.h5')  # creates a HDF5 file 'my_model.h5'
del model  # deletes the existing model

# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')

顺便说一句,当我用 Tensorflow Lite 转换这个模型时,也发生了这个错误。 但我不知道我的模型有什么问题。 有人有想法吗?

【问题讨论】:

函数load_model()可以加载funcsave_model()保存的模型。在callbacks 类中,模型由model.save() 保存。这些方式有什么区别?如何加载第二种方式保存的模型? 您是否使用相同的 Keras 版本来保存和加载模型? @MatiasValdenegro 我在 Windows 10Ubuntu 16.04 平台上都使用相同的版本:2.2.2,这个问题发生在 Windows 10,在 Ubuntu 16.04 中运行良好。 【参考方案1】:

我遇到了一个类似的问题,产生了相同的错误消息,但原因可能与你的不同:

代码:(Tensorflow 1.11 和 tf.keras。版本:2.1.6-tf)

 if load_model_path.endswith('.h5'):
        model = tf.keras.models.load_model(load_model_path)

错误信息:

  File "...../lib/python3.6/site-packages/tensorflow/python/keras/engine/saving.py", line 251, in load_model
    training_config['weighted_metrics'])
KeyError: 'weighted_metrics'

我发现这是因为模型保存在较旧的 Keras 版本中。 我必须注释掉与weighted_metrics 相关的代码才能加载模型。但是,在我找到解决不匹配问题的可持续解决方案之前,这只是一种解决方法。有趣的是,@fchollet 最近(2018 年 10 月)刚刚在最新的 Keras 版本中添加了weighted_metrics。https://github.com/keras-team/keras/blob/master/keras/engine/saving.py#L136 我希望这能帮助遇到和我一样问题的人。

【讨论】:

【参考方案2】:

如果你还没有想出这个问题的答案,我想我已经知道了。

我还没有深入研究代码来确切找出原因,但基本上模型检查点回调只能使用load_weights() 函数加载,然后用于评估。

如果您想保存一个可以加载以稍后再次训练的模型,您需要使用model.savemodel.load_model。希望对徘徊于此的人有所帮助。

【讨论】:

【参考方案3】:

我通常使用这个的方式如下:

def create_model():
    <my model>
    <model.compile>
    return model
checkpoint = keras.callbacks.ModelCheckpoint(filepath, verbose=<val>, monitor=<val>, save_best_only=True, save_weights_only=True)

classifier = create_model()
classifier.fit(<your parameters>)
classifier.evaluate(<your parameters>)

loaded_model = create_model()
loaded_model.load_weights(filepath)
y_pred = loaded.model.<predict_method>(test_set,verbose=<val>)
'''

【讨论】:

以上是关于加载 Keras 中 callbakcs.ModelCheckpoint() 保存的模型时出错的主要内容,如果未能解决你的问题,请参考以下文章

加载权重 keras LSTM 不工作

Keras加载的png显示全黑

加载 Keras 中 callbakcs.ModelCheckpoint() 保存的模型时出错

加载权重后如何在 keras 中添加和删除新图层?

在 Keras 中使用 load_weights 加载模型时出错

使用 Keras,如何将 CuDNNLSTM 生成的权重加载到 LSTM 模型中?