Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在Flask应用程序中加载包含scikit学习模型的pickle文件?_Python 3.x_Flask_Scikit Learn - Fatal编程技术网

Python 3.x 如何在Flask应用程序中加载包含scikit学习模型的pickle文件?

Python 3.x 如何在Flask应用程序中加载包含scikit学习模型的pickle文件?,python-3.x,flask,scikit-learn,Python 3.x,Flask,Scikit Learn,我正在尝试创建一个简单的基于Flask的web应用程序,用户在其中输入一些文本并接收其情感分类。我在加载一个pickle文件时遇到问题,该文件是我在使用scikit learn训练模型后保存的。我试图加载的文件是tfidf\u vectorizer\u train.pkl,当我调用load\u tfidf\u model函数时,应该已加载该文件。每当我在本地运行应用程序时,就会出现以下错误 AttributeError:“非类型”对象没有属性“转换” 我怀疑这是由于模型未能加载,全局变量tfid

我正在尝试创建一个简单的基于Flask的web应用程序,用户在其中输入一些文本并接收其情感分类。我在加载一个pickle文件时遇到问题,该文件是我在使用scikit learn训练模型后保存的。我试图加载的文件是
tfidf\u vectorizer\u train.pkl
,当我调用
load\u tfidf\u model
函数时,应该已加载该文件。每当我在本地运行应用程序时,就会出现以下错误

AttributeError:“非类型”对象没有属性“转换”

我怀疑这是由于模型未能加载,全局变量
tfidf_model
仍为None类型

如果有帮助,则当前目录如下所示

├── ml_app.py
├── models
│   └── tfidf_vectorizer_train.pkl
├── templates
│   └── main.html
其中
ml_app.py
包含以下代码

from flask import Flask, request, render_template 
from sklearn.externals import joblib

app = Flask(__name__)

models_directory = 'models'

tfidf_model = None


def load_tfidf_model():

    global tfidf_model

    tfidf_model = joblib.load('{}/tfidf_vectorizer_train.pkl'.format(models_directory))


@app.route('/') 
def my_form():
    return render_template('main.html')


@app.route('/', methods=['POST']) 
def my_form_post():

    text = request.form['text']

    # clean using tfidf
    comment_term_doc = tfidf_model.transform([text])
    processed_text = comment_term_doc.toarray()

    return render_template('main.html', text=text, processed_text=processed_text)


if __name__ == '__main__':

    try:
        load_tfidf_model()
        print("Model loaded")

    except Exception as e:
        print("Model loading failed")
        print(str(e))

    app.run()

正如您显然得出的结论,在调用
my\u form\u post
路由方法之前,您需要调用
load\u tfidf\u model
。一个可能的结论是
joblib.load
失败。您不会在任何地方检查返回值

由于您没有报告任何异常,我假设没有发生任何异常

建议可以返回任何Python类型,因此您可能需要查看创建加载文件的代码


风格问题:与其使用全局,不如让
load\u tfidf\u model
返回
joblib.load
返回的值,并将其保存在调用代码中(不需要将其声明为全局)。Globals不是函数间通信的好方法。

谢谢您的回答。我解决了这个问题。当我使用
flask run
启动服务器时,我得到一个错误,即模型尚未加载。但是,当我使用python ml_app.py(应用程序的名称)启动它时,它可以工作,并且在name=='main'下运行所有内容,这就是我加载模型所需要的。