【问题标题】:Flask and Keras model Error ''_thread._local' object has no attribute 'value''?Flask 和 Keras 模型错误“_thread._local”对象没有属性“值”?
【发布时间】:2020-01-20 18:03:22
【问题描述】:

我正在使用以下内容: 蟒蛇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 服务器,因此手动输入,我得到一个预测,但只要 服务器开启 出现错误,我停止获得预测

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

【问题讨论】:

  • 我现在也遇到同样的情况。就我而言,我已将原因缩小到从我正在使用的包的另一部分导入的一些内容。在这开始发生之前,您是否添加了任何新的导入?
  • 我唯一能想到的是我之前添加的from scipy.spatial import distance as dist

标签: python tensorflow flask keras


【解决方案1】:

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

from tensorflow.keras.models import load_model

【讨论】:

    【解决方案2】:

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

    python manage.py runserver --nothreading --noreload
    

    对我来说效果很好

    【讨论】:

      【解决方案3】:

      Keras 和 Tensorflow 版本的降级不起作用。即使在 app.py 中设置 Threaded=False 也不能自行解决问题。您还需要设置debug = False。以下工作没有任何失败。

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

      【讨论】:

        【解决方案4】:

        这些解决方案都不适合我。我从 Flask 切换到了 Bottle。 Bottle 也是一个快速、简单、轻量级的 Python WSGI 微型网络框架。

        安装瓶子

        pip insatll bottle
        

        之后所有语法都和Flask一样

        from bottle import route, run, template
        
        @route('/hello')
        def index():
            return "Hello World"
        
        run(host='localhost', port=8080)
        

        【讨论】:

          【解决方案5】:

          如果您使用的是 tensorflow 2.2 版本,将 Keras 降级到 2.2.5 对您没有帮助,因为 tensorflow 2.2 将需要 keras 版本大于 2.3。 在这种情况下,定义 graph 变量将为您解决问题。

          所以在你的 app.py 中,在顶部添加这两行代码。

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

          【讨论】:

            【解决方案6】:

            请确保您应该设置 threaded=False 的值 例子 : 对于烧瓶

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

            【讨论】:

            • 你不是说if __name__ == '__main__'吗? :)
            【解决方案7】:

            如果它仍然相关,我只是通过更改解决了这个问题

            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
            

            所以,不需要关闭多线程。

            【讨论】:

            • 当我使用 PyQt5 时,这对我有用。我在 mtcnn 库中将 Keras 的每个导入都更改为 tensorflow.keras,它就像一个魅力。谢谢老兄!
            【解决方案8】:

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

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

            这使它终于可以运行我的代码了!

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

            【讨论】:

            • 我的救星。非常感谢。
            • 乐于助人并乐于成为这个社区的一员!
            【解决方案9】:

            这对我有用:

            你必须把它放在模型创建之前。

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

            【讨论】:

              【解决方案10】:

              降级 Keras 不起作用 tb._SYMBOLIC_SCOPE.value = True 没用 thread=False AND debug=False 不起作用

              from keras.models import model_from_json
              

              from tensorflow.keras.models import model_from_json
              

              工作

              【讨论】:

                【解决方案11】:

                我尝试了以上所有方法,结果如下:

                1. 降级 Keras 不起作用,即使是常规的非烧瓶调用也无法加载模型
                2. tb._SYMBOLIC_SCOPE.value = True 也不起作用
                3. 终于threaded=False AND debug=False 工作了。

                【讨论】:

                • 这是一个答案,承认可能不是一个很好的答案。海报是说什么不起作用,然后在第三点说什么对他们起作用。
                【解决方案12】:

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

                1. 在我以前运行的环境中重新安装最新版本的 tensorflow、keras 和 flask(可能这里的顺序很重要...)app.py
                2. 从 tensorflow 导入 keras

                当前版本:

                • 张量流==2.1.0
                • keras==2.3.1
                • tensorflow.keras==2.2.4-tf
                • 烧瓶==1.1.1

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                    【解决方案14】:

                    通过 Flask 加载多个 Keras 模型时出现同样的问题。 解决问题而不是使用:

                    from keras.models import model_from_json
                    

                    我用过这个:

                    from tensorflow.keras.models import model_from_json
                    

                    将来我将使用 tensorflow.keras,而不是安装 keras。

                    希望对你有帮助。

                    【讨论】:

                      【解决方案15】:

                      我在通过 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
                      

                      【讨论】:

                        【解决方案16】:

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

                        【讨论】:

                        • 当我在 GCP 上部署我的应用程序时,这确实帮助了我。但这里的确切问题是什么?这个解决方案对我来说就像在作弊......编辑:我的 Keras 是 2.3.1 版
                        【解决方案17】:

                        我在使用 Keras 2.3.0 时遇到了同样的问题。

                        对于那些不想降级的人来说,另一个解决方法是在app.run() 中设置threaded=False

                        【讨论】:

                        • 我有同样的问题,这个 app.run() 到底是什么?
                        【解决方案18】:

                        所以在漫长的一夜之后, Keras 在 2019 年 9 月 17 日发布了新版本 2.3.0。 作为修订更新的一部分,我更新了所有库,其中包括 Keras。既然我这样做了,消息就出现了。

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

                        【讨论】:

                        • 经过几个小时的追逐进口,这也解决了我的问题。谢谢!
                        • 这救了我,谢谢。有人打开过 Keras 的错误报告吗?
                        • 经过数小时的调试不同导入并惨遭失败后,我将 Keras 设置为 2.2.4 并将 TF 设置为 1.13.1 并解决了我的所有错误。似乎 Keras 和 TF 的较新版本无法与旧版本兼容。
                        【解决方案19】:

                        我今天在构建 docker 容器时遇到了同样的问题,之前它运行良好。通过将 Keras 版本降级到 2.2.4 来修复它。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-01-11
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-03-15
                          • 1970-01-01
                          • 2021-09-14
                          相关资源
                          最近更新 更多