web-dev-qa-db-fra.com

Flask et modèle Keras Erreur '' _thread._local 'objet n'a pas d'attribut' valeur ''?

J'utilise ce qui suit: python 3.6.4

Flacon = 1.1.1,

Keras = 2.3.0,

TensorFlow = 1.14.0, j'ai un serveur Flask qui obtient les images des clients. En utilisant le modèle Keras avec un back-end TensorFlow, j'essaie d'obtenir une prédiction à partir d'un modèle pré-formé.

J'utilise la fonction suivante pour télécharger le modèle (dans le cadre d'une classe)


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

et j'utilise la ligne suivante pour la prédiction:

cm_prediction = self.model.predict([face, reye, leye, fg])[0]

Jusqu'à aujourd'hui, je n'ai eu aucun problème, j'ai toujours eu une prédiction. maintenant j'obtiens l'erreur suivante:

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'

J'ai un simple serveur Flask fonctionnant:

if __name__ == '__main__':
    pre = predictor()
    # app.run(debug=True)
    app.run(Host='0.0.0.0', port=12345)

Le modèle est toujours en cours de téléchargement.

Si j'exécute le programme sans le serveur Flask, donnant donc une entrée manuelle, j'obtiens une prédiction, mais dès que le - le serveur est allumé l'erreur apparaît et je arrêtez d'obtenir des prédictions

J'ai essayé de chercher sur le Web un problème similaire, mais je n'en ai trouvé aucun, si quelqu'un sait quel est le problème et comment le résoudre, j'apprécierai de le partager.

14
helpper

Ainsi, après une longue nuit, Keras avait sorti une nouvelle version 2.3.0 le 17 septembre 19. Dans le cadre de la mise à jour de la révision que j'ai faite, j'ai mis à jour toutes les bibliothèques, dont Keras. Depuis que je l'ai fait, le message est apparu.

Après avoir rétrogradé vers Keras 2.2.5, le problème a disparu.

18
helpper

J'ai eu le même problème lors de la construction d'un conteneur docker aujourd'hui, qui avait parfaitement fonctionné auparavant. Corrigé en rétrogradant la version Keras à 2.2.4.

4
Fridtjof Wabakken

Même problème lors du chargement de plusieurs modèles Keras via Flask. Pour résoudre le problème au lieu d'utiliser:

from keras.models import model_from_json

J'ai utilisé ceci:

from tensorflow.keras.models import model_from_json

À l'avenir, au lieu d'installer des keras, j'utiliserai tensorflow.keras.

J'espère que ça aide.

3
mlimam

J'ai eu le même problème avec Keras 2.3..

Un autre correctif pour ceux qui ne veulent pas rétrograder est de définir threaded=False Dans app.run().

2
Maxence Alluin

Si vous rencontrez des problèmes et êtes un peu lent comme moi, définissez également debug = False

2
Glen020

J'ai eu le même problème avec mes modèles Keras servis via Flask sur Google App Engine. En tenant compte des suggestions trouvées dans ce fil et dans d'autres endroits en ligne, j'ai essayé ce qui suit, dont aucun n'a résolu le problème d'origine:

  • La rétrogradation vers des versions plus anciennes de Tensorflow et/ou Keras a entraîné l'échec du chargement de mes modèles.
  • L'utilisation de app.run(threaded=False) n'a eu aucun effet.
  • Définition du contexte du graphique avec tensorflow.compat.v1.get_default_graph ou tensorflow.python.keras.backend.get_graph a causé d'autres erreurs.

Finalement, l'indice trouvé ici a apporté la solution et mon application a commencé à renvoyer des résultats valides pour toutes les demandes sans aucun problème lié au thread après avoir ajouté ces deux lignes au code:

import keras.backend.tensorflow_backend as tb
tb._SYMBOLIC_SCOPE.value = True
1
mac13k

J'ai essayé tout ce qui précède et voici ce que j'ai trouvé:

  1. la rétrogradation de Keras n'a pas fonctionné, même les appels non-flask réguliers n'ont pas pu charger les modèles
  2. tb._SYMBOLIC_SCOPE.value = True n'a pas fonctionné non plus
  3. enfin threaded=False ET debug=False travaillé.
1
joyjit chowdhury

Il n'est pas nécessaire de rétrograder les versions du package. Si vous utilisez Keras alors dans Flask serveur do app.run(Host=<Host>, port=<PORT>, threaded=False)or dans le terminal do flask run --without-threads. Cependant, je proposerai d'utiliser tensorflow.keras au lieu de keras, afin que vous n'ayez pas à désactiver le multithread.

1
Bhushan Mahajan

Aucune de ces solutions n'a fonctionné pour moi. Je suis passé de Flask à Bottle. Bottle est également un micro-framework WSGI rapide, simple et léger pour Python.

Pour installer la bouteille

pip insatll bottle

Après cela, toutes les syntaxes sont identiques à celles de Flask

from bottle import route, run, template

@route('/hello')
def index():
    return "Hello World"

run(Host='localhost', port=8080)

J'espère que cela vous aidera.

0

J'ai résolu ce problème en:

  1. Réinstaller les dernières versions de tensorflow, keras et flask (peut-être que l'ordre est important ici ...) dans l'environnement que j'avais l'habitude d'exécuter app.py
  2. Importer des keras depuis tensorflow

Versions actuelles:

  • tensorflow == 2.1.0
  • keras == 2.3.1
  • tensorflow.keras == 2.2.4-tf
  • flacon == 1.1.1
0
Olga

Ce travail pour moi:

vous devez le mettre juste avant la création du modèle.

import keras.backend.tensorflow_backend as tb tb._SYMBOLIC_SCOPE.value = True

0

la rétrogradation de Keras n'a pas fonctionné tb._SYMBOLIC_SCOPE.value = True n'a pas fonctionné threaded = False ET débogage = False n'a pas fonctionné

from keras.models import model_from_json

à

from tensorflow.keras.models import model_from_json

travaillé

0
Mritunjay Pathak

Pas besoin de rétrograder les versions de votre bibliothèque. J'ai eu le même problème mais j'ai seulement modifié le paramètre flask.

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

cela a finalement permis d'exécuter mon code!

Faites-moi savoir si vous avez encore du mal.

0
Anshul Verma