如何解决Gensim word2vec 训练不会在批处理结束时回调
我有兴趣在 Gensim word2vec 模型上放置一个回调,以在每批之后触发一些函数。根据 documentation,可以在批处理结束或纪元结束时放置回调。但是,如下面的 MVE 所示,实际上只有 epoch 回调被触发。
要运行示例,让 corpus_filepath
指向一个由无标点句子组成的行分隔文件(给定一行的句子中的单词应该用空格分隔)。您可能还需要在 workers
实例化中更改 Word2Vec
。
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
我做错了什么?
解决方法
查看代码,在您使用的 on_batch_begin
模式下,Gensim 似乎没有实现 on_batch_end
和 corpus_file
回调。
因此,您可以尝试更改为传统的 corpus-iterable 模式以查看回调触发。 (无论有多少 CPU 内核可用,该模式下的总体训练吞吐量往往会在 8 到 12 名工作人员的情况下达到最大值。)
但是,还要注意,即使在那里,每个批次的回调也会在多个线程中的任意时间运行 - 在这些回调中尝试很多事情是不明智的/不安全的。例如,尝试保存模型可能会导致错误或其他文件损坏,甚至纯信息输出可能会从多个线程混合或反映不一致的更改状态。见Gensim's open bug report #2181 for more details。由于此风险,在即将发布的版本中可能会完全删除 on_batch
回调。
所以我建议调整您的代码以使用其他方法——也许是 on_epoch
回调? - 反而。在如此频繁/同时的工作线程回调中,您想做什么操作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。