【问题标题】:How to load a pickle file containing scikit-learn model in a Flask application?如何在 Flask 应用程序中加载包含 scikit-learn 模型的 pickle 文件?
【发布时间】:2018-03-26 04:45:17
【问题描述】:

我正在尝试创建一个简单的基于 Flask 的 Web 应用程序,用户可以在其中输入一些文本并接收其情绪分类。我无法加载使用 scikit-learn 训练模型后保存的 pickle 文件。我要加载的文件是tfidf_vectorizer_train.pkl,当我对load_tfidf_model 进行函数调用时,它应该已经加载了。每当我在本地运行应用程序时,都会出现以下错误

AttributeError: 'NoneType' 对象没有属性 'transform'

我怀疑这是由于模型加载失败并且全局变量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()

【问题讨论】:

    标签: python-3.x flask scikit-learn


    【解决方案1】:

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

    由于您没有报告任何异常,我认为没有发生任何异常。

    joblib.load documentation 表明可以返回任何 Python 类型,因此您可能需要查看创建它正在加载的文件的代码。

    文体问题:不要使用全局,而是让load_tfidf_model 返回joblib.load 返回的值,并将其保存在调用代码中(无需将其声明为全局)。全局变量不是函数之间通信的好方法。

    【讨论】:

    • 感谢您的回答。我解决了这个问题。当我使用flask run 启动服务器时,我收到模型尚未加载的错误。但是当我使用python ml_app.py(应用程序的名称)启动它时,它可以工作并运行 name == 'main' 下的所有内容,这是我需要的加载模型。
    猜你喜欢
    • 2017-06-15
    • 2017-12-17
    • 2021-01-12
    • 2017-03-16
    • 2018-07-12
    • 2015-02-19
    • 2018-12-18
    • 2017-05-21
    • 2019-04-17
    相关资源
    最近更新 更多