使用keras进行极慢的模型加载

Tit*_*llo 19 python performance load keras

我有一套Keras模型(30),我使用以下方法训练和保存:

 model.save('model{0}.h5'.format(n_model))
Run Code Online (Sandbox Code Playgroud)

当我尝试加载它们load_model时,每个模型所需的时间非常大并且是增量的.加载完成如下:

models = {}
for i in range(30):
    start = time.time()
    models[i] = load_model('model{0}.h5'.format(ix)) 
    end = time.time()
    print "Model {0}: seconds {1}".format(ix, end - start)
Run Code Online (Sandbox Code Playgroud)

输出是:

...
Model 9: seconds 7.38966012001
Model 10: seconds 9.99283003807
Model 11: seconds 9.7262301445
Model 12: seconds 9.17000102997
Model 13: seconds 10.1657290459
Model 14: seconds 12.5914049149
Model 15: seconds 11.652477026
Model 16: seconds 12.0126030445
Model 17: seconds 14.3402299881
Model 18: seconds 14.3761711121
...
Run Code Online (Sandbox Code Playgroud)

每个模型都非常简单:2个隐藏层,每个10个神经元(大小约50Kb).为什么装载需要这么多,为什么时间增加?我错过了什么(例如模型的关闭功能?)

我发现加速模型的加载最好将网络结构和权重存储到两个不同的文件中:保存部分:

model.save_weights('model.h5')
model_json = model.to_json()
with open('model.json', "w") as json_file:
    json_file.write(model_json)
json_file.close()
Run Code Online (Sandbox Code Playgroud)

装载部分:

from keras.models import model_from_json
json_file = open("model.json", 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
model.load_weights("model.h5")
Run Code Online (Sandbox Code Playgroud)

小智 11

我通过在每次加载之前清除keras会话来解决问题

from keras import backend as K
for i in range(...):
  K.clear_session()
  model = load_model(...)
Run Code Online (Sandbox Code Playgroud)


Wen*_*hen 5

我试过K.clear_session(),它每次都会增加加载时间。
但是,我以这种方式加载的模型model.predict由于以下错误而无法使用函数:
ValueError: Tensor Tensor("Sigmoid_2:0", shape=(?, 17), dtype=float32) is not an element of this graph.
Github #2397对此进行了详细讨论。目前最好的解决方案是在加载模型后立即预测数据,而不是同时加载几十个模型。每次预测好之后就可以使用K.clear_session()释放GPU,这样下次加载就不会花更多时间了。