【问题标题】:How to read keras model weights without a model如何在没有模型的情况下读取 keras 模型权重
【发布时间】:2018-12-12 21:21:06
【问题描述】:

一个 keras 模型可以保存在两个文件中。一个文件带有模型架构。另一种是模型权重,权重通过model.save_weights()方法保存。

然后可以使用model.load_weights(file_path) 加载权重。它假定模型存在。

我只需要加载没有模型的权重。我尝试使用pickle.load()

with open(file_path, 'rb') as fp:
    w = pickle.load(fp)

但它给出了错误:

_pickle.UnpicklingError: invalid load key, 'H'.

我想权重文件是以不兼容的方式保存的。 是否可以仅从由 model.save_weights() 创建的文件中加载权重?

【问题讨论】:

  • 您将权重保存到 .h5 或 .hdf5 文件中对吗?我不确定您为什么希望此文件与 pickle 一起使用。

标签: python keras


【解决方案1】:

数据格式为 h5,因此您可以直接使用 h5py 库来检查和加载权重。来自quickstart guide

import h5py
f = h5py.File('weights.h5', 'r')
print(list(f.keys()))
# will get a list of layer names which you can use as index
d = f['dense']['dense_1']['kernel:0']
# <HDF5 dataset "kernel:0": shape (128, 1), type "<f4">
d.shape == (128, 1)
d[0] == array([-0.14390108], dtype=float32)
# etc.

该文件包含包括层权重在内的属性,您可以详细了解存储的内容和方式。如果你想要一个视觉版本,还有h5pyViewer

【讨论】:

  • 谢谢。这正是我所需要的。
  • 嘿!代码@nuric print(list(f.keys())) 中的语法错误缺少右括号)
  • 谢谢!我更新了答案以修复语法错误。
【解决方案2】:

参考:https://github.com/keras-team/keras/issues/91 代码片段供您在下方提问

from __future__ import print_function

import h5py

def print_structure(weight_file_path):
    """
    Prints out the structure of HDF5 file.

    Args:
      weight_file_path (str) : Path to the file to analyze
    """
    f = h5py.File(weight_file_path)
    try:
        if len(f.attrs.items()):
            print("{} contains: ".format(weight_file_path))
            print("Root attributes:")

        print("  f.attrs.items(): ")
        for key, value in f.attrs.items():           
            print("  {}: {}".format(key, value))

        if len(f.items())==0:
            print("  Terminate # len(f.items())==0: ")
            return 

        print("  layer, g in f.items():")
        for layer, g in f.items():            
            print("  {}".format(layer))
            print("    g.attrs.items(): Attributes:")
            for key, value in g.attrs.items():
                print("      {}: {}".format(key, value))

            print("    Dataset:")
            for p_name in g.keys():
                param = g[p_name]
                subkeys = param.keys()
                print("    Dataset: param.keys():")
                for k_name in param.keys():
                    print("      {}/{}: {}".format(p_name, k_name, param.get(k_name)[:]))
    finally:
        f.close()
print_structure('weights.h5.keras')

【讨论】:

    【解决方案3】:

    你需要创建一个Keras Model,然后你可以加载你的architecture,然后是model weights

    请看下面的代码,

    model = keras.models.Sequential()          # create a Keras Model
    model.load_weights('my_model_weights.h5')  # load model weights
    

    更多信息在Keras docs

    【讨论】:

    • 我知道如何将权重加载到模型中。我对只加载权重数据的方式很感兴趣,没有模型架构。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2015-02-23
    相关资源
    最近更新 更多