¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo encuentra patrones una convolución

Después de esta lección: Puedo explicar cómo una convolución encuentra patrones en una cuadrícula.

Lección de 60 min3 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

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

PalabraQué significaEjemplo
Filtrouna lista pequeña de pesos que busca un patrón (kernel en inglés)[-1, 1]
Convolucióndeslizar un filtro y sumar productos en cada posición
Mapa de característicasla lista de resultados de la convolución
Poolingquedarse con el mayor valor de cada trozo (agrupación máxima)
Cuadrículanú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ónNúmeros que miraCálculoResultado
10 y 00 × -1 + 0 × 10
20 y 30 × -1 + 3 × 13
33 y 33 × -1 + 3 × 10
43 y 33 × -1 + 3 × 10
53 y 03 × -1 + 0 × 1-3
60 y 00 × -1 + 0 × 10

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La convolución en Python

Código: 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

Comando
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 imagenCálculo con el filtro [-1, 1] en cada filaResultado
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

Comando
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

TrozoNúmerosEl mayor
10 y 33
20 y 00
3-3 y 00

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

Comando
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?

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.