簡體   English   中英

Gensim word2vec 訓練不會在批處理結束時回調

[英]Gensim word2vec training doesn't callback on batch end

我有興趣在 Gensim word2vec model 上進行回調,以在每批之后觸發一些 function。 根據文檔,可以在批處理結束或紀元結束時放置回調。 但是,如下面的 MVE 所示,實際上只觸發了 epoch 回調。

要運行示例,讓corpus_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])

不正確的 output(缺少批量打印輸出):

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

我究竟做錯了什么?

查看代碼,在您使用的corpus_file模式下,Gensim 似乎沒有實現on_batch_beginon_batch_end回調。

因此,您可以嘗試更改為傳統的語料庫可迭代模式以查看回調觸發。 (無論有多少 CPU 內核可用,該模式下的總體訓練吞吐量往往會在大約 8-12 個工作人員時達到最大值。)

但是,還要注意,即使在那里,每批回調在多個線程中的任意時間運行 - 在這些回調中嘗試很多事情是不明智/不安全的。 例如,嘗試保存 model 可能會導致錯誤或其他文件損壞,甚至純粹的信息 output 也可能來自多個線程或反映不一致的更改 Z9ED39E2EA931586B6A985A6942EF7。 有關更多詳細信息,請參閱 Gensim 的開放錯誤報告 #2181 由於在即將發布的版本中存在這種風險,可能會完全刪除on_batch回調。

所以我建議調整你的代碼以使用其他方法——也許是on_epoch回調? - 反而。 在如此頻繁/同時的工作線程回調中,你想做什么操作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM