Torchtext访问Iterator批次报错Field无vocab属性如何解决
问题根因
你在代码中重复定义了TEXT、LABEL对象,导致数据集绑定的Field和实际构建了vocab的Field不是同一个实例:
- 第一次定义的
TEXT、LABEL已经通过fields参数绑定到train_data、test_data数据集实例中,迭代时数据集会调用绑定的Field处理数据 - 你在创建数据集后重新给
TEXT、LABEL变量赋值了新的Field对象,后续你给新的TEXT构建了vocab,但数据集里绑定的还是第一次定义的、未构建vocab的旧Field对象,因此迭代时触发属性不存在报错。
你之前直接访问TEXT.vocab能正常返回,是因为访问的是第二次定义的新对象的vocab,和数据集绑定的旧对象无关,所以会出现看似有vocab但迭代报错的矛盾情况。
解决方法
删除数据集创建后重复定义TEXT和LABEL的两行代码即可,修改后的核心代码如下:
import numpy as np import spacy spacy_en = spacy.load("en") def tokenize(text): return [tok.text for tok in spacy_en.tokenizer(text)] import torch from torchtext.legacy.data import Field, LabelField, Iterator from torchtext.legacy.data import TabularDataset # 仅定义一次Field即可 TEXT = Field(sequential=True, use_vocab=True, tokenize=tokenize, lower=True) LABEL = LabelField(dtype = torch.long, use_vocab=False) fields = {"text": ("txt", TEXT), "label": ("lbl", LABEL)} train_data, test_data = TabularDataset.splits(path="/content/gdrive/MyDrive/Colab Notebooks/", train="Strong_Train.csv", test="Strong_Test.csv", format="csv", fields=fields) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 此处删除原重复定义TEXT、LABEL的两行代码 TEXT.build_vocab(train_data, max_size=10000 ) LABEL.build_vocab(train_data) train_iterator = Iterator(train_data, batch_size=1, device=device) for batch in train_iterator: print('hello')
内容的提问来源于stack exchange,提问作者B-Abbasi
相关产品推荐
相关产品推荐

