【问题标题】:Is there a way to determine model architecture from a .h5 file?有没有办法从 .h5 文件中确定模型架构?
【发布时间】:2020-12-02 04:48:44
【问题描述】:

我有一个 .h5 文件,其中仅包含已使用 Mask-RCNN 和 Keras 框架进行目标检测训练的模型的权重。我想用 Python 中的 Tensorflow + Keras 加载这个模型,并在自定义图像上运行对象检测。

我正在使用 Python 3.8.5,我尝试使用 keras.models.load_model() 函数加载此模型,但尝试这样做时收到错误:

ValueError: 在配置文件中找不到模型

我理解这意味着 .h5 文件只保存了模型权重,并且为了使用这些权重,我必须将它们加载到具有相同架构的模型中。

我已使用 h5py python 模块查看 .h5 文件中的组以试图了解架构,但我只看到如下键:(还有很多很多类似的,但那些是我看到的键的一般概述)

“activation_1”、“add_32”、“bn2a_branch1”、“res5c_out”等

这些组有时具有数据集成员,访问时会提供类似于以下内容的信息:

<HDF5 group "/bn4v_branch2a/bn4v_branch2a" (4 members)\>  
<HDF5 dataset "beta:0": shape (256,), type "<f4"\>  
<HDF5 dataset "gamma:0": shape (256,), type "<f4"\>  
<HDF5 dataset "moving_mean:0": shape (256,), type "<f4"\>  
<HDF5 dataset "moving_variance:0": shape (256,), type "<f4"\>

我可以假设一些东西,比如“activation_1”可能对应于激活层,但其余的层似乎与我习惯看到的 Dense、LeakyReLU、BatchNormalization 层等无关/在构建模型时使用。

我需要在这里做什么?如何从仅具有模型权重的 .h5 文件中确定 Keras + Mask-RCNN 模型的架构?

谢谢,非常感谢您的帮助!

【问题讨论】:

  • 我认为这在一般情况下是不可能的,你最好的办法是找到用于产生权重的架构,代码应该在某个地方
  • h5 是一种通用数据格式。 h5py 将其数据集加载为 numpy 数组。这些数组和Keras 模型之间的任何关系都是由Keras(或每个保存文件的人)强加的。我想它可以保存足够的信息来重新创建模型,但我无法从数据集名称中分辨出来。 (组/数据集也可以有属性)。

标签: python tensorflow keras h5py


【解决方案1】:

您也许能够从您获得的输出中收集一些信息。例如

<HDF5 group "/bn4v_branch2a/bn4v_branch2a" (4 members)\>  
<HDF5 dataset "beta:0": shape (256,), type "<f4"\>  
<HDF5 dataset "gamma:0": shape (256,), type "<f4"\>  
<HDF5 dataset "moving_mean:0": shape (256,), type "<f4"\>  
<HDF5 dataset "moving_variance:0": shape (256,), type "<f4"\>

是一个批量标准化层。我通过编写手动转换代码从 pytorch 转换为 tensorflow 知道这一点。

也许您可以构建自己的测试网络,提取权重并读取结构以查看结构与您知道的层的样子,然后与您未知的模型结构进行比较?

【讨论】:

    【解决方案2】:

    您可以在根组属性的“model_config”中找到它。简单检查:

    f = h5py.File(your_model_name, 'r')
    f.attrs.get('model_config')
    

    在那里你会找到所有层类的名称、形状、激活函数等。

    【讨论】:

      【解决方案3】:

      尝试将模型加载到另一个变量中,然后调用 model.summary() 函数

      model_2 = load_model('old_model.h5')
      model_2.summary()
      

      这应该像这样显示模型的层: Summary of model

      【讨论】:

      • 正如作者解释的那样,load_model 不起作用,因为原始 h5 文件仅使用权重保存
      • load_model(&lt;path&gt;) 仅适用于 model.save(&lt;path&gt;) 保存的模型
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2020-11-20
      • 2011-04-15
      • 2021-08-11
      相关资源
      最近更新 更多