Python 3.x 如何在Flask应用程序中加载包含scikit学习模型的pickle文件?
我正在尝试创建一个简单的基于Flask的web应用程序,用户在其中输入一些文本并接收其情感分类。我在加载一个pickle文件时遇到问题,该文件是我在使用scikit learn训练模型后保存的。我试图加载的文件是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
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'下运行所有内容,这就是我加载模型所需要的。