代码之家  ›  专栏  ›  技术社区  ›  Juned Ansari

AttributeError:模块“_main___;”没有属性“GenSimWord2矢量器”

  •  0
  • Juned Ansari  · 技术社区  · 4 年前

    但是,当我创建一个模型pickle文件并在Flask应用程序中使用该pickle文件时,我会遇到如下错误:

    '__main__' 没有属性“GenSimWord2Vectorizer”

    我正在Google Colab上创建模型。

    Jupyter笔记本中的代码:

    # Word2Vec Model
    import numpy as np
    from sklearn.base import BaseEstimator, TransformerMixin
    from gensim.models import Word2Vec
    
    class GensimWord2VecVectorizer(BaseEstimator, TransformerMixin):
    
        def __init__(self, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None,
                     sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5,
                     ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
                     trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False,
                     callbacks=(), max_final_vocab=None):
            self.size = size
            self.alpha = alpha
            self.window = window
            self.min_count = min_count
            self.max_vocab_size = max_vocab_size
            self.sample = sample
            self.seed = seed
            self.workers = workers
            self.min_alpha = min_alpha
            self.sg = sg
            self.hs = hs
            self.negative = negative
            self.ns_exponent = ns_exponent
            self.cbow_mean = cbow_mean
            self.hashfxn = hashfxn
            self.iter = iter
            self.null_word = null_word
            self.trim_rule = trim_rule
            self.sorted_vocab = sorted_vocab
            self.batch_words = batch_words
            self.compute_loss = compute_loss
            self.callbacks = callbacks
            self.max_final_vocab = max_final_vocab
    
        def fit(self, X, y=None):
            self.model_ = Word2Vec(
                sentences=X, corpus_file=None,
                size=self.size, alpha=self.alpha, window=self.window, min_count=self.min_count,
                max_vocab_size=self.max_vocab_size, sample=self.sample, seed=self.seed,
                workers=self.workers, min_alpha=self.min_alpha, sg=self.sg, hs=self.hs,
                negative=self.negative, ns_exponent=self.ns_exponent, cbow_mean=self.cbow_mean,
                hashfxn=self.hashfxn, iter=self.iter, null_word=self.null_word,
                trim_rule=self.trim_rule, sorted_vocab=self.sorted_vocab, batch_words=self.batch_words,
                compute_loss=self.compute_loss, callbacks=self.callbacks,
                max_final_vocab=self.max_final_vocab)
            return self
    
        def transform(self, X):
            X_embeddings = np.array([self._get_embedding(words) for words in X])
            return X_embeddings
    
        def _get_embedding(self, words):
            valid_words = [word for word in words if word in self.model_.wv.vocab]
            if valid_words:
                embedding = np.zeros((len(valid_words), self.size), dtype=np.float32)
                for idx, word in enumerate(valid_words):
                    embedding[idx] = self.model_.wv[word]
    
                return np.mean(embedding, axis=0)
            else:
                return np.zeros(self.size)
    
    # column transformer
    from sklearn.compose import ColumnTransformer
    
    ct = ColumnTransformer([
        ('step1', GensimWord2VecVectorizer(), 'STATUS')
    ], remainder='drop')
    
    # Create Model
    from sklearn.svm import SVC
    from sklearn.pipeline import Pipeline
    from sklearn.model_selection import GridSearchCV
    import pickle
    import numpy as np
    import dill
    import torch
    # ##########
    # SVC - support vector classifier
    # ##########
    # defining parameter range
    hyperparameters = {'C': [0.1, 1],
                       'gamma': [1, 0.1],
                       'kernel': ['rbf'],
                       'probability': [True]}
    model_sv = Pipeline([
        ('column_transformers', ct),
        ('model', GridSearchCV(SVC(), hyperparameters,
                               refit=True, verbose=3)),
    ])
    model_sv_cEXT = model_sv.fit(X_train, y_train['cEXT'])
    # Save the trained cEXT - SVM Model.
    import joblib
    joblib.dump(model_sv_cEXT, 'model_Word2Vec_sv_cEXT.pkl')
    

    Flask应用程序中的代码:

    # Word2Vec
    model_EXT_WV_SV = joblib.load('utility/model/MachineLearning/SVM/model_Word2Vec_sv_cEXT.pkl')
    

    我试图将同一个类复制到我的Flask文件中,但它也不起作用。

    import numpy as np
    from sklearn.base import BaseEstimator, TransformerMixin
    from gensim.models import Word2Vec
    
    class GensimWord2VecVectorizer(BaseEstimator, TransformerMixin):
    
        def __init__(self, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None,
                     sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5,
                     ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
                     trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False,
                     callbacks=(), max_final_vocab=None):
            self.size = size
            self.alpha = alpha
            self.window = window
            self.min_count = min_count
            self.max_vocab_size = max_vocab_size
            self.sample = sample
            self.seed = seed
            self.workers = workers
            self.min_alpha = min_alpha
            self.sg = sg
            self.hs = hs
            self.negative = negative
            self.ns_exponent = ns_exponent
            self.cbow_mean = cbow_mean
            self.hashfxn = hashfxn
            self.iter = iter
            self.null_word = null_word
            self.trim_rule = trim_rule
            self.sorted_vocab = sorted_vocab
            self.batch_words = batch_words
            self.compute_loss = compute_loss
            self.callbacks = callbacks
            self.max_final_vocab = max_final_vocab
    
        def fit(self, X, y=None):
            self.model_ = Word2Vec(
                sentences=X, corpus_file=None,
                size=self.size, alpha=self.alpha, window=self.window, min_count=self.min_count,
                max_vocab_size=self.max_vocab_size, sample=self.sample, seed=self.seed,
                workers=self.workers, min_alpha=self.min_alpha, sg=self.sg, hs=self.hs,
                negative=self.negative, ns_exponent=self.ns_exponent, cbow_mean=self.cbow_mean,
                hashfxn=self.hashfxn, iter=self.iter, null_word=self.null_word,
                trim_rule=self.trim_rule, sorted_vocab=self.sorted_vocab, batch_words=self.batch_words,
                compute_loss=self.compute_loss, callbacks=self.callbacks,
                max_final_vocab=self.max_final_vocab)
            return self
    
        def transform(self, X):
            X_embeddings = np.array([self._get_embedding(words) for words in X])
            return X_embeddings
    
        def _get_embedding(self, words):
            valid_words = [word for word in words if word in self.model_.wv.vocab]
            if valid_words:
                embedding = np.zeros((len(valid_words), self.size), dtype=np.float32)
                for idx, word in enumerate(valid_words):
                    embedding[idx] = self.model_.wv[word]
    
                return np.mean(embedding, axis=0)
            else:
                return np.zeros(self.size)
    
    # Word2Vec
    model_EXT_WV_SV = joblib.load('utility/model/MachineLearning/SVM/model_Word2Vec_sv_cEXT.pkl')
    

    GitHub代码: https://github.com/Juned-Ansari/test

    Pickle文件: https://github.com/Juned-Ansari/test/blob/main/model_Word2Vec_sv_cEXT.pkl

    Flask Web应用程序: https://github.com/Juned-Ansari/test/tree/main/WebApp

    0 回复  |  直到 4 年前
        1
  •  4
  •   aaron    4 年前

    从…起 https://docs.python.org/3/library/pickle.html :

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

    可以对以下类型进行酸洗:

    • ...
    • 在模块顶层定义的类
    • 这类课程的实例。。。

    考虑到您的目录结构:

    ├── WebApp/
    │  └── app.py
    └── Untitled.ipynb
    

    假设你 flask run 从内部 WebApp/ 所以 app 是一个顶级模块。

    首先,行动 class GensimWord2VecVectorizer 达到最高水平 WebApp/app.py .

    接下来,在你的Jupyter笔记本中,导入 GensimWord2VecVectorizer 骗局 泡菜 认为这是一个顶级的 应用程序 模块:

    from WebApp.app import GensimWord2VecVectorizer
    GensimWord2VecVectorizer.__module__ = 'app'
    
    import sys
    sys.modules['app'] = sys.modules['WebApp.app']
    

    那你应该可以 dump 和 load 泡菜档案。

    谷歌可乐

    GensimWord2VecVectorizer.__module__ = 'app'
    
    import sys
    app = sys.modules['app'] = type(sys)('app')
    app.GensimWord2VecVectorizer = GensimWord2VecVectorizer
    

    那你应该可以 倾倒 和 负载 泡菜档案。

        2
  •  1
  •   Shaida Muhammad    4 年前

    进口 GensimWord2VecVectorizer 在Flask Web app python文件中。

    推荐文章