在 Keras 模型中保存元数据/信息

Posted

技术标签:

【中文标题】在 Keras 模型中保存元数据/信息【英文标题】:Saving meta data/information in Keras model 【发布时间】:2020-04-23 22:21:48 【问题描述】:

是否可以在 Keras 模型中保存元数据/元信息?我的目标是保存输入预处理参数、使用的训练/测试集、类标签映射等,我可以在再次加载模型时使用它们。 我浏览了 Keras 文档,但没有找到任何东西。我在 GitHub 上找到了类似的 issue,但两年前就关闭了,没有任何解决方案。 目前我将所有这些信息保存在单独的文件中,并在加载模型时使用此文件。 虽然可能不相关,但我正在使用 tf.keras 功能模型并使用 model.save() 将我的模型保存为 h5 文件。

【问题讨论】:

我不认为 keras 模型保存文件应该保存模型参数(层权重、层激活函数等)以外的任何内容 这样的保存文件通常只包含模型参数(okawo也提到过)。您可以使用 logging 实现自己的元数据日志记录并将其保存到日志文件中。 这就是我目前正在做的@Cobalt 【参考方案1】:

这对我有用:

from tensorflow.python.keras.saving import hdf5_format
import h5py


# Save model
with h5py.File(model_path, mode='w') as f:
    hdf5_format.save_model_to_hdf5(my_keras_model, f)
    f.attrs['param1'] = param1
    f.attrs['param2'] = param2

# Load model
with h5py.File(model_path, mode='r') as f:
    param1 = f.attrs['param1']
    param2 = f.attrs['param2']
    my_keras_model = hdf5_format.load_model_from_hdf5(f)

【讨论】:

【参考方案2】:

我认为为了满足您的需求(至少是其中一部分),您可以实现的最接近的想法是保存MetaGraph

您可以通过使用tf.saved_model 方法来实现这一点(至少在 TensorFlow 2.0 中)。

您的原始模型也可以在 Keras 中进行训练,不一定要在纯 tensorflow 中才能使用tf.saved_model

您可以在此处阅读有关tf.saved_model 的更多信息:https://www.tensorflow.org/guide/saved_model

【讨论】:

是否可以选择将元信息保存在tf.saved_model 中?我浏览了文档,但找不到任何地方。 我认为saved_model格式本质上,除了权重之外还包含其他信息。 我认为这是正确的答案,但我会喜欢这里的更多细节!你是否添加了一个签名,它只返回一个带有你想要的信息的常量张量?【参考方案3】:

这很卑鄙,但对我有用。

我有一个用于预处理的阈值参数“thr”。我将其构建到输入名称中...

input_img = layers.Input((None, None, 1), name="input-thr0:f".format(thr))

在另一个程序中,当我读取模型并使用它时,我会扫描输入名称中的值...

try:
    thr = float(re.match('input-thr(.*)', model.layers[0].name).group(1))
except:
    thr = args.thr # default value   

也许这并不像看起来那么讨厌,因为输入名称描述了模型期望对该输入进行的预处理。

如果 Keras 模型有一个公共元数据字典,我们可以在其中存储这样的东西会更好。

后记:我已将其从我的代码中删除。

将所有训练参数保存到单独的文件中只需几行代码。一旦你设置了这个,就很容易保存所有参数,而不是那些满足你即时需求的参数。如果您真的很想将这些数据同步到经过训练的模型,请同时保存模型名称和创建时间。

【讨论】:

以上是关于在 Keras 模型中保存元数据/信息的主要内容,如果未能解决你的问题,请参考以下文章

从经过训练的 keras 模型中获取训练超参数

设计数据库来保存不同的元数据信息

Python抓取淘宝数据库月报,发送邮件,本地存档,保存元信息

无法使用自定义元数据保存图像

对象存储元数据

matplotlib 可以将元数据添加到保存的图形中吗?