En aquest projecte, aplicarem els coneixements adquirits al llarg del curs per construir un model de classificació d'imatges utilitzant PyTorch. Aquest projecte ens permetrà consolidar conceptes com la càrrega i preprocessament de dades, la construcció de xarxes neuronals, l'entrenament i la validació de models, així com el desament i la càrrega de models.

Objectius del Projecte

  1. Càrrega i Preprocessament de Dades: Aprendre a carregar un conjunt de dades d'imatges i aplicar tècniques de preprocessament.
  2. Construcció del Model: Dissenyar i implementar una xarxa neuronal convolucional (CNN) per a la classificació d'imatges.
  3. Entrenament del Model: Entrenar la xarxa neuronal amb les dades de formació.
  4. Validació i Avaluació: Validar el model amb un conjunt de dades de validació i avaluar-ne el rendiment.
  5. Desament i Càrrega del Model: Desar el model entrenat i aprendre a carregar-lo per a futures prediccions.

  1. Càrrega i Preprocessament de Dades

1.1. Importació de Llibreries Necessàries

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

1.2. Definició de Transformacions

transform = transforms.Compose([
    transforms.Resize((32, 32)),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

1.3. Càrrega del Conjunt de Dades

Utilitzarem el conjunt de dades CIFAR-10 per a aquest projecte.

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=32, shuffle=True)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=32, shuffle=False)

  1. Construcció del Model

2.1. Definició de la Xarxa Neuronal Convolucional (CNN)

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(32 * 8 * 8, 128)
        self.fc2 = nn.Linear(128, 10)
        self.relu = nn.ReLU()
    
    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = self.pool(self.relu(self.conv2(x)))
        x = x.view(-1, 32 * 8 * 8)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = SimpleCNN()

  1. Entrenament del Model

3.1. Definició de la Funció de Pèrdua i l'Optimitzador

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

3.2. Bucle d'Entrenament

for epoch in range(10):  # nombre d'èpoques
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if i % 200 == 199:  # imprimeix cada 200 mini-lots
            print(f'[Epoch {epoch + 1}, Mini-lot {i + 1}] pèrdua: {running_loss / 200:.3f}')
            running_loss = 0.0

print('Entrenament completat')

  1. Validació i Avaluació

4.1. Avaluació del Model

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Precisió de la xarxa en les 10000 imatges de prova: {100 * correct / total:.2f}%')

  1. Desament i Càrrega del Model

5.1. Desament del Model

torch.save(net.state_dict(), 'model.pth')
print('Model desat')

5.2. Càrrega del Model

net = SimpleCNN()
net.load_state_dict(torch.load('model.pth'))
print('Model carregat')

Conclusió

En aquest projecte, hem après a construir un model de classificació d'imatges utilitzant PyTorch. Hem cobert tot el procés des de la càrrega i preprocessament de dades fins a la construcció, entrenament, validació i desament del model. Aquest projecte ens proporciona una base sòlida per abordar problemes de classificació d'imatges més complexos i avançats en el futur.

© Copyright 2024. Tots els drets reservats