Una convolución desliza un filtro por los datos
Una convolución es una operación que desliza un filtro pequeño por una fila o una cuadrícula de números. Mide cuánto se parece cada zona a un patrón. Es la pieza que deja a una red neuronal reconocer bordes y formas en una imagen.
Hoy la calculas a mano con una fila de números y después con una cuadrícula pequeña.
Al final de esta lección
Nota
Puedo explicar cómo una convolución encuentra patrones en una cuadrícula.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Filtro | una lista pequeña de pesos que busca un patrón (kernel en inglés) | [-1, 1] |
| Convolución | deslizar un filtro y sumar productos en cada posición | |
| Mapa de características | la lista de resultados de la convolución | |
| Pooling | quedarse con el mayor valor de cada trozo (agrupación máxima) | |
| Cuadrícula | números en filas y columnas, como los píxeles de una imagen |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un filtro se desliza y suma productos
Imagina el brillo de cada punto de una fila de una imagen: 0 es oscuro y 3 es claro. Un filtro con los pesos -1 y 1 compara cada punto con el siguiente.
En cada posición multiplica los dos números por los pesos y suma. Si el brillo sube, da un número positivo. Si baja, uno negativo. Si no cambia, 0.
Ejemplo resuelto: un filtro sobre una fila
| Posición | Números que mira | Cálculo | Resultado |
|---|---|---|---|
| 1 | 0 y 0 | 0 × -1 + 0 × 1 | 0 |
| 2 | 0 y 3 | 0 × -1 + 3 × 1 | 3 |
| 3 | 3 y 3 | 3 × -1 + 3 × 1 | 0 |
| 4 | 3 y 3 | 3 × -1 + 3 × 1 | 0 |
| 5 | 3 y 0 | 3 × -1 + 0 × 1 | -3 |
| 6 | 0 y 0 | 0 × -1 + 0 × 1 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La convolución en Python
# Un filtro de dos números que se desliza por una fila de brillos.
fila = [0, 0, 3, 3, 3, 0, 0]
filtro = [-1, 1]
mapa = []
for inicio in range(len(fila) - len(filtro) + 1):
total = 0
for n in range(len(filtro)):
total = total + fila[inicio + n] * filtro[n]
mapa.append(total)
print("mapa de características:", mapa)
# Cambia el filtro a [1, -1] y ejecuta otra vez. ¿Qué cambia en el mapa?
Una posición del filtro en el laboratorio
docker exec jupyter python3 -c "print(0 * -1 + 3 * 1)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El mismo filtro sirve en toda la imagen
Un filtro de 3 × 3 tiene solo 9 pesos y se usa en todas las posiciones de la imagen. Detecta el mismo patrón donde esté.
Una neurona conectada a cada punto de una imagen de 28 × 28 necesitaría 784 pesos. Con diez neuronas, 7.840. Por eso las redes con convoluciones aprenden con menos pesos y menos datos.
Ejemplo resuelto: un filtro sobre una cuadrícula
| Zona 2 × 2 de la imagen | Cálculo con el filtro [-1, 1] en cada fila | Resultado |
|---|---|---|
| Filas [0, 3] y [0, 3] | (0 × -1 + 3 × 1) + (0 × -1 + 3 × 1) | 6 |
| Filas [3, 3] y [3, 3] | (3 × -1 + 3 × 1) + (3 × -1 + 3 × 1) | 0 |
| Filas [0, 3] y [0, 3], más abajo | (0 × -1 + 3 × 1) + (0 × -1 + 3 × 1) | 6 |
| Filas [3, 3] y [3, 3], más abajo | (3 × -1 + 3 × 1) + (3 × -1 + 3 × 1) | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pesos de diez neuronas frente a un filtro
docker exec jupyter python3 -c "print(28 * 28 * 10, 3 * 3)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El pooling guarda lo más fuerte
El pooling reduce el mapa de características. Se divide en trozos del mismo tamaño y se queda con el mayor valor de cada uno.
El mapa se hace más pequeño y la red se fija menos en la posición exacta del patrón. Si sobran números al final, no se usan.
Ejemplo resuelto: pooling de tamaño 2
| Trozo | Números | El mayor |
|---|---|---|
| 1 | 0 y 3 | 3 |
| 2 | 0 y 0 | 0 |
| 3 | -3 y 0 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error muy común
Advertencia
Mucha gente cree que una persona escribe los números del filtro para buscar un borde. En una red, el filtro lo aprende la propia red. Sus números son pesos y se corrigen con el descenso del gradiente, igual que los de la lección anterior.
El mayor del primer trozo
docker exec jupyter python3 -c "print(max([0, 3, 0, 0, -3, 0][0:2]))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: otros filtros
En el código de arriba, cambia el filtro a [1, -1]. Compara el nuevo mapa con el anterior.
Después prueba el filtro [1, 1, 1] sobre la misma fila. ¿Qué mide ahora, y por qué el mapa tiene un número menos de largo que antes?