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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
Curs de TensorFlow
Mòdul 1: Introducció a TensorFlow
- Què és TensorFlow?
- Configuració de TensorFlow
- Conceptes bàsics de TensorFlow
- Hola món amb TensorFlow
Mòdul 2: Conceptes bàsics de TensorFlow
Mòdul 3: Gestió de dades a TensorFlow
Mòdul 4: Construcció de xarxes neuronals
- Introducció a les xarxes neuronals
- Creació d'una xarxa neuronal simple
- Funcions d'activació
- Funcions de pèrdua i optimitzadors
Mòdul 5: Xarxes neuronals convolucionals (CNNs)
Mòdul 6: Xarxes neuronals recurrents (RNNs)
- Introducció a les RNNs
- Construcció d'una RNN
- Memòria a llarg termini (LSTM)
- Unitats recurrents amb porta (GRUs)
Mòdul 7: Tècniques avançades de TensorFlow
- Capes i models personalitzats
- TensorFlow Hub
- Aprenentatge per transferència
- Ajust de hiperparàmetres