Les Xarxes Neuronals Convolucionals (CNNs) són un tipus especial de xarxa neuronal dissenyada 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 el reconeixement d'objectes, la classificació d'imatges i la detecció de cares.

Conceptes Clau

  1. Convolució

La convolució és l'operació fonamental en les CNNs. Consisteix en aplicar un filtre (o kernel) a una entrada (com una imatge) per produir una sortida (o mapa de característiques). Aquesta operació permet extreure característiques locals de la imatge, com ara vores, textures i patrons.

  1. Filtre (Kernel)

Un filtre és una matriu de pesos que es desplaça sobre la imatge d'entrada per calcular el producte puntual entre el filtre i les regions de la imatge. Els valors del filtre s'ajusten durant l'entrenament per aprendre les característiques rellevants.

  1. Mapa de Característiques

El mapa de característiques és el resultat de l'aplicació del filtre a la imatge d'entrada. Cada valor del mapa de característiques representa la resposta del filtre a una regió específica de la imatge.

  1. Capes Convolucionals

Les capes convolucionals són les capes principals de les CNNs. Cada capa aplica diversos filtres a la imatge d'entrada per produir múltiples mapes de característiques. Aquestes capes permeten a la xarxa aprendre característiques de nivell baix, mitjà i alt de la imatge.

  1. Capes de Pooling

Les capes de pooling redueixen la dimensió espacial dels mapes de característiques, agregant informació local. Les operacions de pooling més comunes són el max pooling i l'average pooling.

  1. Capes Completament Connectades

Després de diverses capes convolucionals i de pooling, les CNNs solen incloure capes completament connectades (fully connected layers) per combinar les característiques extretes i realitzar la classificació final.

Exemples Pràctics

Exemple 1: Operació de Convolució

import tensorflow as tf
import numpy as np

# Creem una imatge d'exemple (5x5)
imatge = np.array([
    [1, 2, 3, 0, 1],
    [4, 5, 6, 1, 0],
    [7, 8, 9, 0, 1],
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 0]
], dtype=np.float32)

# Creem un filtre (3x3)
filtre = np.array([
    [1, 0, -1],
    [1, 0, -1],
    [1, 0, -1]
], dtype=np.float32)

# Convertim la imatge i el filtre a tensors
imatge_tensor = tf.convert_to_tensor(imatge, dtype=tf.float32)
filtre_tensor = tf.convert_to_tensor(filtre, dtype=tf.float32)

# Afegim dimensions per a la convolució
imatge_tensor = tf.reshape(imatge_tensor, [1, 5, 5, 1])
filtre_tensor = tf.reshape(filtre_tensor, [3, 3, 1, 1])

# Apliquem la convolució
sortida = tf.nn.conv2d(imatge_tensor, filtre_tensor, strides=[1, 1, 1, 1], padding='VALID')

print(sortida.numpy())

Exemple 2: Construcció d'una CNN Simple

import tensorflow as tf
from tensorflow.keras import layers, models

# Definim el model
model = models.Sequential()

# Afegim una capa convolucional
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))

# Afegim una capa de pooling
model.add(layers.MaxPooling2D((2, 2)))

# Afegim una altra capa convolucional
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# Afegim una altra capa de pooling
model.add(layers.MaxPooling2D((2, 2)))

# Afegim una altra capa convolucional
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# Afegim capes completament connectades
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

# Compilem el model
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# Mostrem el resum del model
model.summary()

Exercicis Pràctics

Exercici 1: Aplicar un Filtre a una Imatge

Descripció: Escriu un codi que apliqui un filtre de detecció de vores a una imatge d'entrada.

Solució:

import tensorflow as tf
import numpy as np

# Creem una imatge d'exemple (5x5)
imatge = np.array([
    [1, 2, 3, 0, 1],
    [4, 5, 6, 1, 0],
    [7, 8, 9, 0, 1],
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 0]
], dtype=np.float32)

# Creem un filtre de detecció de vores (3x3)
filtre = np.array([
    [-1, -1, -1],
    [-1,  8, -1],
    [-1, -1, -1]
], dtype=np.float32)

# Convertim la imatge i el filtre a tensors
imatge_tensor = tf.convert_to_tensor(imatge, dtype=tf.float32)
filtre_tensor = tf.convert_to_tensor(filtre, dtype=tf.float32)

# Afegim dimensions per a la convolució
imatge_tensor = tf.reshape(imatge_tensor, [1, 5, 5, 1])
filtre_tensor = tf.reshape(filtre_tensor, [3, 3, 1, 1])

# Apliquem la convolució
sortida = tf.nn.conv2d(imatge_tensor, filtre_tensor, strides=[1, 1, 1, 1], padding='VALID')

print(sortida.numpy())

Exercici 2: Construir una CNN per Classificar Imatges de MNIST

Descripció: Utilitza TensorFlow per construir una CNN que classifiqui les imatges del dataset MNIST.

Solució:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models

# Carreguem el dataset MNIST
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# Normalitzem les imatges
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

# Definim el model
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

# Compilem el model
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# Entrenem el model
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))

# Avaluem el model
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Precisió en el test: {test_acc}")

Resum

En aquesta secció, hem introduït les Xarxes Neuronals Convolucionals (CNNs) i els seus conceptes clau, com ara la convolució, els filtres, els mapes de característiques, les capes convolucionals i les capes de pooling. També hem vist exemples pràctics de com aplicar convolucions i construir una CNN simple amb TensorFlow. Finalment, hem proporcionat exercicis pràctics per reforçar els conceptes apresos. En la següent secció, explorarem com construir una CNN més complexa i com utilitzar capes de pooling per millorar el rendiment del model.

© Copyright 2024. Tots els drets reservats