在Keras中加载模型的时间呈指数增长

5
我有一系列以hdf5格式保存的Keras模型(包括结构和权重)。这些模型基于预训练的keras.applications中的DenseNet121,并使用自定义数据集进行了进一步微调。
为了生产使用,我需要将所有这些模型同时加载到内存中。
from keras.models import load_model

model_names = ['birds', 'cats', 'dogs', 'phones']
models = dict()

for name in model_names:
    path = 'models/{}.h5'.format(name)
    m = load_model(path)
    models[name] = m

随着已加载模型数量的增加,加载时间似乎呈指数增长。指示值如下:

  • 加载 birds.h5 需要 1 分钟
  • 加载 cats.h5 需要 5 分钟
  • 加载 dogs.h5 需要 7 分钟
  • 加载 phones.h5 需要 15 分钟

所有模型都基于相同的结构,每个 h5 文件在磁盘上占用 82Mb。我在配备了单个 GPU 的 AWS p2.xlarge 实例上运行此操作。

问题:

  • 为什么随着已加载模型数量的增加,加载时间会变长?
  • 这是正常现象还是我做错了什么?
  • 如何提高整体加载时间?

你可以尝试一个奇妙的黑客技巧,即:将四种模型合并为一个,使用单个输入(以该输入调用每个模型,并从此输入到每个输出创建模型)。保存该模型并查看是否成功加载。稍后您可以从中检索出每个模型。 - Daniel Möller
@DanielMöller 听起来很有趣,但我不确定我完全明白。你能详细说明一下吗? - Jivan
1个回答

1

这不是一个经过验证的答案,我在此详细说明上面的评论,供您测试。

将4个模型合并成一个。

怎么做呢?

加载它们并等待所有时间(这仍然不是生产环境)。

现在:

common_input = Input(compatible_shape)  #assuming all models have similar inputs

outputs = []
for name in models:
    outputs.append(models[name](common_input))

common_model = Model(common_input, outputs)

保存这个common_model,并查看在新的会话中加载所需的时间。

您可以使用common_model.layers[i]检索其中的每个模型。查看摘要中的i对应的是哪个层。如果您使用名称定义了子模型,那么更容易操作:common_model.get_layer(model_name)


好的,现在我完全明白了。我要试一下这个。 - Jivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接