私は以下を使用しています:python 3.6.4
フラスコ= 1.1.1、
Keras = 2.3.0、
TensorFlow = 1.14.0、私はFlaskクライアントから画像を取得するサーバーを持っています。TensorFlowバックエンドでKerasモデルを使用して、事前トレーニング済みモデルから予測を取得しようとします。
次の関数を使用してモデルをアップロードしています(クラスの一部として)
model_path = self.conf["model_path"] // path in conf to model
self.model = load_model(model_path) // uploading the model
self.model._make_predict_function()
p_log.info("model had been upload successfully ")
予測には次の行を使用します。
cm_prediction = self.model.predict([face, reye, leye, fg])[0]
今日まで何の問題もなかったので、いつも予測がつきました。 今、私は次のエラーを受け取ります:
Traceback (most recent call last):
File "D:\code_project\path to project", line 75, in predict
cm_prediction = self.model.predict([face, reye, leye, fg])[0]
File "D:\code_project\path to project", line 1462, in predict
callbacks=callbacks)
File "D:\code_project\predictserver\venv\lib\site-packages\keras\engine\training_arrays.py", line 276, in predict_loop
callbacks.model.stop_training = False
File "D:\code_project\predictserver\venv\lib\site-packages\keras\engine\network.py", line 323, in __setattr__
super(Network, self).__setattr__(name, value)
File "D:\code_project\predictserver\venv\lib\site-packages\keras\engine\base_layer.py", line 1215, in __setattr__
if not _DISABLE_TRACKING.value:
AttributeError: '_thread._local' object has no attribute 'value'
私は単純なFlaskサーバーを実行しています:
if __name__ == '__main__':
pre = predictor()
# app.run(debug=True)
app.run(Host='0.0.0.0', port=12345)
モデルは常にアップロードされています。
私がプログラムを実行している場合Flask serverがないため、手動で入力すると予測が得られますですが、すぐに- サーバーはオンエラーが表示され、私予測の取得を停止
私は同様の問題をウェブで調べようとしましたが、何も見つかりませんでした。誰かが問題の内容と解決方法を知っている場合は、共有していただければ幸いです。
そのため、長い夜を経て、Kerasは19日19日、新しいバージョン2.3.0をリリースしました。私が行ったリビジョン更新の一部として、私はすべてのライブラリー、そのうちのKerasを更新しました。私がやったのでメッセージが出ました。
Keras 2.2.5にダウングレードした後、問題は消えました。
以前完全に機能していたDockerコンテナを今日構築するときにも同じ問題がありました。 Kerasバージョンを2.2.4にダウングレードして修正しました。
Flaskを介して複数のKerasモデルをロードするときの同じ問題。使用する代わりに問題を解決するには:
from keras.models import model_from_json
私はこれを使いました:
from tensorflow.keras.models import model_from_json
将来的には、kerasをインストールする代わりに、tensorflow.kerasを使用します。
お役に立てば幸いです。
Keras 2.3.でも同じ問題がありました。
ダウングレードしたくない場合のもう1つの修正は、app.run()
にthreaded=False
を設定することです。
問題があり、私のように少し遅い場合は、debug = Falseも設定します
Flask Google App Engine経由で提供されているKerasモデルでも同じ問題がありました。このスレッドやオンラインの他の場所で見つかった提案を考慮して、以下を試しましたが、いずれも元の問題は解決しませんでした:
app.run(threaded=False)
を使用してもまったく効果がありませんでした。tensorflow.compat.v1.get_default_graph
またはtensorflow.python.keras.backend.get_graph
で設定すると、他のエラーが発生しました。最終的にヒントが見つかりました here が解決策をもたらし、次の2行をコードに追加した後、アプリはすべてのリクエストに対して有効な結果をスレッド関連の問題なしに返し始めました:
import keras.backend.tensorflow_backend as tb
tb._SYMBOLIC_SCOPE.value = True
私は上記すべてを試しましたが、ここに私が見つけたものがあります:
tb._SYMBOLIC_SCOPE.value = True
も機能しませんでしたthreaded=False
AND debug=False
機能しました。パッケージのバージョンをダウングレードする必要はありません。 Keras
を使用している場合は、Flask
サーバーでapp.run(Host=<Host>, port=<PORT>, threaded=False)
orターミナルでflask run --without-threads
を実行します。ただし、マルチスレッドを無効にする必要がないように、keras
ではなくtensorflow.keras
を使用することをお勧めします。
これらの解決策はどれも私にとってうまくいきませんでした。 Flask=からBottleに切り替えました。Bottleは、Python用の高速、シンプル、軽量のWSGIマイクロWebフレームワークでもあります。
ボトルを取り付けるには
pip insatll bottle
その後、すべての構文はFlaskと同じです
from bottle import route, run, template
@route('/hello')
def index():
return "Hello World"
run(Host='localhost', port=8080)
これがお役に立てば幸いです。
私はこの問題を次の方法で解決しました:
app.py
を実行するために使用した環境内に。現在のバージョン:
私にとってこの作品:
モデルを作成する直前に配置する必要があります。
keras.backend.tensorflow_backendをtb tb._SYMBOLIC_SCOPE.value = Trueとしてインポート
kerasのダウングレードが機能しなかったtb._SYMBOLIC_SCOPE.value = Trueが機能しなかったthreaded = False AND debug = Falseが機能しなかった
from keras.models import model_from_json
に
from tensorflow.keras.models import model_from_json
働いた
ライブラリのバージョンをダウングレードする必要はありません。同じ問題がありましたが、flaskパラメータのみを微調整しました。
app.run("0.0.0.0", 5005, threaded=False)
これでようやく私のコードが実行されました!
まだ苦労している場合はお知らせください。