python - PyTorch: Cómo usar DataLoaders para conjuntos de datos personalizados
subplot python (2)
¿Cómo hacer uso de torch.utils.data.Dataset
y torch.utils.data.DataLoader
en sus propios datos (no solo torchvision.datasets
)?
¿Hay alguna forma de usar los DataLoaders
incorporados que usan en los conjuntos de datos TorchVisionDatasets
para usar en cualquier conjunto de datos?
Puede hacer esto fácilmente extendiendo la clase data.Dataset
. De acuerdo con la API , todo lo que tienes que hacer es implementar dos funciones: __getitem__
y __len__
.
Luego puede envolver el conjunto de datos con el DataLoader como se muestra en la API y en la respuesta de @pho7.
Creo que la clase ImageFolder
es una referencia. Ver código here .
Sí, eso es posible. Solo crea los objetos por ti mismo, por ejemplo
import torch.utils.data as data_utils
train = data_utils.TensorDataset(features, targets)
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)
Donde las features
y los targets
son tensores. features
deben ser 2-D, es decir, una matriz donde cada línea representa una muestra de entrenamiento, y los targets
pueden ser 1-D o 2-D, dependiendo de si se trata de predecir un escalar o un vector.
¡Espero que ayude!
EDIT : respuesta a la pregunta de @sarthak
Básicamente sí. Si crea un objeto de tipo TensorData
, el constructor investiga si las primeras dimensiones del tensor de característica (que en realidad se llama data_tensor
) y el tensor de destino (llamado tensor de target_tensor
) tienen la misma longitud:
assert data_tensor.size(0) == target_tensor.size(0)
Sin embargo, si desea alimentar estos datos en una red neuronal posteriormente, debe tener cuidado. Mientras que las capas de convolución funcionan con datos como el suyo, (creo) todos los otros tipos de capas esperan que los datos se den en forma de matriz. Entonces, si se encuentra con un problema como este, entonces una solución fácil sería convertir su conjunto de datos 4D (dado como algún tipo de tensor, por ejemplo, FloatTensor
) en una matriz usando la view
método. Para su conjunto de datos 5000xnxnx3, esto se vería así:
2d_dataset = 4d_dataset.view(5000, -1)
(El valor -1
le dice a PyTorch que calcule automáticamente la longitud de la segunda dimensión).