En aquest tema, aprendrem com ajustar finament les Xarxes Neuronals Convolucionals (CNNs) per millorar el seu rendiment en tasques específiques. L'ajust fi és una tècnica que implica prendre un model preentrenat i adaptar-lo a una nova tasca. Aquesta tècnica és especialment útil quan tenim una quantitat limitada de dades per entrenar un model des de zero.

Objectius

  • Entendre el concepte d'ajust fi.
  • Aprendre a carregar un model preentrenat.
  • Modificar l'arquitectura del model per adaptar-lo a una nova tasca.
  • Entrenar el model ajustat finament amb un nou conjunt de dades.

  1. Què és l'Ajust Fi?

L'ajust fi (fine-tuning) és el procés de prendre un model que ha estat preentrenat en una gran base de dades (com ImageNet) i adaptar-lo a una nova tasca amb un conjunt de dades més petit. Els avantatges d'aquesta tècnica inclouen:

  • Reducció del temps d'entrenament: Com que el model ja ha après característiques generals de les imatges, només cal ajustar-lo a les especificitats de la nova tasca.
  • Millor rendiment amb menys dades: Els models preentrenats ja tenen una bona comprensió de les característiques visuals, la qual cosa permet obtenir bons resultats fins i tot amb menys dades.

  1. Carregar un Model Preentrenat

PyTorch proporciona una varietat de models preentrenats a través del mòdul torchvision.models. A continuació, carregarem un model ResNet preentrenat.

import torch
import torchvision.models as models

# Carregar un model ResNet preentrenat
model = models.resnet18(pretrained=True)

  1. Modificar l'Arquitectura del Model

Per adaptar el model a una nova tasca, hem de modificar l'última capa de la xarxa per ajustar-la al nombre de classes de la nostra nova tasca. Suposem que volem classificar imatges en 10 categories.

import torch.nn as nn

# Modificar l'última capa de la xarxa
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)

  1. Entrenar el Model Ajustat Finament

Ara que hem modificat el model, podem entrenar-lo amb el nostre nou conjunt de dades. A continuació, es mostra un exemple de com fer-ho.

4.1 Preparar les Dades

from torchvision import datasets, transforms

# Definir les transformacions per a les dades d'entrenament i validació
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# Carregar les dades d'entrenament i validació
train_dataset = datasets.ImageFolder(root='path/to/train_data', transform=transform)
val_dataset = datasets.ImageFolder(root='path/to/val_data', transform=transform)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=32, shuffle=False)

4.2 Definir la Funció de Pèrdua i l'Optimitzador

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

4.3 Entrenar el Model

num_epochs = 10

for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader)}')

    # Validació
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for inputs, labels in val_loader:
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    
    print(f'Validation Accuracy: {100 * correct / total}%')

  1. Resum

En aquesta secció, hem après com ajustar finament una CNN preentrenada per a una nova tasca. Hem cobert els passos per carregar un model preentrenat, modificar la seva arquitectura, preparar les dades i entrenar el model. L'ajust fi és una tècnica poderosa que pot millorar significativament el rendiment dels models amb menys dades i menys temps d'entrenament.

En el següent mòdul, explorarem les Xarxes Neuronals Recurrents (RNNs) i com utilitzar-les per a tasques seqüencials.

© Copyright 2024. Tots els drets reservats