En aquest tema, explorarem algunes de les arquitectures més influents i utilitzades en el camp de les Xarxes Neuronals Convolucionals (CNN). Aquestes arquitectures han demostrat ser molt eficients en tasques de reconeixement d'imatges i altres aplicacions de visió per computador.

  1. LeNet-5

Descripció

LeNet-5 és una de les primeres arquitectures de CNN desenvolupada per Yann LeCun el 1998. Va ser dissenyada per reconèixer dígits escrits a mà en el conjunt de dades MNIST.

Estructura

LeNet-5 consta de les següents capes:

  1. Capa Convolucional 1: 6 filtres de 5x5, seguit d'una funció d'activació tanh.
  2. Capa de Pooling 1: Subsampling amb una finestra de 2x2.
  3. Capa Convolucional 2: 16 filtres de 5x5, seguit d'una funció d'activació tanh.
  4. Capa de Pooling 2: Subsampling amb una finestra de 2x2.
  5. Capa Convolucional 3: 120 filtres de 5x5, seguit d'una funció d'activació tanh.
  6. Capa Totalment Connectada 1: 84 neurones, seguit d'una funció d'activació tanh.
  7. Capa de Sortida: 10 neurones amb funció d'activació softmax per a la classificació de 10 classes.

Exemple de codi en PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F

class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.conv3 = nn.Conv2d(16, 120, kernel_size=5)
        self.fc1 = nn.Linear(120, 84)
        self.fc2 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.tanh(self.conv1(x))
        x = F.avg_pool2d(x, 2)
        x = F.tanh(self.conv2(x))
        x = F.avg_pool2d(x, 2)
        x = F.tanh(self.conv3(x))
        x = x.view(-1, 120)
        x = F.tanh(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# Creació del model
model = LeNet5()

  1. AlexNet

Descripció

AlexNet va ser desenvolupada per Alex Krizhevsky, Ilya Sutskever i Geoffrey Hinton el 2012. Va guanyar la competició ImageNet Large Scale Visual Recognition Challenge (ILSVRC) el 2012, marcant un gran avenç en el camp de la visió per computador.

Estructura

AlexNet consta de les següents capes:

  1. Capa Convolucional 1: 96 filtres de 11x11, stride de 4, seguit d'una funció d'activació ReLU.
  2. Capa de Pooling 1: Max pooling amb una finestra de 3x3 i stride de 2.
  3. Capa Convolucional 2: 256 filtres de 5x5, seguit d'una funció d'activació ReLU.
  4. Capa de Pooling 2: Max pooling amb una finestra de 3x3 i stride de 2.
  5. Capa Convolucional 3: 384 filtres de 3x3, seguit d'una funció d'activació ReLU.
  6. Capa Convolucional 4: 384 filtres de 3x3, seguit d'una funció d'activació ReLU.
  7. Capa Convolucional 5: 256 filtres de 3x3, seguit d'una funció d'activació ReLU.
  8. Capa de Pooling 3: Max pooling amb una finestra de 3x3 i stride de 2.
  9. Capa Totalment Connectada 1: 4096 neurones, seguit d'una funció d'activació ReLU.
  10. Capa Totalment Connectada 2: 4096 neurones, seguit d'una funció d'activació ReLU.
  11. Capa de Sortida: 1000 neurones amb funció d'activació softmax per a la classificació de 1000 classes.

Exemple de codi en PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F

class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(96, 256, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(256, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, 1000),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), 256 * 6 * 6)
        x = self.classifier(x)
        return x

# Creació del model
model = AlexNet()

  1. VGGNet

Descripció

VGGNet va ser desenvolupada per l'equip de Visual Geometry Group de la Universitat d'Oxford el 2014. Es caracteritza per l'ús de capes convolucionals amb filtres de 3x3 i una profunditat considerable.

Estructura

VGGNet té diverses variants, com VGG16 i VGG19, que es diferencien pel nombre de capes convolucionals. Aquí descriurem VGG16:

  1. Capa Convolucional 1: 64 filtres de 3x3, seguit d'una funció d'activació ReLU.
  2. Capa Convolucional 2: 64 filtres de 3x3, seguit d'una funció d'activació ReLU.
  3. Capa de Pooling 1: Max pooling amb una finestra de 2x2 i stride de 2.
  4. Capa Convolucional 3: 128 filtres de 3x3, seguit d'una funció d'activació ReLU.
  5. Capa Convolucional 4: 128 filtres de 3x3, seguit d'una funció d'activació ReLU.
  6. Capa de Pooling 2: Max pooling amb una finestra de 2x2 i stride de 2.
  7. Capa Convolucional 5: 256 filtres de 3x3, seguit d'una funció d'activació ReLU.
  8. Capa Convolucional 6: 256 filtres de 3x3, seguit d'una funció d'activació ReLU.
  9. Capa Convolucional 7: 256 filtres de 3x3, seguit d'una funció d'activació ReLU.
  10. Capa de Pooling 3: Max pooling amb una finestra de 2x2 i stride de 2.
  11. Capa Convolucional 8: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  12. Capa Convolucional 9: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  13. Capa Convolucional 10: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  14. Capa de Pooling 4: Max pooling amb una finestra de 2x2 i stride de 2.
  15. Capa Convolucional 11: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  16. Capa Convolucional 12: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  17. Capa Convolucional 13: 512 filtres de 3x3, seguit d'una funció d'activació ReLU.
  18. Capa de Pooling 5: Max pooling amb una finestra de 2x2 i stride de 2.
  19. Capa Totalment Connectada 1: 4096 neurones, seguit d'una funció d'activació ReLU.
  20. Capa Totalment Connectada 2: 4096 neurones, seguit d'una funció d'activació ReLU.
  21. Capa de Sortida: 1000 neurones amb funció d'activació softmax per a la classificació de 1000 classes.

Exemple de codi en PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F

class VGG16(nn.Module):
    def __init__(self):
        super(VGG16, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(128, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(256, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 1000),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

# Creació del model
model = VGG16()

  1. ResNet

Descripció

ResNet (Residual Network) va ser desenvolupada per Kaiming He, Xiangyu Zhang, Shaoqing Ren i Jian Sun el 2015. Va guanyar la competició ILSVRC el 2015. La seva innovació principal és l'ús de blocs residuals, que permeten entrenar xarxes molt profundes.

Estructura

ResNet té diverses variants, com ResNet-50, ResNet-101 i ResNet-152, que es diferencien pel nombre de capes. Aquí descriurem ResNet-50:

  1. Blocs Residuals: Cada bloc consta de capes convolucionals amb connexions d'identitat (skip connections) que permeten el pas de gradients durant l'entrenament.
  2. Capa de Sortida: 1000 neurones amb funció d'activació softmax per a la classificació de 1000 classes.

Exemple de codi en PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F

class BasicBlock(nn.Module):
    expansion = 1

    def __init__(self, in_planes, planes, stride=1):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)

        self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != self.expansion*planes:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(self.expansion*planes)
            )

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)
        out = F.relu(out)
        return out

class ResNet(nn.Module):
    def __init__(self, block, num_blocks, num_classes=1000):
        super(ResNet, self).__init__()
        self.in_planes = 64

        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
        self.bn1 = nn.BatchNorm2d(64)
        self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1)
        self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)
        self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)
        self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)
        self.linear = nn.Linear(512*block.expansion, num_classes)

    def _make_layer(self, block, planes, num_blocks, stride):
        strides = [stride] + [1]*(num_blocks-1)
        layers = []
        for stride in strides:
            layers.append(block(self.in_planes, planes, stride))
            self.in_planes = planes * block.expansion
        return nn.Sequential(*layers)

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = F.max_pool2d(out, kernel_size=3, stride=2, padding=1)
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = F.avg_pool2d(out, 4)
        out = out.view(out.size(0), -1)
        out = self.linear(out)
        return out

def ResNet50():
    return ResNet(BasicBlock, [3, 4, 6, 3])

# Creació del model
model = ResNet50()

Conclusió

En aquesta secció, hem explorat algunes de les arquitectures més populars de CNN, incloent LeNet-5, AlexNet, VGGNet i ResNet. Cada una d'aquestes arquitectures ha contribuït significativament al desenvolupament de la visió per computador i ha demostrat ser molt efectiva en diverses tasques de reconeixement d'imatges. A mesura que avancem, aquestes arquitectures serviran com a base per a comprendre i desenvolupar models més avançats en Deep Learning.

© Copyright 2024. Tots els drets reservats