【问题标题】:Save and load weights in keras在 keras 中保存和加载权重
【发布时间】:2018-04-26 06:09:21
【问题描述】:

我正在尝试从我训练的模型中保存和加载权重。

我用来保存模型的代码是。

TensorBoard(log_dir='/output')
model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1)
model.save_weights('model.hdf5')
model.save_weights('myModel.h5')

如果这是不正确的方法,或者是否有更好的方法,请告诉我。

但是当我尝试加载它们时,使用这个,

from keras.models import load_model
model = load_model('myModel.h5')

但我收到此错误:


ValueError                                Traceback (most recent call 
last)
<ipython-input-7-27d58dc8bb48> in <module>()
      1 from keras.models import load_model
----> 2 model = load_model('myModel.h5')

/home/decentmakeover2/anaconda3/lib/python3.5/site-
packages/keras/models.py in load_model(filepath, custom_objects, compile)
    235         model_config = f.attrs.get('model_config')
    236         if model_config is None:
--> 237             raise ValueError('No model found in config file.')
    238         model_config = json.loads(model_config.decode('utf-8'))
    239         model = model_from_config(model_config, 
custom_objects=custom_objects)

ValueError: No model found in config file.

关于我可能做错的任何建议? 提前谢谢你。

【问题讨论】:

    标签: python keras


    【解决方案1】:

    这是一个 YouTube 视频,它准确地解释了您想要做什么:Save and load a Keras model

    Keras 提供了三种不同的保存方法。这些在上面的视频链接(带有示例)以及下面都有描述。

    首先,您收到错误的原因是您错误地调用了load_model

    要保存和加载模型的权重,您首先要使用

    model.save_weights('my_model_weights.h5')
    

    保存权重,如您所显示的。要加载权重,您首先需要构建模型,然后在模型上调用 load_weights,如

    model.load_weights('my_model_weights.h5')
    

    另一种保存技巧是model.save(filepath)。这个save 函数保存:

    • 模型的架构,允许重新创建模型。
    • 模型的权重。
    • 训练配置(损失、优化器)。
    • 优化器的状态,允许在您停止的地方恢复训练。

    要加载此保存的模型,您可以使用以下内容:

    from keras.models import load_model
    new_model = load_model(filepath)'
    

    最后,model.to_json(),仅保存模型的架构。要加载架构,您可以使用

    from keras.models import model_from_json
    model = model_from_json(json_string)
    

    【讨论】:

    • 如果我在 python 3.6 上保存权重,是否可以在 python 2.7 上加载它们?
    • @Rtucan 我认为是的。你可以试试看。
    • 是否可以从 model.save() 而不是 model.save_weights 中加载已保存模型的权重?如果有怎么办?
    【解决方案2】:

    要加载权重,您需要先有一个模型。必须是:

    existingModel.save_weights('weightsfile.h5')
    existingModel.load_weights('weightsfile.h5')     
    

    如果您想保存和加载整个模型(这包括模型的配置、权重和优化器状态以供进一步训练):

    model.save_model('filename')
    model = load_model('filename')
    

    【讨论】:

    • 按型号,如果你的意思是所有层,我有所有我还没有发布的东西
    • 当我尝试使用 load_model() 对完整模型进行建模时出现此错误。请告诉我如何解决以下错误:ValueError: You are trying to load a weight file containing 17 layers into a model with 0 layers
    • @KK2491 你真的在使用load_model吗?这是load_weights 的错误。如果您使用的是load_model,您的文件似乎已损坏,或者您的 keras 版本有问题。
    • @DanielMöller 是的,我正在使用load_model。我使用的Keras 版本是2.2.4
    • @Jubick 其实有一个更简单的方法。您可以直接保存模型并加载它。 (.model 扩展名)
    【解决方案3】:

    由于这个问题已经很老了,但仍然出现在 google 搜索中,我认为最好指出保存 Keras 模型的更新(和推荐)方法。 与其像之前展示的那样使用旧的 h5 格式保存它们,现在建议使用 SavedModel 格式,它实际上是一个包含模型配置和权重的字典。

    更多信息可以在这里找到:https://www.tensorflow.org/guide/keras/save_and_serialize

    保存和加载的sn-ps可以在下面找到:

    model.fit(test_input, test_target)
    # Calling save('my_model') creates a SavedModel folder 'my_model'.
    model.save('my_model')
    
    # It can be used to reconstruct the model identically.
    reconstructed_model = keras.models.load_model('my_model')
    

    此示例输出:

    【讨论】:

    • 加载保存的模型(权重)后,我如何预测看不见的数据?有人可以提供任何使用连体网络进行预测的示例代码吗?
    • 你好 Lakwin,这可以像你从头开始构建模型时一样,通过使用 model.predict() 来完成。这个问题在这里得到了回答:stackoverflow.com/questions/37891954/…
    • 或者只是模型(X),因为 .predict 可能很慢
    【解决方案4】:

    从头开始加载模型需要您从头开始构建模型, 所以你可以先尝试使用model.to_json()来保存你的模型架构

    model_architecture = model.to_json()
    

    使用保存模型权重

    model.save_weights('model_weights.h5')
           
    

    要加载权重,您需要使用保存的 json 文件重建模型 首先。

    from tensorflow.keras.models import model_from_json
    model = model_from_json(model_architecture) 
    

    然后使用加载权重

    model.load_weights('model_weights.h5') 
    

    您现在可以编译和测试模型,无需重新训练 例如

    model.compile(loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer=keras.optimizers.Adam(lr=0.001), metrics=["accuracy"])
    
    model.evaluate(x_test, y_test, batch_size=32, verbose=2)
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2019-05-20
      • 2019-12-05
      相关资源
      最近更新 更多