在Keras中

时间:2018-10-11 06:43:59

标签: keras hdf5 tensorflow-lite

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转换此模型时,也会发生此错误。 但是我不知道我的模型出了什么问题。 有人有主意吗?

3 个答案:

答案 0 :(得分: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最近在最新的Keras版本(2018年10月)中添加了weighted_metrics
https://github.com/keras-team/keras/blob/master/keras/engine/saving.py#L136 我希望这将对遇到与我一样的问题的人们有所帮助。

答案 1 :(得分:1)

如果您还没有找到答案,我想我已经知道了。

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

如果要保存模型,以便以后加载以再次训练,则需要使用model.savemodel.load_model。希望对那些徘徊的人有所帮助。

答案 2 :(得分:0)

我通常使用的方式如下:

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>)
'''