在 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 模型中保存元数据/信息的主要内容,如果未能解决你的问题,请参考以下文章