BucketIterator 抛出 'Field' 对象没有属性 'vocab'
Posted
技术标签:
【中文标题】BucketIterator 抛出 \'Field\' 对象没有属性 \'vocab\'【英文标题】:BucketIterator throws 'Field' object has no attribute 'vocab'BucketIterator 抛出 'Field' 对象没有属性 'vocab' 【发布时间】:2019-10-08 14:44:30 【问题描述】:这不是一个新问题,我发现没有任何解决方案的参考first 和second。
我是 PyTorch 的新手,面对AttributeError: 'Field' object has no attribute 'vocab'
,同时使用torchtext
在PyTorch
中创建批量文本数据。
跟进Deep Learning with PyTorch
这本书,我写了与书中解释的相同的例子。
这是sn-p:
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,我还能用什么来获得类似的 输出?
【问题讨论】:
【参考方案1】:您还没有为 LABEL 字段构建词汇。
在TEXT.build_vocab(train, ...)
之后,运行LABEL.build_vocab(train)
,其余的都会运行。
【讨论】:
为什么我们必须为 LABEL 字段构建词汇?它只包含标签。我真的不明白。 词汇需要映射到数字标识符,这不仅需要对文本标记进行,还需要对标签进行 词汇不是唯一词和代表它们的 ID 之间的映射吗?示例对象确实同时具有文本和标签属性,所以标签不是已经映射了吗?我真的无法理解这个 build_vocab 的东西,你知道一个教程可以彻底解释这个吗? 正确,它是从唯一词(或标记或标签或子词等)到数字标识符的映射。在这个针对 IMDB 数据集的特定示例中,每个示例的标签都是“负”或“正”,它们将简单地映射到 1 和 2。在其他情况下,您可能有更多标签,因此可能有更大的词汇量。在构建词汇后尝试print(LABEL.vocab.stoi)
,你会看到一个看起来像'<unk>': 0, 'neg': 1, 'pos': 2
的字典
如果数据已经是数字,您可能只想将 Field.use_vocab
设置为 False以上是关于BucketIterator 抛出 'Field' 对象没有属性 'vocab'的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch解决使用BucketIterator.splits警告volatile was removed and now has no effect. Use `with torch.no_g(代
Pytorch解决使用BucketIterator.splits警告volatile was removed and now has no effect. Use `with torch.no_g(代