Приложение PYTHON FLASK (с KERAS и бэкэндом тензорного потока): невозможно загрузить модель во время выполнения: «График сеанса пуст» - PullRequest
0 голосов
/ 14 мая 2019

У меня есть код Python, работающий с моделью KERAS LSTM, который прекрасно работает при непосредственном запуске с использованием кода Python (либо через SPYDER, либо через командную строку).

Python (anaconda): 3.6.7 FLASK: 0.12.3КЕРАС: 2.2.4 TENSORFLOW: 1.10.0

При попытке запустить его как приложение FLASK тот же код выдает следующую ошибку: Ошибка: граф сеанса пуст.Добавьте операции в график перед вызовом run ().

Мне пришлось установить сеанс и установить начальное значение, чтобы результаты модели не отличались от разных прогонов.Я использовал код из документации Керы (https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development) в своем коде, и он работает абсолютно нормально, когда запускается как простой скрипт на python.

Проблема возникает только при попытке запустить его вприложение Flask (что не имеет смысла).

Ошибка в коде появляется в строке, где я пытаюсь загрузить модель из сохраненного файла h5.

Может кто-нибудь помочь мнес этой проблемой?

Прочитал в основном все подобные проблемы из google и StackOverflow, но ни один из вариантов не сработал.

Я также проверил репозиторий KERAS на github, и, похоже, открыта та же проблемакак билет с 1 года. (https://github.com/keras-team/keras/issues/10585)

код приложения FLASK (app.py):

from flask import Flask, jsonify

from PREDICT import worker

app = Flask(__name__)

@app.route('/api/Model', methods=['GET', 'POST'])
def Model_predict():
    worker()
    return ('Model run')

if __name__ == '__main__':
    app.run(debug=True)

код, который я использовал для установки сеанса (взятого с сайта документации KERAS), которыйприсутствует в PREDICT.py: **

# The below is necessary for starting Numpy generated random numbers in a well-defined initial state.
np.random.seed(42)
# The below is necessary for starting core Python generated random numbers in a well-defined state.
rn.seed(12345)

# Force TensorFlow to use single thread.
# Multiple threads are a potential source of non-reproducible results.
# For further details, see: https://stackoverflow.com/questions/42022950/
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1,
                              inter_op_parallelism_threads=1)
from keras import backend as K
# The below tf.set_random_seed() will make random number generation in the TensorFlow backend have a well-defined initial state.
# For further details, see: https://www.tensorflow.org/api_docs/python/tf/set_random_seed

tf.set_random_seed(1234)

sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(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().
**

1 Ответ

0 голосов
/ 15 мая 2019

После тщательного поиска я наткнулся на этот блог, который помог мне понять, как Flask и Keras работают в тандеме.

https://towardsdatascience.com/deploying-keras-deep-learning-models-with-flask-5da4181436a2

Решение (если оно понадобится позже) состоит в том, что вам нужно сделать 2 вещи:

  1. определить график как глобальный
global graph
graph = tf.get_default_graph()
sess = tf.Session(graph=graph, config=session_conf)
  1. перед загрузкой модели и прогнозированием оберните ее в цикле, чтобы новый график генерировался для каждого цикла
with graph.as_default():

примечание: если вы получаете сообщение об ошибке типа «ValueError: сигнал работает только в основном потоке», проверьте пакет FLask-SocketIO - вам может потребоваться удалить его и установить заново с последней версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...