Estoy usando lo siguiente: python 3.6.4
Matraz = 1.1.1,
Keras = 2.3.0,
TensorFlow = 1.14.0, tengo un servidor Flask que obtiene imágenes de los clientes. Usando el modelo de Keras con un back-end de TensorFlow, trato de obtener una predicción de un modelo previamente entrenado.
Estoy usando la siguiente función para cargar el modelo (como parte de una clase)
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 ")y uso la siguiente línea para la predicción:
cm_prediction = self.model.predict([face, reye, leye, fg])[0]Hasta el día de hoy no tuve ningún problema, siempre obtuve una predicción. ahora me sale el siguiente error :
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'Tengo un servidor Flask simple ejecutándose:
if __name__ == '__main__': pre = predictor() # app.run(debug=True) app.run(host='0.0.0.0', port=12345)El modelo siempre se está cargando.
Si estoy ejecutando el programa sin el servidor Flask , por lo tanto, ingresando manualmente, obtengo una predicción , pero tan pronto como el servidor está encendido , aparece el error y dejo de recibir predicciones .
Intenté buscar en la web algún problema similar pero no encontré ninguno, si alguien sabe cuál es el problema y cómo solucionarlo, agradeceré que lo comparta.
No es necesario degradar Keras ni deshabilitar los subprocesos múltiples. Use Keras con TensorFlow como back-end:
from tensorflow.keras.models import load_modelPara Django : use este comando para ejecutar el servidor
python manage.py runserver --nothreading --noreloadfunciona perfectamente bien para mí
Si está utilizando la versión 2.2 de tensorflow, la actualización de Keras a 2.2.5 no le ayudará porque tensorflow 2.2 necesitará una versión de keras superior a 2.3 . En ese caso, definir la variable del gráfico será suficiente.
entonces en su app.py, agregue estas dos líneas de código en la parte superior.
global graph graph = tf.compat.v1.get_default_graph()La degradación de las versiones de Keras y Tensorflow no funciona. Incluso establecer Threaded=False en app.py no resuelve el problema por sí solo. También debe configurar debug = False . Seguir funciona sin fallas.
if __name__ == '__main__': app.run(debug=False,threaded=False)Intenté todo lo anterior y esto es lo que encontré:
tb._SYMBOLIC_SCOPE.value = True tampoco funcionóthreaded=False AND debug=False funcionó.degradar Keras no funcionó tb._SYMBOLIC_SCOPE.value = True no funcionó threaded=False AND debug=False no funcionó
from keras.models import model_from_jsonpara
from tensorflow.keras.models import model_from_jsontrabajó
Este trabajo para mí:
debes ponerlo justo antes de la creación del modelo.
importar keras.backend.tensorflow_backend como tb tb._SYMBOLIC_SCOPE.value = True
Ninguna de estas soluciones funcionó para mí. Cambié de Frasco a Botella. Bottle también es un micro-framework web WSGI rápido, simple y liviano para Python.
Para instalar la botella
pip insatll bottleDespués de eso, todas las sintaxis son las mismas que Flask
from bottle import route, run, template @route('/hello') def index(): return "Hello World" run(host='localhost', port=8080)No es necesario degradar las versiones de su biblioteca. Tuve el mismo problema pero solo modifiqué el parámetro del matraz.
app.run("0.0.0.0", 5005, threaded=False)
¡esto hizo que finalmente ejecutara mi código!
Avísame si todavía estás luchando.
Si sigue siendo relevante, solucioné este problema simplemente cambiando
from keras.models import Sequential from keras.layers import Dense, Dropout, LSTMpara
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, LSTMPor lo tanto, no es necesario desactivar los subprocesos múltiples.
por favor, asegúrese de hacer el valor de threaded=False Ejemplo: para matraz :
if name == 'main': app.run(threaded=False)Mismo problema al cargar varios modelos de Keras a través de Flask. Para resolver el problema en lugar de usar:
from keras.models import model_from_jsonUsé esto:
from tensorflow.keras.models import model_from_jsonEn el futuro, en lugar de instalar keras, usaré tensorflow.keras.
Espero que ayude.
No hay necesidad de degradar las versiones del paquete. Si está utilizando Keras , entonces en el servidor Flask haga app.run(host=<HOST>, port=<PORT>, threaded=False) o en la terminal haga flask run --without-threads . Sin embargo, sugeriré usar tensorflow.keras en lugar de keras , para que no tenga que deshabilitar los subprocesos múltiples.
Tuve el mismo problema con mis modelos Keras servidos a través de Flask en Google App Engine. Teniendo en cuenta las sugerencias encontradas en este hilo y otros lugares en línea, probé lo siguiente, ninguno de los cuales resolvió el problema original:
app.run(threaded=False) no tuvo ningún efecto.tensorflow.compat.v1.get_default_graph o tensorflow.python.keras.backend.get_graph provocó algunos otros errores.Finalmente, la sugerencia que se encuentra aquí trajo la solución y mi aplicación comenzó a mostrar resultados válidos para todas las solicitudes sin ningún problema relacionado con el subproceso después de agregar estas dos líneas al código:
import keras.backend.tensorflow_backend as tb tb._SYMBOLIC_SCOPE.value = TrueResolví este problema por:
app.pyVersiones actuales:
Tuve el mismo problema al construir un contenedor docker hoy, que había funcionado perfectamente antes. Se solucionó degradando la versión de Keras a 2.2.4.
Entonces, después de una larga noche, Keras lanzó una nueva versión 2.3.0 el 17 y 19 de septiembre. Como parte de la actualización de revisión que hice, actualicé todas las bibliotecas, Keras entre ellas. Desde que lo hice me apareció el mensaje.
Después de volver a actualizar a Keras 2.2.5, el problema desapareció.
Tuve el mismo problema con Keras 2.3.0 .
Otra solución para aquellos que no quieren bajar de categoría es configurar threaded=False en app.run() .
Si tiene problemas y es un poco lento como yo, establezca debug=False también