Пространственная классификация текста с использованием мини-пакета
У меня есть вопрос относительно мини-пакетирования, который используется в примере 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
- Платформа: Windows-10-10.0.14393-SP0
- Версия Python: 3.6.5
- Модели: де
1 ответ
Ответ на вопрос, который я открыл с тем же вопросом:
Хорошо иметь два цикла, потому что оценка данных разработки должна происходить только один раз за эпоху, а не один раз за обновление - иначе мы будем оценивать слишком часто, и это будет медленным.
Я также думаю, что реализация того, что вы делаете, может быть немного хуже. Если вы распаковываете *, вы должны использовать генератор и загружать все в память. Это может быть хуже, чем пропускать поток генератора мини-пакетов, когда вы входите в цикл for.