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.

  1. Utilització de torchvision per Carregar Datasets

torchvision é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.

  1. 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.

  1. 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.

© Copyright 2024. Tots els drets reservats