Les capes de pooling són una part fonamental de les xarxes neuronals convolucionals (CNNs). Aquestes capes s'utilitzen per reduir les dimensions espacials (amplada i alçada) de les representacions intermedies, mantenint la informació més rellevant. Això ajuda a reduir la complexitat computacional i a controlar el sobreajustament.

Objectius d'aquest tema

  • Entendre què són les capes de pooling i per què s'utilitzen.
  • Aprendre sobre els diferents tipus de pooling.
  • Implementar capes de pooling en TensorFlow.

Què són les capes de pooling?

Les capes de pooling redueixen les dimensions espacials de les dades d'entrada, agregant informació en regions locals. Això es fa per:

  • Reduir la quantitat de paràmetres i càlculs en la xarxa.
  • Controlar el sobreajustament.
  • Fer la xarxa més robusta a les translacions i distorsions de les imatges d'entrada.

Tipus de pooling

  1. Max Pooling

El max pooling selecciona el valor màxim d'una regió de la imatge d'entrada. Això ajuda a conservar les característiques més prominents.

  1. Average Pooling

L'average pooling calcula la mitjana dels valors en una regió de la imatge d'entrada. Això proporciona una representació més suau de les característiques.

  1. Global Pooling

El global pooling redueix cada mapa de característiques a un únic valor, ja sigui mitjançant max pooling o average pooling. Això és útil per a la classificació d'imatges.

Implementació de capes de pooling en TensorFlow

A continuació, implementarem exemples de max pooling i average pooling utilitzant TensorFlow.

Max Pooling

import tensorflow as tf

# Creem una entrada de mostra
input_data = tf.constant([
    [[1.0, 2.0], [3.0, 4.0]],
    [[5.0, 6.0], [7.0, 8.0]]
], dtype=tf.float32)

# Afegim una dimensió per representar el batch size i els canals
input_data = tf.reshape(input_data, [1, 2, 2, 1])

# Definim una capa de max pooling
max_pooling_layer = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)

# Apliquem la capa de max pooling
output_data = max_pooling_layer(input_data)

print("Input Data:\n", input_data.numpy())
print("Output Data after Max Pooling:\n", output_data.numpy())

Average Pooling

import tensorflow as tf

# Creem una entrada de mostra
input_data = tf.constant([
    [[1.0, 2.0], [3.0, 4.0]],
    [[5.0, 6.0], [7.0, 8.0]]
], dtype=tf.float32)

# Afegim una dimensió per representar el batch size i els canals
input_data = tf.reshape(input_data, [1, 2, 2, 1])

# Definim una capa de average pooling
average_pooling_layer = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=2)

# Apliquem la capa de average pooling
output_data = average_pooling_layer(input_data)

print("Input Data:\n", input_data.numpy())
print("Output Data after Average Pooling:\n", output_data.numpy())

Exercicis pràctics

Exercici 1: Implementar Max Pooling

Implementa una capa de max pooling amb una mida de finestra de 3x3 i un pas de 2 en una imatge d'entrada de 6x6.

Solució

import tensorflow as tf

# Creem una entrada de mostra
input_data = tf.constant([
    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
    [7.0, 8.0, 9.0, 10.0, 11.0, 12.0],
    [13.0, 14.0, 15.0, 16.0, 17.0, 18.0],
    [19.0, 20.0, 21.0, 22.0, 23.0, 24.0],
    [25.0, 26.0, 27.0, 28.0, 29.0, 30.0],
    [31.0, 32.0, 33.0, 34.0, 35.0, 36.0]
], dtype=tf.float32)

# Afegim una dimensió per representar el batch size i els canals
input_data = tf.reshape(input_data, [1, 6, 6, 1])

# Definim una capa de max pooling
max_pooling_layer = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=2)

# Apliquem la capa de max pooling
output_data = max_pooling_layer(input_data)

print("Input Data:\n", input_data.numpy())
print("Output Data after Max Pooling:\n", output_data.numpy())

Exercici 2: Implementar Average Pooling

Implementa una capa de average pooling amb una mida de finestra de 2x2 i un pas de 2 en una imatge d'entrada de 4x4.

Solució

import tensorflow as tf

# Creem una entrada de mostra
input_data = tf.constant([
    [1.0, 2.0, 3.0, 4.0],
    [5.0, 6.0, 7.0, 8.0],
    [9.0, 10.0, 11.0, 12.0],
    [13.0, 14.0, 15.0, 16.0]
], dtype=tf.float32)

# Afegim una dimensió per representar el batch size i els canals
input_data = tf.reshape(input_data, [1, 4, 4, 1])

# Definim una capa de average pooling
average_pooling_layer = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=2)

# Apliquem la capa de average pooling
output_data = average_pooling_layer(input_data)

print("Input Data:\n", input_data.numpy())
print("Output Data after Average Pooling:\n", output_data.numpy())

Resum

En aquest tema, hem après sobre les capes de pooling, incloent-hi els tipus més comuns com el max pooling i l'average pooling. Hem vist com aquestes capes ajuden a reduir les dimensions espacials de les dades d'entrada, mantenint la informació més rellevant. També hem implementat exemples pràctics de capes de pooling en TensorFlow.

En el següent tema, explorarem les arquitectures avançades de CNN, on veurem com es poden combinar diferents tipus de capes per construir models més potents i eficients.

© Copyright 2024. Tots els drets reservats