En aquest tema, aprendrem com carregar i preprocessar dades per entrenar xarxes neuronals amb PyTorch. La càrrega i preprocessament de dades són passos crucials per assegurar que el model rebi les dades en el format correcte i amb la qualitat necessària per obtenir bons resultats.
Objectius
- Entendre com utilitzar
torchvision
per carregar datasets comuns. - Aprendre a crear datasets personalitzats amb
torch.utils.data.Dataset
. - Utilitzar
DataLoader
per gestionar el batching i el shuffle de les dades. - Aplicar transformacions per preprocessar les dades.
- Utilització de
torchvision
per Carregar Datasets
torchvision
per Carregar Datasetstorchvision
és una biblioteca que proporciona eines per treballar amb imatges i inclou diversos datasets populars com CIFAR-10, MNIST, etc.
Exemple: Carregar el Dataset CIFAR-10
import torch import torchvision import torchvision.transforms as transforms # Definim les transformacions a aplicar a les imatges transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # Carreguem el dataset CIFAR-10 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
Explicació del Codi
- Transformacions: Utilitzem
transforms.Compose
per aplicar una sèrie de transformacions a les imatges. En aquest cas, convertim les imatges a tensors i les normalitzem. - Dataset: Carreguem el dataset CIFAR-10 amb
torchvision.datasets.CIFAR10
. - DataLoader: Utilitzem
DataLoader
per gestionar el batching i el shuffle de les dades.
- Creació de Datasets Personalitzats
Quan treballem amb dades que no estan disponibles en torchvision
, podem crear el nostre propi dataset personalitzat utilitzant torch.utils.data.Dataset
.
Exemple: Dataset Personalitzat
import torch from torch.utils.data import Dataset, DataLoader from PIL import Image import os class CustomDataset(Dataset): def __init__(self, annotations_file, img_dir, transform=None): self.img_labels = pd.read_csv(annotations_file) self.img_dir = img_dir self.transform = transform def __len__(self): return len(self.img_labels) def __getitem__(self, idx): img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0]) image = Image.open(img_path) label = self.img_labels.iloc[idx, 1] if self.transform: image = self.transform(image) return image, label # Exemple d'ús transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor() ]) dataset = CustomDataset(annotations_file='annotations.csv', img_dir='path/to/images', transform=transform) dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)
Explicació del Codi
- CustomDataset: Definim una classe que hereta de
torch.utils.data.Dataset
i implementa els mètodes__init__
,__len__
i__getitem__
. - Transformacions: Podem aplicar transformacions a les imatges, com redimensionar-les i convertir-les a tensors.
- DataLoader: Utilitzem
DataLoader
per gestionar el batching i el shuffle de les dades.
- Transformacions de Dades
Les transformacions són essencials per preprocessar les dades abans d'entrenar el model. torchvision.transforms
proporciona diverses transformacions que podem aplicar a les imatges.
Exemple: Transformacions Comunes
import torchvision.transforms as transforms transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ])
Explicació del Codi
- RandomHorizontalFlip: Aplica una inversió horitzontal aleatòria a les imatges.
- RandomCrop: Realitza un retall aleatori de les imatges amb un padding de 4 píxels.
- ToTensor: Converteix les imatges a tensors.
- Normalize: Normalitza les imatges amb una mitjana i desviació estàndard especificades.
Exercicis Pràctics
Exercici 1: Carregar el Dataset MNIST
Carrega el dataset MNIST utilitzant torchvision
i aplica les transformacions següents: converteix les imatges a tensors i normalitza-les amb una mitjana de 0.5 i una desviació estàndard de 0.5.
import torchvision.transforms as transforms import torchvision.datasets as datasets from torch.utils.data import DataLoader transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2) testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) testloader = DataLoader(testset, batch_size=64, shuffle=False, num_workers=2)
Exercici 2: Crear un Dataset Personalitzat
Crea un dataset personalitzat per a un conjunt d'imatges emmagatzemades en una carpeta. Aplica les transformacions següents: redimensiona les imatges a 128x128 píxels i converteix-les a tensors.
import pandas as pd from torch.utils.data import Dataset, DataLoader from PIL import Image import os class CustomDataset(Dataset): def __init__(self, annotations_file, img_dir, transform=None): self.img_labels = pd.read_csv(annotations_file) self.img_dir = img_dir self.transform = transform def __len__(self): return len(self.img_labels) def __getitem__(self, idx): img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0]) image = Image.open(img_path) label = self.img_labels.iloc[idx, 1] if self.transform: image = self.transform(image) return image, label transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor() ]) dataset = CustomDataset(annotations_file='annotations.csv', img_dir='path/to/images', transform=transform) dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)
Resum
En aquesta secció, hem après com carregar i preprocessar dades utilitzant PyTorch. Hem vist com utilitzar torchvision
per carregar datasets comuns, com crear datasets personalitzats i com aplicar transformacions per preprocessar les dades. Aquests coneixements són fonamentals per preparar les dades abans d'entrenar un model de xarxa neuronal.
En el següent tema, explorarem el bucle d'entrenament, on veurem com utilitzar les dades carregades per entrenar una xarxa neuronal.
PyTorch: De Principiant a Avançat
Mòdul 1: Introducció a PyTorch
- Què és PyTorch?
- Configuració de l'Entorn
- Operacions Bàsiques amb Tensor
- Autograd: Diferenciació Automàtica
Mòdul 2: Construcció de Xarxes Neuronals
- Introducció a les Xarxes Neuronals
- Creació d'una Xarxa Neuronal Simple
- Funcions d'Activació
- Funcions de Pèrdua i Optimització
Mòdul 3: Entrenament de Xarxes Neuronals
- Càrrega i Preprocessament de Dades
- Bucle d'Entrenament
- Validació i Prova
- Desament i Càrrega de Models
Mòdul 4: Xarxes Neuronals Convolucionals (CNNs)
- Introducció a les CNNs
- Construcció d'una CNN des de Zero
- Aprenentatge per Transferència amb Models Preentrenats
- Ajust Fi de les CNNs
Mòdul 5: Xarxes Neuronals Recurrents (RNNs)
- Introducció a les RNNs
- Construcció d'una RNN des de Zero
- Xarxes de Memòria a Llarg i Curt Termini (LSTM)
- Unitats Recurrents Gated (GRUs)
Mòdul 6: Temes Avançats
- Xarxes Generatives Adversàries (GANs)
- Aprenentatge per Reforç amb PyTorch
- Desplegament de Models PyTorch
- Optimització del Rendiment