You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:45:03