#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
, а затем создаете для него вокаб.
use_vocab
: Следует ли использоватьVocab
объект. ЕслиFalse
данные в этом поле уже должны быть числовыми. По умолчанию:True
.
Я бы начал с устранения этих проблем и посмотрел, устранит ли это вашу ошибку.