web-dev-qa-db-ja.com

kerasを使用したモデルの読み込みが非常に遅い

以下を使用してトレーニングおよび保存したKerasモデルのセット(30)があります。

 model.save('model{0}.h5'.format(n_model))

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)

出力は次のとおりです。

...
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
...

各モデルは非常に単純です。それぞれ10個のニューロンを持つ2つの隠れ層(サイズ〜50Kb)。読み込みにそれほど時間がかかっているのはなぜですか、また時間が増えているのはなぜですか?私は何かが欠けていますか(例えば、モデルの関数を閉じますか?)

[〜#〜] solution [〜#〜]

モデルの読み込みを高速化するには、ネットワークの構造と重みを2つの異なるファイルに保存する方がよいことがわかりました。保存部分:

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()

ロード部分:

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")
17
Titus Pullo

各ロードの前にkerasセッションをクリアすることで問題を解決しました

from keras import backend as K
for i in range(...):
  K.clear_session()
  model = load_model(...)
10
GearLux

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を解放できるため、次のロードに時間がかかりません。

3
Wentai Chen