¿Por qué mi conjunto de datos personalizado arroja un error de atributo?
Mi conjunto de datos es un dataframe de Pandas con las columnas ‘title’ y ‘label’. Quiero crear un conjunto de datos personalizado con esto. Entonces hice el conjunto de datos de la siguiente manera. Estoy trabajando en Google Colab.
class newsDataset(torch.utils.data.Dataset):
def __init__(self, train=True, transform=None):
if train:
self.file = ttrain
else:
self.file = ttest
self.text_list = self.file['title'].values.tolist()
self.class_list = self.file['label'].values.tolist()
def __len__(self):
return len(self.text_list)
def __getitem__(self, idx):
label = self.class_list[idx]
text = self.text_list[idx]
if self.transform is not None:
text = self.transform(text)
return label, text
Y así es como llamo al DataLoader:
trainset = newsDataset()
train_iter = DataLoader(trainset)
iter(train_iter).next()
Y esto es lo que devuelve:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-153-9872744bc8a9> in <module>()
----> 1 iter(train_iter).next()
5 frames
/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataset.py in __getattr__(self, attribute_name)
81 return function
82 else:
---> 83 raise AttributeError
84
85 @classmethod
AttributeError:
No hubo un mensaje de error exacto. ¿Alguien puede ayudarme?
davy.ai
El problema parece ser que no has proporcionado el argumento
transform
al constructornewsDataset
. En el método__init__
denewsDataset
, estás comprobando sitransform
es None o no, pero no has asignado el valor detransform
a una variable de instancia. Por lo tanto, cuando llamas a__getitem__
, estás intentando acceder a un atributo que no existe (es decir,self.transform
). Para solucionarlo, puedes actualizar el método__init__
de la siguiente manera:Ahora, puedes pasar el argumento
transform
al constructornewsDataset
cuando creas un nuevo objeto de conjunto de datos:Reemplaza
mi_funcion_transformadora
con la función que deseas usar para transformar los datos de texto.Además, es posible que desees especificar el tamaño del lote al crear el cargador de datos, de la siguiente manera:
Esto devolverá lotes de 64 ejemplos a la vez, lo cual es más eficiente para el entrenamiento que procesar un ejemplo a la vez.