Gensim 4.x版本FastText的get_latest_training_loss返回0问题咨询
问题根因
Gensim 4.0.0、4.1.0版本的FastText模块存在已知缺陷:get_latest_training_loss接口仅从父类继承了方法定义,训练逻辑中没有同步写入损失统计值,因此调用始终返回0,属于版本适配bug。
解决方案
方案1:优先升级Gensim版本
直接升级到4.2.0及以上正式版本即可,官方已经在该版本修复了FastText损失统计的适配问题,你现有代码无需做任何修改,开启compute_loss=True参数后即可正常获取每轮训练的损失值。
方案2:无法升级版本的临时替代方案
如果受环境限制不能升级Gensim,可以调整回调逻辑手动读取底层累计损失,自行计算单轮损失:
class callback(CallbackAny2Vec): '''Callback to print loss after each epoch.''' def __init__(self): self.epoch = 0 self.prev_total_loss = 0 # 存储上一轮结束后的总累计损失 def on_epoch_end(self, model): current_total_loss = model.trainables.latest_training_loss epoch_loss = current_total_loss - self.prev_total_loss print('Loss after epoch {}: {}'.format(self.epoch, epoch_loss)) self.prev_total_loss = current_total_loss self.epoch += 1
注意该方案拿到的是累计损失差值,纯Python运行模式(FAST_VERSION=0)下损失精度会低于C扩展模式,有条件可以安装Cython依赖重新编译Gensim,将FAST_VERSION提升为1后损失计算会更准确。
内容的提问来源于stack exchange,提问作者Jinhua Wang
相关产品推荐
相关产品推荐

