加载带有回调的 Gensim FastText 模型失败

And*_*ndy 1 python callback gensim fasttext jupyter-lab

使用 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')
Run Code Online (Sandbox Code Playgroud)

回调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
Run Code Online (Sandbox Code Playgroud)

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

from gensim.models import FastText
vocab = FastText.load(r'vocab/ft_256_min_50_model_30eps')
Run Code Online (Sandbox Code Playgroud)

我收到了错误消息

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

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

goj*_*omo 6

使用自定义回调加载模型的额外困难是一个已知的、未解决的问题(至少到gensim-3.8.12019 年 10 月为止)。

\n\n

您可以在 \xe2\x80\x93 中看到可能的解决方法和修复的讨论,并且 gensim 团队正在考虑完全禁用回调的自动保存,要求为以后每个需要它们的train()/etc 调用重新指定它们。

\n\n

您可以通过将这些相同的回调类(以相同的名称)导入到您正在执行load().

\n\n

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

\n\n
model.callbacks = ()\nmodel.save(save_path)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您不需要在load(). (当然,如果您再次需要在重新加载的模型上使用回调功能,则必须在之后显式重新建立它们load())。

\n