Pytorch Text AttributeError:“BucketIterator”对象没有属性

Posted

技术标签:

【中文标题】Pytorch Text AttributeError:“BucketIterator”对象没有属性【英文标题】:Pytorch Text AttributeError: ‘BucketIterator’ object has no attribute 【发布时间】:2021-10-26 02:16:34 【问题描述】:

我正在对自己的数据集进行 seq2seq 机器翻译。我已经使用此代码对我的数据集进行了预处理。

当我尝试使用 BucketIterator.split() 拆分 train_data 时出现问题

def tokenize_word(text):
  return nltk.word_tokenize(text)

id = Field(sequential=True, tokenize = tokenize_word, lower=True, init_token="<sos>", eos_token="<eos>")
ti = Field(sequential=True, tokenize = tokenize_word, lower=True, init_token="<sos>", eos_token="<eos>")

fields = 'id': ('i', id), 'ti': ('t', ti)

train_data = TabularDataset.splits(
    path='/content/drive/MyDrive/Colab Notebooks/Tidore/',
    train = 'id_ti.tsv',
    format='tsv',
    fields=fields
)[0]

id.build_vocab(train_data)
ti.build_vocab(train_data)

print(f"Unique tokens in source (id) vocabulary: len(id.vocab)")
print(f"Unique tokens in target (ti) vocabulary: len(ti.vocab)")

train_iterator = BucketIterator.splits(
    (train_data),
    batch_size = batch_size,
    sort_within_batch = True,
    sort_key = lambda x: len(x.id),
    device = device
)

print(len(train_iterator))

for data in train_iterator:
  print(data.i)

这是上面代码的结果

Unique tokens in source (id) vocabulary: 1425
Unique tokens in target (ti) vocabulary: 1297
2004

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-72-e73a211df4bd> in <module>()
     31 
     32 for data in train_iterator:
---> 33   print(data.i)

AttributeError: 'BucketIterator' object has no attribute 'i'

这是我尝试打印 train_iterator 时的结果

我很困惑,因为我不知道应该为训练迭代器使用什么键。谢谢你的帮助

【问题讨论】:

请用代码 sn-ps 代替图片提供问题:) 【参考方案1】:

根据torchtextdocuments,最好用TranslationDataset来做自己想做的事! 但如果出于某种原因您更喜欢使用TabularDataset,最好这样做:

import nltk
print(nltk.__version__)
from torchtext import data
import torchtext
print(torchtext.__version__)
def tokenize_word(text):
    return nltk.word_tokenize(text)

batch_size = 5

SRC = Field(sequential=True, tokenize = tokenize_word, lower=True, init_token="<sos>", eos_token="<eos>")
TRG = Field(sequential=True, tokenize = tokenize_word, lower=True, init_token="<sos>", eos_token="<eos>")

train = data.TabularDataset.splits(
    path='./data/', train='tr.tsv', format='tsv',
    fields=[('src', SRC), ('trg', TRG)])[0]

SRC.build_vocab(train)
TRG.build_vocab(train)

train_iter = data.BucketIterator(
    train, batch_size=batch_size,
    sort_key=lambda x: len(x.text), device=0)

for item in train_iter:
    print(item.trg)

输出:

3.6.2
0.6.0
tensor([[2, 2, 2, 2, 2],
        [5, 5, 5, 5, 5],
        [4, 4, 4, 4, 4],
        [6, 6, 6, 6, 6],
        [7, 7, 7, 7, 7],
        [3, 3, 3, 3, 3]])
tensor([[2, 2, 2, 2, 2],
        [5, 5, 5, 5, 5],
        [4, 4, 4, 4, 4],
        [6, 6, 6, 6, 6],
        [7, 7, 7, 7, 7],
        [3, 3, 3, 3, 3]])

注意:确保数据目录中有 tr.tsv 文件包含由制表符分隔的文本列。 欢迎使用 ***,希望对您有所帮助:)

【讨论】:

【参考方案2】:
train_iterator = BucketIterator.splits(
  (train_data),
  batch_size = batch_size,
  sort_within_batch = True,
  sort_key = lambda x: len(x.id),
  device = device
)

这里 当只需要生成一个迭代器时,使用 BucketIterator 而不是 BucketIterator.splits

我遇到了这个问题,上面提到的方法有效。

【讨论】:

以上是关于Pytorch Text AttributeError:“BucketIterator”对象没有属性的主要内容,如果未能解决你的问题,请参考以下文章

解决运行pytorch程序多线程问题

解决运行pytorch程序多线程问题

文本建模文本分类相关开源项目推荐(Pytorch实现)

Pytorch学习-训练CIFAR10分类器

使用 pytorch 进行 BERT 文本分类

PyTorch-17 使用TorchText进行文本分类