我对示例中使用的小批量有一个问题train_textcat.py
主训练循环如下所示:
for i in range(n_iter):
losses = {}
# batch up the examples using spaCy's minibatch
batches = minibatch(train_data, size=compounding(4., 32., 1.001))
for batch in batches:
texts, annotations = zip(*batch)
nlp.update(texts, annotations, sgd=optimizer, drop=0.2, losses=losses)
with textcat.model.use_params(optimizer.averages):
# evaluate on the dev data split off in load_data()
scores = evaluate(nlp.tokenizer, textcat, dev_texts, dev_cats)
我想知道为什么小批量的所有批次都在一次交互中消耗,而不是在主循环的每次迭代中消耗一批?下面的代码应该解释我的意思。
# batch up the examples using spaCy's minibatch
batches = minibatch(train_data, size=compounding(4., 32., 1.001))
for i, texts, annotations in zip(range(n_iter),*batch):
losses = {}
nlp.update(texts, annotations, sgd=optimizer, drop=0.2, losses=losses)
with textcat.model.use_params(optimizer.averages):
# evaluate on the dev data split off in load_data()
scores = evaluate(nlp.tokenizer, textcat, dev_texts, dev_cats)
提前感谢!
您的环境
- spaCy 版本:2.0.12
- 平台: 视窗-10-10.0.14393-SP0
- 蟒蛇版本:3.6.5
- 型号: 德
我以同样的问题打开的问题:
有两个循环很好,因为对开发的评估 每个纪元只能发生一次数据,而不是每个更新---一次 否则我们会过于频繁地评估,而且会很慢。
我也认为你可能有一个实现怪癖,你是什么 这样做有点糟糕。如果你做*拆包,你必须 使用生成器并将所有内容加载到内存中。这可以是 比让小批量生成器流式传输更糟糕,因为您进入 对于循环。