Не удается получить доступ к пакетным элементам в итераторе — Ошибка атрибута Torchtext: объект «Поле» не имеет атрибута «vocab»

#python #pytorch #torchtext

Вопрос:

Я не могу получить доступ к пакетным элементам из объекта итератора в Torchtext. Ниже приведена ошибка

Ошибка атрибута: объект «Поле» не имеет атрибута «вокаб»

Код для воссоздания проблемы

 #Access to Drive
from google.colab import drive
drive.mount ('/content/gdrive')
 
 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

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)}

from torchtext.legacy.data import TabularDataset
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 = Field(sequential=True, use_vocab=True, tokenize=tokenize, lower=True)
LABEL = LabelField(dtype = torch.long, use_vocab=False) 

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')
 

Мой анализ проблемы
Согласно описанию ошибки, проблема возникает из-за объекта «Поле»; ТЕКСТ-это объект поля в этом коде.

type(TEXT)

Вывод: torchtext.legacy.данные.поле.Поле

Так как в ошибке говорится,

Объект поля не имеет атрибута ‘vocab’

доступ к «vocab» должен выдавать ошибку, но она не выдает ошибку

TEXT.vocab

Вывод: <torchtext.legacy.vocab.Vocab по адресу 0x7fce37b91950>

Я также могу получить длину вокаба

len(TEXT.vocab)

Выход: 2

Таким образом, все еще остается вопрос: если в объекте поля существует атрибут «vocab», почему я получаю эту ошибку? и как мне это решить?

Особенности окружающей среды

Запуск кода в Google Colab

Версия Torchtext-0.10.0

Ответ №1:

После настройки устройства вы переопределяете TEXT и LABEL . В этом нет необходимости, и это может вызвать проблемы. Кроме того, вы настраиваете use_vocab=False свой LabelField , а затем создаете для него вокаб.

Из torchtext документов 0.8:

use_vocab : Следует ли использовать Vocab объект. Если False данные в этом поле уже должны быть числовыми. По умолчанию: True .

Я бы начал с устранения этих проблем и посмотрел, устранит ли это вашу ошибку.