BucketIterator выдает объект «Поле», не имеющий атрибута «Vocab»

Это не новый вопрос, ссылки, которые я нашел без какого-либо решения, работали для меня first и секунду. Я новичок в PyTorch, столкнулся с AttributeError: 'Field' object has no attribute 'vocab' при создании пакетов текстовых данных в PyTorch с помощью torchtext.

Вслед за книгой Deep Learning with PyTorch я написал тот же пример, что и в книге.

Вот фрагмент:

from torchtext import data
from torchtext import datasets
from torchtext.vocab import GloVe

TEXT = data.Field(lower=True, batch_first=True, fix_length=20)
LABEL = data.Field(sequential=False)
train, test = datasets.IMDB.splits(TEXT, LABEL)

print("train.fields:", train.fields)
print()
print(vars(train[0]))  # prints the object



TEXT.build_vocab(train, vectors=GloVe(name="6B", dim=300),
                 max_size=10000, min_freq=10)

# VOCABULARY
# print(TEXT.vocab.freqs)  # freq
# print(TEXT.vocab.vectors)  # vectors
# print(TEXT.vocab.stoi)  # Index

train_iter, test_iter = data.BucketIterator.splits(
    (train, test), batch_size=128, device=-1, shuffle=True, repeat=False)  # -1 for cpu, None for gpu

# Not working (FROM BOOK)
# batch = next(iter(train_iter))

# print(batch.text)
# print()
# print(batch.label)

# This also not working (FROM Second solution)
for i in train_iter:
    print (i.text)
    print (i.label)

Вот трассировка стека:

AttributeError                            Traceback (most recent call last)
<ipython-input-33-433ec3a2ca3c> in <module>()
      7 
      8 
----> 9 for i in train_iter:
     10     print (i.text)
     11     print (i.label)

/anaconda3/lib/python3.6/site-packages/torchtext/data/iterator.py in __iter__(self)
    155                     else:
    156                         minibatch.sort(key=self.sort_key, reverse=True)
--> 157                 yield Batch(minibatch, self.dataset, self.device)
    158             if not self.repeat:
    159                 return

/anaconda3/lib/python3.6/site-packages/torchtext/data/batch.py in __init__(self, data, dataset, device)
     32                 if field is not None:
     33                     batch = [getattr(x, name) for x in data]
---> 34                     setattr(self, name, field.process(batch, device=device))
     35 
     36     @classmethod

/anaconda3/lib/python3.6/site-packages/torchtext/data/field.py in process(self, batch, device)
    199         """
    200         padded = self.pad(batch)
--> 201         tensor = self.numericalize(padded, device=device)
    202         return tensor
    203 

/anaconda3/lib/python3.6/site-packages/torchtext/data/field.py in numericalize(self, arr, device)
    300                 arr = [[self.vocab.stoi[x] for x in ex] for ex in arr]
    301             else:
--> 302                 arr = [self.vocab.stoi[x] for x in arr]
    303 
    304             if self.postprocessing is not None:

/anaconda3/lib/python3.6/site-packages/torchtext/data/field.py in <listcomp>(.0)
    300                 arr = [[self.vocab.stoi[x] for x in ex] for ex in arr]
    301             else:
--> 302                 arr = [self.vocab.stoi[x] for x in arr]
    303 
    304             if self.postprocessing is not None:

AttributeError: 'Field' object has no attribute 'vocab'

Если не использовать BucketIterator, что еще я могу использовать, чтобы получить аналогичный результат?


person Asif Ali    schedule 22.05.2019    source источник


Ответы (1)


Вы не создали словарный запас для поля LABEL.

После TEXT.build_vocab(train, ...) запустите LABEL.build_vocab(train), а остальные запустятся.

person Proyag    schedule 22.05.2019
comment
Почему мы должны создавать словарный запас для поля LABEL? Он содержит только ярлык. Я действительно не понимаю. - person beepbeep; 22.07.2020
comment
Словарь необходим для сопоставления с числовыми идентификаторами, что необходимо сделать не только для текстовых токенов, но и для меток. - person Proyag; 22.07.2020
comment
разве словарь не является картой между уникальными словами и идентификаторами, которые их представляют? Примеры объектов имеют атрибуты как текста, так и метки, так что метки уже сопоставлены? Я действительно не могу понять эту вещь build_vocab, может быть, вы знаете учебник, который подробно объясняет это? - person beepbeep; 22.07.2020
comment
Правильно, это сопоставление уникальных слов (или токенов, меток, подслов и т. д.) числовым идентификаторам. В этом конкретном примере для набора данных IMDB метка является отрицательной или положительной для каждого примера, который будет просто сопоставлен с 1 и 2. В других сценариях у вас может быть больше меток и, следовательно, больший словарный запас. Попробуйте print(LABEL.vocab.stoi) после создания словаря, и вы увидите словарь, похожий на {'<unk>': 0, 'neg': 1, 'pos': 2}. - person Proyag; 23.07.2020
comment
В этом analyticsvidhya.com/blog/2020/01 / учебник, хотя целевая переменная уже была числовой, он использовал LABEL.build_vocab() вывод LABEL.vocab.stoi такой странный xD - person beepbeep; 23.07.2020
comment
Если данные уже являются числовыми, вы можете просто установить Field.use_vocab как False. - person Proyag; 29.07.2020
comment
Привет @Proyag: мой случай немного отличается. Я получил эту ошибку: AttributeError: «Пакетный» объект не имеет атрибута «текст» даже после того, как я сделал TEXT.build_vocab (train_data, max_size = MAX_VOCAB_SIZE, vectors = glove.6B.100d, unk_init = torch.Tensor.normal_) LABEL.build_vocab (train_data) есть идеи, почему? - person chandra sutrisno; 20.09.2020