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
torchvisionper carregar datasets comuns. - Aprendre a crear datasets personalitzats amb
torch.utils.data.Dataset. - Utilitzar
DataLoaderper 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.Composeper 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
DataLoaderper 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.Dataseti 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
DataLoaderper 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
