Flask和Keras模型错误“ _thread._local”对象没有属性“值”?

时间:2019-09-19 16:38:49

标签: python tensorflow flask keras

我正在使用以下内容: python 3.6.4

烧瓶= 1.1.1,

Keras = 2.3.0,

TensorFlow = 1.14.0, 我有一个Flask服务器,可以从客户端获取图片。结合使用Keras模型和TensorFlow后端,我尝试从预先训练的模型中获得预测。

我正在使用以下函数上传模型(作为课程的一部分)


 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服务器的情况下运行程序 ,因此进行了手动输入,我得到了一个预测,但是只要服务器打开,< / strong>出现错误,我停止获取预测

我试图在网上寻找类似的问题,但没有发现任何问题,如果有人知道问题所在以及如何解决问题,我将不胜感激。

18 个答案:

答案 0 :(得分:16)

所以,经过漫长的夜晚, Keras已在19年9月17日发布了新版本2.3.0。 作为修订版本的一部分,我更新了所有库,其中包括Keras。自从我做到了,消息就出现了。

我降级到Keras 2.2.5后,问题消失了。

答案 1 :(得分:4)

今天构建Docker容器时,我遇到了同样的问题。通过将Keras版本降级到2.2.4对其进行了修复。

答案 2 :(得分:3)

如果仍然有用,我只需更改

即可解决此问题。
from keras.models import Sequential

from keras.layers import Dense, Dropout, LSTM

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM

因此,无需关闭多线程。

答案 3 :(得分:2)

不需要降级软件包的版本。如果您使用的是Keras,则在Flask服务器上执行app.run(host=<HOST>, port=<PORT>, threaded=False) 在终端中执行flask run --without-threads。但是,我建议使用tensorflow.keras代替keras,这样就不必禁用多线程。

答案 4 :(得分:2)

无需降级您的库版本。 我遇到过同样的问题 但是我只调整了flask参数。

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

这使得它最终运行了我的代码!

如果您仍在挣扎,请告诉我。

答案 5 :(得分:1)

无需降级 Keras 或禁用多线程。使用 KerasTensorFlow 作为后端:

from tensorflow.keras.models import load_model

答案 6 :(得分:1)

请确保您设置的值为 threaded=False 范例: 对于烧瓶

if name == 'main':
    app.run(threaded=False)

答案 7 :(得分:1)

我尝试了以上所有方法,这是我发现的东西:

  1. 降级Keras无效,即使常规的非烧瓶调用也无法加载模型
  2. tb._SYMBOLIC_SCOPE.value = True也不起作用
  3. 最终threaded=Falsedebug=False都成功了。

答案 8 :(得分:1)

如果您遇到问题并且像我一样有点慢,请同时设置debug = False

答案 9 :(得分:1)

我在 Keras 2.3.0 中遇到了同样的问题。

对于不想降级的其他解决方法是在threaded=False中设置app.run()

答案 10 :(得分: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

工作

答案 11 :(得分:0)

为我工作:

您必须将其放置在模型创建之前。

将keras.backend.tensorflow_backend导入为tb tb._SYMBOLIC_SCOPE.value = True

答案 12 :(得分:0)

这些解决方案都不适合我。我从烧瓶转到瓶子。 Bottle还是一种适用于Python的快速,简单,轻量级的WSGI微型网络框架。

要安装奶瓶

mt_rand()

之后,所有语法都与Flask相同

pip insatll bottle

答案 13 :(得分:0)

我通过以下方法解决了这个问题:

  1. 在我曾经运行过app.py的环境中重新安装tensorflow,keras和flask的最新版本(可能在这里有问题……)
  2. 从tensorflow导入角膜

当前版本:

  • tensorflow == 2.1.0
  • keras == 2.3.1
  • tensorflow.keras == 2.2.4-tf
  • flask == 1.1.1

答案 14 :(得分:0)

我在通过Google App Engine上的Flask服务的Keras模型上遇到了同样的问题。考虑到在此线程和其他在线位置找到的建议,我尝试了以下操作,但没有一个解决了原始问题:

  • 降级到Tensorflow和/或Keras的较旧版本导致我 模型无法加载。
  • 使用app.run(threaded = False)无效 全部。
  • 通过设置图上下文 tensorflow.compat.v1.get_default_graphtensorflow.python.keras.backend.get_graph引起了其他一些错误。

最终,发现here的提示带来了解决方案,在将以下两行添加到代码中之后,我的应用程序开始为所有请求返回有效结果,而没有任何与线程相关的问题:

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

答案 15 :(得分:0)

如果您使用的是Tensorflow 2.2版本,将Keras降级到2.2.5将无济于事,因为TensorFlow 2.2将需要一个大于2.3的keras版本。 在这种情况下,定义 graph 变量将为您解决问题。

因此,在您的app.py中,在顶部添加这两行代码。

global graph
graph = tf.compat.v1.get_default_graph()

答案 16 :(得分:0)

无法对Keras和Tensorflow版本进行降级。即使在app.py中设置Threaded=False本身也不能解决问题。您还需要设置debug = False。以下操作不会出现任何故障。

if __name__ == '__main__':
app.run(debug=False,threaded=False)

答案 17 :(得分:0)

对于Django: 使用此命令运行服务器

python manage.py runserver --nothreading --noreload

对我来说很好用