Я реализую простую языковую модель LSTM в PyTorch
и хотел проверить BucketIterator
, предоставленный torchtext
.
Оказывается, что возвращаемая партия имеет размер всего моего корпуса, поэтому я должен что-то делать не так во время ее инициализации.
У меня уже работает BPTTIterator
, но так как я хочу иметь возможность тренироваться и с пакетами полных предложений, я подумал, что BucketIterator
должен быть подходящим способом.
Я использую следующую настройку, с моим корпусом простой текстовый файлсодержащие предложения в каждой строке.
field = Field(use_vocab=True, batch_first=True)
corpus = PennTreebank('project_2_data/train_lines.txt', field)
field.build_vocab(corpus)
iterator = BucketIterator(corpus,
batch_size=64,
repeat=False,
sort_key=lambda x: len(x.text),
sort_within_batch=True,
)
Я ожидаю, что пакет от этого итератора будет иметь форму (batch_size, max_len)
, но он добавляет весь корпус в 1 тензор формы (1, corpus_size)
.
Чего мне не хватает в моей настройке?
Редактировать: кажется, что PennTreebank
объект не совместим с BucketIterator
(он содержит только 1 Example
, как указано здесь http://mlexplained.com/2018/02/15/language-modeling-tutorial-in-torchtext-practical-torchtext-part-2/). ИспользованиеTabularDataset
только с 1 Field
это заработало.
Если у кого-то есть идея, как языковое моделирование с пакетными предложениями может быть выполнено в torchtext
более элегантным способом, я бы хотел услышатьэто!