代码之家  ›  专栏  ›  技术社区  ›  Evan Weissburg

Gensim word2vec训练在批处理结束时不回调

  •  0
  • Evan Weissburg  · 技术社区  · 4 年前

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

    要运行示例,让 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
    

    我做错了什么?

    0 回复  |  直到 4 年前
        1
  •  1
  •   gojomo    4 年前

    查看代码,它显示 on_batch_begin on_batch_end Gensim尚未实现回调 corpus_file 您正在使用的模式。

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

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

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