尝试在Flaskapp中解除对模型的酸洗时出现模块未找到错误

人气:782 发布:2022-10-16 标签: python flask pickle

问题描述

Python版本:3.6.9

我曾使用pickle将机器学习模型转储到一个文件中,当我尝试使用Flask来对其运行预测时,它失败了,错误为ModuleNotFoundError: No module named 'predictors'。我如何修复此错误,以便它识别我的模型,无论我是尝试通过Flask还是通过Python命令(例如python predict_edu.py)运行预测?

以下是我的文件结构:

 - video_discovery
   __init__.py
   - data_science
     - model
     - __init__.py
     - predict_edu.py
     - predictors.py
     - train_model.py

以下是我的Forecast_edu.py文件:

import pickle

with open('model', 'rb') as f:
        bow_model = pickle.load(f)

这是我的prerectors.py文件:

from sklearn.base import TransformerMixin

# Basic function to clean the text
def clean_text(text):
    # Removing spaces and converting text into lowercase
    return text.strip().lower()

# Custom transformer using spaCy
class predictor_transformer(TransformerMixin):
    def transform(self, X, **transform_params):
        # Cleaning Text
        return [clean_text(text) for text in X]

    def fit(self, X, y=None, **fit_params):
        return self

    def get_params(self, deep=True):
        return {}

我是如何训练我的模特的:

python data_science/train_model.py

这是我的Train_Model.py文件:

from predictors import predictor_transformer

# pipeline = Pipeline([("cleaner", predictor_transformer()), ('vectorizer', bow_vector), ('classifier', classifier_18p)])
pipeline = Pipeline([("cleaner", predictor_transformer())])

with open('model', 'wb') as f:
        pickle.dump(pipeline, f)

我的Flaskapp在:video_discovery/__init__.py

我是如何运行我的Flaskapp的:

FLASK_ENV=development FLASK_APP=video_discovery flask run

我认为这个问题可能是因为我通过直接运行Python脚本而不是使用Flask来训练模型,所以可能会有一些名称空间问题,但我不确定如何修复这个问题。训练我的模型需要一段时间,所以我不能准确地等待HTTP请求。

我遗漏了哪些可能解决此问题的内容?

推荐答案

发自https://docs.python.org/3/library/pickle.html:

pickle可以透明地保存和还原类实例,但是类定义必须是可导入的,并且与存储对象时位于同一模块中。

当您运行python data_science/train_model.py并导入from predictors时,predictors作为顶级模块导入,predictor_transformer位于该模块中。

但是,当您从video_discovery的父文件夹通过烧瓶运行预测时,predictor_transformer位于video_discovery.data_science.predictors模块中。

使用相对导入并从一致路径运行

Train_Model.py:使用相对导入

# from predictors import predictor_transformer  # -
from .predictors import predictor_transformer   # +

培训模型:以video_discovery作为顶层模块运行train_model

# python data_science/train_model.py                # -
python -m video_discovery.data_science.train_model  # +

通过Python命令运行预测:以video_discovery作为顶级模块运行predict_edu

# python predict_edu.py                             # -
python -m video_discovery.data_science.predict_edu  # +

通过烧瓶运行预测:(无变化,已作为顶层模块video_discovery运行)

FLASK_ENV=development FLASK_APP=video_discovery flask run

113