如何获取 gensim.models.FastText.train() 的进度条?

问题描述 投票:0回答:1

我有以下代码来训练 FastText 嵌入模型。

embed_model = FastText(vector_size=meta_hyper['vector_size'],
                       window=meta_hyper['window'],
                       alpha= meta_hyper['alpha'],
                       workers=meta_hyper['CPU'])

embed_model.build_vocab(data)

start = time.time()

embed_model.train(data, total_examples=len(data), epochs=meta_hyper['epochs'])

我有一个相当大的数据集(大约数百万个令牌),我需要了解模型距离训练结束有多近。我能做什么?

我尝试过使用tqdm并在官方文档中搜索,但没有帮助。

python python-3.x google-colaboratory word-embedding fasttext
1个回答
0
投票

为了实现准确估计剩余时间的目标,最简单的方法是在 INFO 级别启用日志记录。例如,全局执行此操作的简单 2-liner 是:

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

然后,许多 Gensim 功能(包括

.train()
)会将其内部步骤记录到控制台,包括长时间操作期间的进度报告。

由于训练本质上是在语料库的所有范围/时期中进行统一成本的操作,因此即使只有几分钟的进度通常也能代表总体速率,因此足以(手动)预测训练会话何时会发生。结束。

例如,如果需要 5 分钟才能完成第一个训练周期的 8%,并且您请求了 10 个周期,那么训练应在大约 (5 分钟 * 100%/8% * 10 个周期 =) 内完成625 分钟。

(可能破坏这种线性投影的主要因素可能是,如果您的语料库在不同范围内的文本大小或标记多样性方面存在很大差异,例如,您的语料库的前 8% 都是具有共同点的简短文档单词,而其他范围都是包含较少单词的长文档。但是,由于其他原因,这也很糟糕 - 如果整个语料库中的所有训练数据都同样错误,则模型优化效果最好。因此,如果您的数据有任何文本可能因长度、词汇等而“聚集”,训练前进行一次预洗牌有助于提高训练效率和可预测的进度。)

如果日志记录过多,

.train()
有一个可选的
report_delay
参数来指定每个新进度报告之前等待的秒数。

利用其他工具获得真正的进度条会有点棘手,因为

.train()
通常需要一个可多次重复迭代的 Python 序列来运行其可配置的纪元数,并且
tqdm
最直接的使用预计会显示超过 1 个迭代器迭代的进度。 (也许可以通过一些语料库/参数更改和自定义可迭代包装进行破解,但我不确定这种方法不会遇到其他问题。)

© www.soinside.com 2019 - 2024. All rights reserved.