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

Jiv*_*van 5 python keras tensorflow

我有一系列以 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
Run Code Online (Sandbox Code Playgroud)

加载的模型越多,加载时间似乎呈指数级增长。指示值是:

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

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

问题:

  • 为什么加载时间随着已加载模型数量的增加而增长?
  • 这是正常的还是我做错了什么?
  • 如何改善整体加载时间?

Dan*_*ler 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)
Run Code Online (Sandbox Code Playgroud)

保存它common_model并查看在新会话中加载需要多长时间。

您可以使用 从中检索每个模型common_model.layers[i]。在摘要中查看哪个i是哪一层。如果您使用名称定义子模型,则更容易:common_model.get_layer(model_name).