如何在烧瓶应用程序中加载包含Scikit-Learn模型的泡菜文件



我正在尝试创建一个简单的基于烧瓶的Web应用程序,其中用户输入一些文本并接收其情感分类。我在使用Scikit-Learn训练模型后保存的泡菜文件很难。我要加载的文件是tfidf_vectorizer_train.pkl,当我将函数调用到load_tfidf_model时,该文件应该已加载。每当我本地运行该应用程序时,我都会收到以下错误

attributeError:'nontype'对象没有属性'变换'

我怀疑是由于模型未能加载而引起的,而全局变量tfidf_model仍然是无类型。

如果有帮助,当前目录看起来像

├── 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()

显然得出结论,您需要调用load_tfidf_model,然后才能调用my_form_post路由方法。一个可能的结论是joblib.load正在失败。您不会在任何地方检查返回值。

由于您不报告任何例外,所以我认为没有发生任何例外。

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

一种风格问题:与其使用全局,而是让load_tfidf_model返回joblib.load返回的值,并将其保存在调用代码中(您无需将其声明为全局(。全球群体不是在功能之间进行交流的好方法。

最新更新