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.
- Importació de llibreries necessàries
Primer, importarem les llibreries necessàries per construir la nostra CNN.
- 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
- 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
- Capes Convolucionals (Conv2D): Aquestes capes apliquen filtres convolucionals a les imatges d'entrada per extreure característiques.
- Capes de Pooling (MaxPooling2D): Redueixen la dimensió espacial de les característiques, mantenint les més importants.
- Capa d'Aplanament (Flatten): Converteix la matriu 2D resultant en un vector 1D per poder connectar-lo a les capes denses.
- Capes Denses (Dense): Capes completament connectades que fan la classificació final.
- 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'])
- 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))
- 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}')
- 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
- Modifica la CNN: Afegeix més capes convolucionals i de pooling. Observa com afecta això a la precisió del model.
- Canvia l'optimitzador: Prova diferents optimitzadors com
SGD
oRMSprop
i compara els resultats. - 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.
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