web-dev-qa-db-ja.com

Flask and Kerasモデルエラー '' _thread._local 'オブジェクトに属性'値 'がありません?

私は以下を使用しています: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がないため、手動で入力すると予測が得られますですが、すぐに- サーバーはオンエラーが表示され、私予測の取得を停止

私は同様の問題をウェブで調べようとしましたが、何も見つかりませんでした。誰かが問題の内容と解決方法を知っている場合は、共有していただければ幸いです。

14
helpper

そのため、長い夜を経て、Kerasは19日19日、新しいバージョン2.3.0をリリースしました。私が行ったリビジョン更新の一部として、私はすべてのライブラリー、そのうちのKerasを更新しました。私がやったのでメッセージが出ました。

Keras 2.2.5にダウングレードした後、問題は消えました。

18
helpper

以前完全に機能していたDockerコンテナを今日構築するときにも同じ問題がありました。 Kerasバージョンを2.2.4にダウングレードして修正しました。

4

Flaskを介して複数のKerasモデルをロードするときの同じ問題。使用する代わりに問題を解決するには:

from keras.models import model_from_json

私はこれを使いました:

from tensorflow.keras.models import model_from_json

将来的には、kerasをインストールする代わりに、tensorflow.kerasを使用します。

お役に立てば幸いです。

3
mlimam

Keras 2.3.でも同じ問題がありました。

ダウングレードしたくない場合のもう1つの修正は、app.run()threaded=Falseを設定することです。

2
Maxence Alluin

問題があり、私のように少し遅い場合は、debug = Falseも設定します

2
Glen020

Flask Google App Engine経由で提供されているKerasモデルでも同じ問題がありました。このスレッドやオンラインの他の場所で見つかった提案を考慮して、以下を試しましたが、いずれも元の問題は解決しませんでした:

  • Tensorflowや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
1
mac13k

私は上記すべてを試しましたが、ここに私が見つけたものがあります:

  1. kerasのダウングレードが機能せず、通常の非フラスコ呼び出しでもモデルをロードできませんでした
  2. tb._SYMBOLIC_SCOPE.value = Trueも機能しませんでした
  3. 最終的に threaded=False AND debug=False機能しました。
1

パッケージのバージョンをダウングレードする必要はありません。 Kerasを使用している場合は、Flaskサーバーでapp.run(Host=<Host>, port=<PORT>, threaded=False)orターミナルでflask run --without-threadsを実行します。ただし、マルチスレッドを無効にする必要がないように、kerasではなくtensorflow.kerasを使用することをお勧めします。

1
Bhushan Mahajan

これらの解決策はどれも私にとってうまくいきませんでした。 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)

これがお役に立てば幸いです。

0

私はこの問題を次の方法で解決しました:

  1. Tensorflow、keras、およびflaskの最新バージョンを再インストールします(おそらくここで順序が重要です...)app.pyを実行するために使用した環境内に。
  2. TensorFlowからケラスをインポートする

現在のバージョン:

  • tensorflow == 2.1.0
  • keras == 2.3.1
  • tensorflow.keras == 2.2.4-tf
  • フラスコ== 1.1.1
0
Olga

私にとってこの作品:

モデルを作成する直前に配置する必要があります。

keras.backend.tensorflow_backendをtb tb._SYMBOLIC_SCOPE.value = Trueとしてインポート

0

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

働いた

0

ライブラリのバージョンをダウングレードする必要はありません。同じ問題がありましたが、flaskパラメータのみを微調整しました。

app.run("0.0.0.0", 5005, threaded=False)

これでようやく私のコードが実行されました!

まだ苦労している場合はお知らせください。

0
Anshul Verma