En aquest tema, aprendrem a construir una Xarxa Neuronal Convolucional (CNN) utilitzant TensorFlow. Les CNNs són especialment efectives per a tasques de visió per computador, com el reconeixement d'imatges i la classificació. A continuació, desglossarem els passos necessaris per crear una CNN des de zero.

  1. Importació de llibreries necessàries

Primer, importarem les llibreries necessàries per construir la nostra CNN.

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

  1. Carregant i pre-processant les dades

Per aquest exemple, utilitzarem el dataset CIFAR-10, que conté 60,000 imatges de 10 classes diferents.

# Carregar el dataset CIFAR-10
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()

# Normalitzar les imatges a l'interval [0, 1]
train_images, test_images = train_images / 255.0, test_images / 255.0

  1. Construcció del model de la CNN

Ara, construirem la nostra CNN utilitzant les capes de Keras.

model = models.Sequential()

# Primera capa convolucional
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))

# Segona capa convolucional
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

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

# Aplanar les capes i afegir capes denses
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

Explicació de les capes

  1. Capes Convolucionals (Conv2D): Aquestes capes apliquen filtres convolucionals a les imatges d'entrada per extreure característiques.
  2. Capes de Pooling (MaxPooling2D): Redueixen la dimensió espacial de les característiques, mantenint les més importants.
  3. Capa d'Aplanament (Flatten): Converteix la matriu 2D resultant en un vector 1D per poder connectar-lo a les capes denses.
  4. Capes Denses (Dense): Capes completament connectades que fan la classificació final.

  1. Compilació del model

Compilarem el model especificant la funció de pèrdua, l'optimitzador i les mètriques.

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

  1. Entrenament del model

Entrenarem el model amb les dades d'entrenament.

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))

  1. Avaluació del model

Finalment, avaluarem el model amb les dades de test.

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')

  1. Visualització dels resultats

Podem visualitzar la precisió i la pèrdua durant l'entrenament i la validació.

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()

Exercicis pràctics

  1. Modifica la CNN: Afegeix més capes convolucionals i de pooling. Observa com afecta això a la precisió del model.
  2. Canvia l'optimitzador: Prova diferents optimitzadors com SGD o RMSprop i compara els resultats.
  3. Augmentació de dades: Implementa augmentació de dades per millorar la generalització del model.

Solucions dels exercicis

Exercici 1: Modifica la CNN

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
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(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(10))

Exercici 2: Canvia l'optimitzador

model.compile(optimizer='sgd',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

Exercici 3: Augmentació de dades

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

datagen.fit(train_images)

history = model.fit(datagen.flow(train_images, train_labels, batch_size=32),
                    epochs=10, validation_data=(test_images, test_labels))

Conclusió

En aquest tema, hem après a construir una CNN utilitzant TensorFlow, des de la càrrega de dades fins a l'entrenament i l'avaluació del model. Les CNNs són una eina poderosa per a tasques de visió per computador, i amb la pràctica, es poden ajustar per obtenir resultats excel·lents en una varietat de problemes.

© Copyright 2024. Tots els drets reservats