无法将feed_dict键解释为张量:张量Tensor(“ Placeholder:0”,shape =(135162,6),dtype = float32)不是此图的元素

时间:2019-08-09 09:18:05

标签: python rest flask keras

我使用Keras创建了一个用于情感分析的机器学习模型,并使用flask创建了一个简单的API,如下代码所示。对于第一个预测,它可以正常工作并在结果页面中提供输出,但是当我再次尝试时,它给出了上面的错误。

我已经看到了一些类似的问题及其解决方案,但是这些解决方案对我不起作用。我也尝试了其他方法来保存和加载在keras上创建的模型,但无济于事。

#importing libraries
import os
import numpy as np
import flask
from flask import Flask, render_template, request
from keras.models import model_from_json, load_model
from sentiment_analysis import max_length, tokenizer_obj
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import tensorflow as tf
import pickle

#creating instance of the class
app=Flask(__name__)

@app.route('/')
def welcome():
    return flask.render_template('welcome.html')

#prediction function
def ValuePredictor(to_predict):
    #to_predict = np.reshape(to_predict, (-1, len(to_predict)))
#     json_file = open('model.json', 'r')
#     loaded_model_json = json_file.read()
#     json_file.close()
#     loaded_model = model_from_json(loaded_model_json)
#     # load weights into new model
#     loaded_model.load_weights("model.h5")
    model = pickle.load(open("model.pkl","rb"))
    print("Loaded model from disk")
    result = model.predict(to_predict)
    tf.reset_default_graph()
    return result

@app.route('/result',methods = ['POST'])
def result():
    if request.method == 'POST':
        to_predict_list = request.form.to_dict()
        to_predict_list=list(to_predict_list.values())
        test_tokens = tokenizer_obj.texts_to_sequences(to_predict_list)
        test_pad = pad_sequences(test_tokens, maxlen = max_length, padding= 'post')
        print(test_pad)
        result = ValuePredictor(test_pad)
        return render_template("result.html",prediction=result)

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

我希望输入文本,然后在结果页面中接收结果,然后返回主页并输入新文本,并获得另一个结果,依此类推。

当前,它第一次正常运行,然后在此之后的时间里给出错误。

1 个答案:

答案 0 :(得分:0)

在代码中添加以下内容即可解决问题!

from keras import backend as K

 K.clear_session()

我在预测后将其添加到这样的地方:

def ValuePredictor(to_predict):
    model = pickle.load(open("model.pkl","rb"))
    print("Loaded model from disk")
    result = model.predict(to_predict)
    K.clear_session()
    return result