我正在使用以下内容: 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>出现错误,我停止获取预测
我试图在网上寻找类似的问题,但没有发现任何问题,如果有人知道问题所在以及如何解决问题,我将不胜感激。
答案 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
或禁用多线程。使用 Keras
和 TensorFlow
作为后端:
from tensorflow.keras.models import load_model
答案 6 :(得分:1)
请确保您设置的值为 threaded=False
范例:
对于烧瓶:
if name == 'main':
app.run(threaded=False)
答案 7 :(得分:1)
我尝试了以上所有方法,这是我发现的东西:
tb._SYMBOLIC_SCOPE.value = True
也不起作用threaded=False
和debug=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)
我通过以下方法解决了这个问题:
app.py
的环境中重新安装tensorflow,keras和flask的最新版本(可能在这里有问题……)当前版本:
答案 14 :(得分:0)
我在通过Google App Engine上的Flask服务的Keras模型上遇到了同样的问题。考虑到在此线程和其他在线位置找到的建议,我尝试了以下操作,但没有一个解决了原始问题:
tensorflow.compat.v1.get_default_graph
或
tensorflow.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
对我来说很好用