Python Gensim word2vec培训不需要';t在批处理结束时回调

Python Gensim word2vec培训不需要';t在批处理结束时回调,python,machine-learning,gensim,word2vec,Python,Machine Learning,Gensim,Word2vec,我感兴趣的是在Gensim word2vec模型上放置一个回调函数,以便在每个批处理之后触发一些函数。根据,可以在批处理结束或纪元结束时放置回调。但是,如下面的MVE所示,实际上只有epoch回调触发 要运行该示例,请让corpus\u filepath指向一个以行分隔的非定时句子文件(给定行上的句子中的单词应以空格分隔)。您可能还需要在Word2Vec实例化中更改workers from gensim.models import Word2Vec from gensim.models.call

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

要运行该示例,请让
corpus\u filepath
指向一个以行分隔的非定时句子文件(给定行上的句子中的单词应以空格分隔)。您可能还需要在
Word2Vec
实例化中更改
workers

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])
输出不正确(缺少批打印输出):


我做错了什么?

查看代码,Gensim在您使用的
语料库文件
模式下似乎没有实现批处理开始和批处理结束上的
回调

因此,您可以尝试更改为传统的语料库可重用模式,以查看回调启动。(无论有多少CPU内核可用,该模式下的总体培训吞吐量在8-12个工人左右时趋于最大。)

然而,还要注意的是,即使在那里,每批回调也会在多个线程中任意时间运行——因此在这些回调中进行尝试是不明智/不安全的。例如,尝试保存模型可能会导致错误或其他文件损坏,甚至纯粹的信息输出也可能来自多个线程或反映不一致的更改状态。看见在即将发布的版本中,可能会完全删除批处理上的
回调


因此,我建议您对代码进行调整,以使用其他方法—可能是在_epoch
回调中使用
相反在这种频繁/同步的工作线程回调中,您希望执行什么操作?

感谢您的深入响应!我对在一个研究项目中使用Gensim单词向量感兴趣,在这个项目中,重要的是在次要任务中插入培训,并穿插在主要目标的培训中。如果能够以比epoch更小的粒度完成这项工作,那将是一件好事。你有什么建议吗?Gensim是我们当前的目标培训体系结构,因为使用足够的线程进行培训速度非常快。您可以在每个标准历元结束时交错您的备用目标的完整历元,或者扩展Gensim源以在每个批次甚至每个微示例中应用备用目标。我建议在预发行版
gensim-4.0.0beta
或github项目
develope
分支源代码的基础上进行扩展。(扩展/更改最棘手的部分是基本的cython优化代码,它在内存/线程方面更脆弱,依赖于显式cython-to-c(pp)然后是c(pp)编译。)
Making vocabulary...
Beginning training...
epoch end
epoch end
epoch end
epoch end
epoch end