Python 3.x PYTHON FLASK应用程序(带有KERAS和tensorflow后端):无法在运行时加载模型:';会话图为空';

Python 3.x PYTHON FLASK应用程序(带有KERAS和tensorflow后端):无法在运行时加载模型:';会话图为空';,python-3.x,tensorflow,flask,keras,lstm,Python 3.x,Tensorflow,Flask,Keras,Lstm,当直接使用python代码(通过SPYDER或通过命令提示符)运行时,我有一个运行KERAS LSTM模型的python代码 巨蟒(蟒蛇):3.6.7 烧瓶:0.12.3 KERAS:2.2.4 TENSORFLOW:1.10.0 当尝试将其作为FLASK应用程序运行时,相同的代码会引发以下错误: 错误:会话图为空。在调用run()之前向图形中添加操作。 我必须设置会话和种子,这样模型的结果就不会因不同的运行而有所不同。 我在代码中使用了Kera的docs()中的代码,当作为一个简单的pytho

当直接使用python代码(通过SPYDER或通过命令提示符)运行时,我有一个运行KERAS LSTM模型的python代码

巨蟒(蟒蛇):3.6.7 烧瓶:0.12.3 KERAS:2.2.4 TENSORFLOW:1.10.0

当尝试将其作为FLASK应用程序运行时,相同的代码会引发以下错误: 错误:会话图为空。在调用run()之前向图形中添加操作。

我必须设置会话和种子,这样模型的结果就不会因不同的运行而有所不同。 我在代码中使用了Kera的docs()中的代码,当作为一个简单的python脚本运行时,它运行得非常好

只有在烧瓶应用程序中运行时才会出现问题(这没有意义)

代码中的错误出现在我试图从保存的h5文件加载模型的那一行

有人能帮我解决这个问题吗

我读过谷歌和StackOverflow的大部分类似问题,但没有一个解决方案

我还检查了KERAS的github回购协议,自1年以来似乎存在与罚单相同的问题。()

烧瓶应用程序代码(app.py):

我用来设置PREDICT.py中存在的会话(取自KERAS的文档站点)的代码: **

#以下是在定义良好的初始状态下启动Numpy生成的随机数所必需的。
np.随机种子(42)
#以下是在定义良好的状态下启动核心Python生成的随机数所必需的。
rn.种子(12345)
#强制TensorFlow使用单螺纹。
#多线程是不可再现结果的潜在来源。
#有关详细信息,请参阅:https://stackoverflow.com/questions/42022950/
session\u conf=tf.ConfigProto(intra\u op\u parallelism\u threads=1,
线程间并行度(线程=1)
从keras导入后端为K
#下面的tf.set_random_seed()将使TensorFlow后端中的随机数生成具有定义良好的初始状态。
#有关详细信息,请参阅:https://www.tensorflow.org/api_docs/python/tf/set_random_seed
tf.设置随机种子(1234)
sess=tf.Session(graph=tf.get\u default\u graph(),config=Session\u conf)
K.SETU会话(sess)
**
预期的结果是,应该正确加载模型文件,以便稍后用于预测

错误详细信息:

**
2019-05-15 00:19:19,121 ERROR  : Error at Line : 363
2019-05-15 00:19:19,122 ERROR  : Error : The Session graph is empty.  Add operations to the graph before calling run().
2019-05-15 00:19:19,123 ERROR Stack Trace : 
Traceback (most recent call last):
  File "PREDICT.py", line 363, in worker
    model = loading_model(output_path, weekno, prod)
  File "PREDICT.py", line 104, in loading_model
    m = load_model(model_name)
  File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\saving.py", line 419, in load_model
    model = _deserialize_model(f, custom_objects, compile)
  File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\saving.py", line 287, in _deserialize_model
    K.batch_set_value(weight_value_tuples)
  File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", line 2470, in batch_set_value
    get_session().run(assign_ops, feed_dict=feed_dict)
  File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 877, in run
    run_metadata_ptr)
  File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 1025, in _run
    raise RuntimeError('The Session graph is empty.  Add operations to the '
RuntimeError: The Session graph is empty.  Add operations to the graph before calling run().
**

经过彻底的研究,我发现了这个博客,它帮助我了解了Flask和Keras是如何协同工作的

解决方案(如果以后有人需要)是您需要做两件事:

  • 将图形定义为全局
  • 在加载模型和预测之前,将其包装在一个循环下,以便为每个循环生成一个新的图

  • 注意:如果您遇到一些错误,如“ValueError:signal仅在主线程中工作”,请检查您的FLask SocketIO软件包-您可能需要卸载并使用最新版本重新安装它。

    在彻底搜索之后,我看到了这个博客,它帮助我了解FLask和Keras是如何协同工作的

    解决方案(如果以后有人需要)是您需要做两件事:

  • 将图形定义为全局
  • 在加载模型和预测之前,将其包装在一个循环下,以便为每个循环生成一个新的图

  • 注意:如果您遇到诸如“ValueError:signal仅在主线程中工作”之类的错误,请检查FLask SocketIO软件包-您可能需要卸载并使用最新版本重新安装它。

    我也面临同样的问题。将模型包装在循环下是什么意思?Thanks@ArthurClerc-Gherardi——在我的例子中,我必须在一个循环中运行每个产品的模型,因此有了评论。您可以在不使用循环的情况下执行此操作,只需将代码包含在上面提到的WITH子句中,它就可以正常工作。嗯。。好啊你有这个项目的开放github吗?我希望看到整个实施过程。我对每个http请求都使用相同的模型,我面临着同样的问题。将模型包装在循环下是什么意思?Thanks@ArthurClerc-Gherardi——在我的例子中,我必须在一个循环中运行每个产品的模型,因此有了评论。您可以在不使用循环的情况下执行此操作,只需将代码包含在上面提到的WITH子句中,它就可以正常工作。嗯。。好啊你有这个项目的开放github吗?我希望看到整个实施过程。我对每个http请求都使用相同的模型。
    **
    2019-05-15 00:19:19,121 ERROR  : Error at Line : 363
    2019-05-15 00:19:19,122 ERROR  : Error : The Session graph is empty.  Add operations to the graph before calling run().
    2019-05-15 00:19:19,123 ERROR Stack Trace : 
    Traceback (most recent call last):
      File "PREDICT.py", line 363, in worker
        model = loading_model(output_path, weekno, prod)
      File "PREDICT.py", line 104, in loading_model
        m = load_model(model_name)
      File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\saving.py", line 419, in load_model
        model = _deserialize_model(f, custom_objects, compile)
      File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\saving.py", line 287, in _deserialize_model
        K.batch_set_value(weight_value_tuples)
      File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", line 2470, in batch_set_value
        get_session().run(assign_ops, feed_dict=feed_dict)
      File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 877, in run
        run_metadata_ptr)
      File "C:\Users\12345\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 1025, in _run
        raise RuntimeError('The Session graph is empty.  Add operations to the '
    RuntimeError: The Session graph is empty.  Add operations to the graph before calling run().
    **
    
    global graph
    graph = tf.get_default_graph()
    sess = tf.Session(graph=graph, config=session_conf)
    
    with graph.as_default():