我正在PyTorch
中实现一个简单的LSTM语言模型,并想查看BucketIterator
提供的torchtext
。
事实证明,返回的批次具有我整个语料库的大小,因此在初始化期间我一定做错了事。
我已经开始使用BPTTIterator
,但是由于我也希望能够训练一批完整的句子,因此我认为BucketIterator
应该是可行的方法。
我使用以下设置,使我的语料库成为一个简单的txt文件,每行包含句子。
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, corpus_size)
的1个张量中。
设置中我缺少什么?
编辑:似乎PennTreebank
对象与BucketIterator
不兼容(如此处http://mlexplained.com/2018/02/15/language-modeling-tutorial-in-torchtext-practical-torchtext-part-2/所述,它仅包含1个Example
)。将TabularDataset
仅使用1个Field
即可正常工作。
如果有人知道如何在torchtext
中以更优雅的方式完成带有填充句子批处理的语言建模,我很想听听!