【问题标题】:Loading Gensim FastText Model with Callbacks Fails使用回调加载 Gensim FastText 模型失败
【发布时间】:2019-10-04 14:08:54
【问题描述】:

使用 Gensim 创建 FastText 模型后,我想加载它,但遇到了看似与回调有关的错误。

用于创建模型的代码是

TRAIN_EPOCHS = 30
WINDOW = 5
MIN_COUNT = 50
DIMS = 256

vocab_model = gensim.models.FastText(sentences=model_input,
                                     size=DIMS,
                                     window=WINDOW,
                                     iter=TRAIN_EPOCHS,
                                     workers=6,
                                     min_count=MIN_COUNT,
                                     callbacks=[EpochSaver("./ftchkpts/")])

vocab_model.save('ft_256_min_50_model_30eps')

而回调EpochSaver定义为

from gensim.models.callbacks import CallbackAny2Vec

class EpochSaver(CallbackAny2Vec):
    '''Callback to save model after each epoch and show training parameters '''

    def __init__(self, savedir):
        self.savedir = savedir
        self.epoch = 0
        os.makedirs(self.savedir, exist_ok=True)

    def on_epoch_end(self, model):
        savepath = os.path.join(self.savedir, f"ft256_{self.epoch}e")
        model.save(savepath)
        print(f"Epoch saved: {self.epoch + 1}")
        if os.path.isfile(os.path.join(self.savedir, f"ft256_{self.epoch-1}e")):
            os.remove(os.path.join(self.savedir,  f"ft256_{self.epoch-1}e"))
            print("Previous model deleted ")
        self.epoch += 1

除了模型的类型之外,这与我的 Word2Vec 流程相同,没有问题。但是,当我打开另一个文件并尝试使用

加载模型时
from gensim.models import FastText
vocab = FastText.load(r'vocab/ft_256_min_50_model_30eps')

我收到了错误

AttributeError: Can't get attribute 'EpochSaver' on <module '__main__'>

我可以做些什么来加载词汇表,以便为我的 keras 模型创建嵌入层?如果相关,这发生在 JupyterLab 中。

【问题讨论】:

    标签: python callback gensim jupyter-lab fasttext


    【解决方案1】:

    使用自定义回调加载模型的额外困难是 known, open issue(至少在 gensim-3.8.1 和 2019 年 10 月之前)。

    您可以在那里看到关于可能的解决方法和修复的讨论——gensim 团队正在考虑完全禁用回调的自动保存,要求为以后每个需要它们的train()/etc 调用重新指定它们.

    您可以通过将相同的回调类(以相同的名称)导入您正在执行load() 的代码上下文来加载使用自定义回调保存的现有模型。

    您可以通过在 save() 之前将模型的 callbacks 属性设为空默认值来保存训练模型的无回调版本,例如:

    model.callbacks = ()
    model.save(save_path)
    

    然后,您不需要在load() 之前对自定义类进行任何特殊导入。 (当然,如果您在重新加载的模型上再次需要回调功能,则必须在 load() 之后显式地重新建立它们)。

    【讨论】:

    • 谢谢。重新导入回调类修复了该错误,但现在我在尝试加载它时得到一个 KeyError (???)。看来我得再训练一次了。
    • 我必须查看确切的 KeyError 和错误堆栈才能知道可能是什么,以及是否有解决方法来加载您的文件。
    • KeyError 是针对 news 的,如果这很重要的话,它是在我之前的 word2vec 模型的索引 0 处结束的向量。完整的错误堆栈在这里:codepad.org/Vmay7knq 感谢您的帮助。
    • 这是一个非常令人惊讶的错误,因为问题中的代码只是迭代模型中的实际单词列表 (wv.index2word),在正常操作中应该与字典(wv.vocab)。如果您对词汇进行了任何词汇扩展或手动篡改,我怀疑它可能打破了index2wordvocab.keys() 始终具有相同长度和相同字符串集的类不变假设。 (如果实时调试,就像在收到异常后在带有 %debug 的 Jupyter 笔记本中一样,这些是我要检查的第一个变量。)
    • 我在训练和保存之间没有做任何事情,同样在回调保存的版本中也有同样的错误。这很烦人。它没有加载,所以我无法检查变量,但如果文件本身有任何内容,我可以检查线索,请告诉我。很抱歉,我无法提供对实际文件的访问权限。
    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 2020-08-27
    • 1970-01-01
    • 2020-06-26
    • 2020-07-08
    • 2019-01-17
    • 2020-12-17
    • 2018-06-09
    相关资源
    最近更新 更多