es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que no has proporcionado el argumento transform al constructor newsDataset. En el método __init__ de newsDataset, estás comprobando si transform es None o no, pero no has asignado el valor de transform 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:

    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()
            self.transform = transform  # agregar esta línea para almacenar el argumento transform
    
        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
    

    Ahora, puedes pasar el argumento transform al constructor newsDataset cuando creas un nuevo objeto de conjunto de datos:

    trainset = newsDataset(transform=mi_funcion_transformadora)
    

    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:

    train_iter = DataLoader(trainset, batch_size=64)
    

    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.

Comments are closed.