Què són les Xarxes Neuronals Convolucionals (CNNs)?
Les Xarxes Neuronals Convolucionals (CNNs) són un tipus especial de xarxa neuronal dissenyada específicament per processar dades amb una estructura de graella, com ara imatges. Les CNNs han demostrat ser extremadament efectives en tasques de visió per computador, com ara la classificació d'imatges, la detecció d'objectes i la segmentació d'imatges.
Característiques Clau de les CNNs
-
Convolucions:
- Les convolucions són operacions matemàtiques que combinen dues funcions per produir una tercera funció. En el context de les CNNs, les convolucions s'utilitzen per extreure característiques de les imatges.
- Les convolucions es realitzen mitjançant filtres (o kernels) que es desplacen sobre la imatge d'entrada per produir mapes de característiques.
-
Capas de Pooling:
- Les capes de pooling redueixen la dimensionalitat dels mapes de característiques, mantenint les característiques més importants.
- Els tipus més comuns de pooling són el max pooling i l'average pooling.
-
Capas Completament Connectades:
- Després de diverses capes convolucionals i de pooling, les CNNs solen tenir una o més capes completament connectades (fully connected layers) que fan la classificació final.
-
ReLU (Rectified Linear Unit):
- La funció d'activació ReLU s'utilitza per introduir no linealitat en el model, permetent que la xarxa aprengui relacions no lineals.
Arquitectura Bàsica d'una CNN
Una CNN típica consta de les següents capes:
-
Capa d'Entrada:
- Rep la imatge d'entrada, que normalment és una matriu de píxels.
-
Capas Convolucionals:
- Apliquen filtres a la imatge d'entrada per extreure mapes de característiques.
-
Capas de Pooling:
- Redueixen la dimensionalitat dels mapes de característiques.
-
Capas Completament Connectades:
- Fan la classificació final basant-se en les característiques extretes.
-
Capa de Sortida:
- Proporciona la predicció final del model.
Exemple Pràctic: Construcció d'una CNN Simple amb PyTorch
A continuació, construirem una CNN simple utilitzant PyTorch per classificar imatges del dataset MNIST.
Pas 1: Importar les Llibreries Necessàries
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms
Pas 2: Definir la Xarxa Neuronal
class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0) self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1) self.fc1 = nn.Linear(64 * 7 * 7, 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, 64 * 7 * 7) x = self.relu(self.fc1(x)) x = self.fc2(x) return x
Pas 3: Preparar les Dades
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True) testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
Pas 4: Entrenar la Xarxa
net = SimpleCNN() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) for epoch in range(10): # nombre d'epochs 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 % 100 == 99: # imprimir cada 100 mini-batches print(f'[Epoch {epoch + 1}, Batch {i + 1}] loss: {running_loss / 100:.3f}') running_loss = 0.0 print('Entrenament completat')
Pas 5: Provar la Xarxa
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 test: {100 * correct / total:.2f}%')
Resum
En aquesta secció, hem introduït les Xarxes Neuronals Convolucionals (CNNs) i hem explorat les seves característiques clau, com les convolucions, les capes de pooling i les capes completament connectades. També hem construït una CNN simple utilitzant PyTorch per classificar imatges del dataset MNIST. En el següent tema, aprofundirem en la construcció d'una CNN des de zero, explorant més detalls i tècniques avançades.
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