我对示例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)
我很痛苦,为什么所有批次的minibatch都会在一次迭代中被消耗,而不是每次主循环迭代都消耗一批次?以下代码应说明我的意思。
# 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)
谢谢!
答案 0 :(得分:0)
打开issue时,我回答了同样的问题:
最好有两个循环,因为对开发的评估 数据每个时间段仅发生一次,而不是每个更新一次- 否则我们会评估得太频繁,而且速度会很慢。
我还认为您可能会有一个实现上的怪癖 这样做会更糟。如果您进行*开箱,则必须 消耗生成器并将所有内容加载到内存中。这可以是 比让minibatch生成器流更糟糕,因为 for循环。