以下を使用してトレーニングおよび保存した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")
各ロードの前にkerasセッションをクリアすることで問題を解決しました
from keras import backend as K
for i in range(...):
K.clear_session()
model = load_model(...)
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を解放できるため、次のロードに時間がかかりません。