Ошибка ValueError при прогнозировании сохраненной модели машинного обучения в api rest колбы - PullRequest
0 голосов
/ 01 ноября 2018

Я обучил и сохранил модель, используя model.save('filename.h5'). Он работает для прогнозирования, но когда я загружаю ту же модель в flask_app и пытаюсь сделать прогноз, я получаю ValueError:

Трассировка для этого:

The data type of the acquired data from the post call: <class 'str'>

Preprocessing
Pre-processing complete
Data type of the input data: <class 'numpy.ndarray'>
Predicting for requirement:
[2018-11-01 15:34:56,261] ERROR in app: Exception on /predict [POST]
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\singroha\PycharmProjects\smart_classification_ML_model\flask_app\predict_app.py", line 99, in predict
    prediction = requirement_model.predict(r_predict_text)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 1164, in predict
    self._make_predict_function()
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 554, in _make_predict_function
    **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", line 2744, in function
    return Function(inputs, outputs, updates=updates, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", line 2546, in __init__
    with tf.control_dependencies(self.outputs):
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 5002, in control_dependencies
    return get_default_graph().control_dependencies(control_inputs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4541, in control_dependencies
    c = self.as_graph_element(c)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3488, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3567, in _as_graph_element_locked
    raise ValueError("Tensor %s is not an element of this graph." % obj)
ValueError: Tensor Tensor("dense_7/Softmax:0", shape=(?, 2), dtype=float32) is not an element of this graph.

Поток вещей:

  • Я запускаю сервер фляг, который загружает сохраненные модели
  • Когда он получает запрос от клиента, вызывается метод предсказания
  • Я предварительно обработал данные, чтобы подготовить их к вводу в модель
  • Тогда я пытаюсь предсказать, и это происходит

То, что я думал, и то, что я делал:

  • Я подумал, что просто неправильно обрабатывает данные
  • Итак, я собрал предварительно обработанные данные, вернулся к обучению модели и использовал этот протравленный объект, чтобы сделать прогноз, и он работает.

Я попытался поиграть с функцией _make_predict_function и попробовать некоторые вещи, которые я нашел в Интернете, но, похоже, не работал для меня. Любое понимание этого очень ценится. Спасибо

Вот функция прогнозирования для flask_app:

@app.route("/predict", methods=["POST"])
# @cross_origin(origin='localhost',headers=['Content- Type','Authorization'])
def predict():
    post_message = request.get_json(force=True)

    # Logging
    print('Data message received from the client', post_message)
    print("\nThe data type of the acquired data from the post call:", type(post_message))

    requirement = []
    requirement.append(post_message)

    # Preprocessing data
    r_predict_text, (sent_text, s_predict_text) = preprocess_data(requirement)

    # print("\n\n printing preprocessed data:")
    # print(r_predict_text)

    # Saving the preprocessing data for varification
    # with open('text_req.pickle', 'wb') as pickle_file:
    #     pickle.dump(r_predict_text, pickle_file, protocol=pickle.HIGHEST_PROTOCOL)

    print('Data type of the input data:', type(r_predict_text))
    print('Predicting for requirement:')

    # Everything goes down at this point after receiving request
    prediction = requirement_model.predict(r_predict_text) 

    # Ignore this, for now, I was trying to see if the response gets send back if take out the predict function call
    prediction = 'SMART'

    response = {
        'prediction': {
            'SMART': prediction
        }
    }
    print('sending response to the client')
    return jsonify(response)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...