首页 > 解决方案 > Gensim word2vec 训练不会在批处理结束时回调

问题描述

我有兴趣在 Gensim word2vec 模型上放置一个回调,以在每批之后触发一些函数。根据文档,可以在批处理结束或纪元结束时放置回调。但是,如下面的 MVE 所示,实际上只触发了 epoch 回调。

要运行该示例,请corpus_filepath直接转到一个由不带标点的句子组成的行分隔文件(给定行上的句子中的单词应该用空格分隔)。您可能还需要更改实例化workersWord2Vec

from gensim.models import Word2Vec
from gensim.models.callbacks import CallbackAny2Vec

corpus_filepath = 'train.txt'
out_filepath = 'out.txt'

class MyCallback(CallbackAny2Vec):
    def __init__(self):
        pass

    def on_batch_end(self, model):
        print('batch end')

    def on_epoch_end(self, model):
        print('epoch end')


callback = MyCallback()
model = Word2Vec(size=300, window=5, min_count=0, workers=64)
print('Making vocabulary...')
model.build_vocab(corpus_file=corpus_filepath)
print('Beginning training...')
model.train(corpus_file=corpus_filepath, epochs=5, total_words=model.corpus_total_words, callbacks=[callback])

输出不正确(缺少批量打印输出):

Making vocabulary...
Beginning training...
epoch end
epoch end
epoch end
epoch end
epoch end

我究竟做错了什么?

标签: pythonmachine-learninggensimword2vec

解决方案


查看代码,Gensim 似乎没有在您使用的模式下实现on_batch_begin和回调。on_batch_endcorpus_file

因此,您可以尝试更改为传统的语料库可迭代模式以查看回调触发。(无论有多少 CPU 内核可用,该模式下的总体训练吞吐量往往会在大约 8-12 个工作人员时达到最大值。)

但是,还要注意,即使在那里,每批回调在多个线程中的任意时间运行 - 在这些回调中尝试很多事情是不明智/不安全的。例如,尝试保存模型可能会导致错误或其他文件损坏,甚至纯粹的信息输出也可能来自多个线程或反映不一致的变化状态。有关更多详细信息,请参阅Gensim 的开放错误报告 #2181on_batch由于在即将发布的版本中存在这种风险,回调可能会被完全删除。

所以我建议调整你的代码以使用其他方法——也许是on_epoch回调?- 反而。在如此频繁/同时的工作线程回调中,你想做什么操作?


推荐阅读