top of page
Buscar
  • danielreyes107

Convolución y Submuestreo

Actualizado: 31 oct 2021

Convolución

Se trata de una operación matemática que es aplicada por las redes convolucionales.

Este layer contiene un kernel, que es una matriz de pesos que se encarga de recopilar los grupos de pixeles y aplicarles el producto escalar, esta matriz tendrá un tamaño determinado por el parámetro kernel_size, que es una tupla de dos números enteros (alto y ancho de la matriz), esta matriz se ira desplazando a lo largo y ancho de la imagen, este desplazamiento también es determinado por otro campo de esta capa llamado strides, que al igual que el kernel_size se trata de una tupla de dos números enteros que determinan cuanto se tienen que desplazar en cada uno de los ejes, su valor por defecto es 1x1 (un pixel en el eje “X” o ancho, y un pixel en el eje “Y” o alto).

Para ponernos en contexto, si tuviéramos el ejemplo anterior de una imagen de 100x100 y monocromática, un kernel_size de 3x3 y un stride de 2x2, valores que son estándares, tendríamos una ventana de tres de alto por tres de ancho que primero se desplazaría de izquierda a derecha moviéndose de dos en dos píxeles tomando agrupaciones de nueve pixeles y cuando llegara al final del todo se volvería al comienzo, pero dos píxeles por debajo y repetiría esta secuencia de pasos hasta que finalizara su recorrido. Esta tarea provoca que la imagen se reduzca y se obtenga las características o los patrones más importantes, poco a poco los pesos se ajustarían por el proceso de BackPropagation:.


En el caso de que las imágenes no fueran monocromáticas y fueran RGB, se les añadiría

a los anteriores parámetros un tercer campo, no obstante, este es agregado automáticamente, por lo que a la hora de programarlo se hará de igual manera.

La capa Conv2D, cuenta también con una función de activación de la que hablaremos más adelante, y un campo llamado filters, que es un entero que determina el tamaño de la salida, o cuanto deberá medir la imagen de salida para determinar el número de neuronas que tendrá de entrada la siguiente capa. Si pusiéramos el caso de que filters es igual a 64 estaríamos creando un output de 64x64xC.


Ilustración 31: Proceso de la convolución (ref.)


Ejemplo de código en el que añadimos una capa convolucional, con 128 filtros de salida (salida de 128x128xC), matriz de pesos de 2x2 (kernel_size) que avanza de 1x1 pixeles (valor por defecto del stride), padding same (se crea un marco sobre la imagen) y activación ReLu.

 

model.add(Conv2D(filters = 128, kernel_size = (2,2), padding = 'Same', activation ='relu'))

 


Submuestreo (Pooling)

Esta operación se utiliza para reducir el tamaño de una imagen tomando los pixeles más representativos de esta, de manera que, para las siguientes capas sea más sencillo de computar. Para realizar esta reducción se realiza una tarea similar a la explicada anteriormente, y es que a través de una “ventana” o matriz de un tamaño especificado por el parámetro pool_size, que es una tupla de dos enteros, que ira desplazándose a partir de los valores introducidos en el campo stride e ira tomando de las distintas agrupaciones de pixeles los valores más importantes dependiendo de la función empleada.

En este caso hemos usado el MaxPooling2D:, que es el más empleado para este tipo de tareas, al ser “max” escogerá de entre los valores del pool o de la ventana que agrupa los pixeles, el píxel de mayor valor.

Para poner en contexto lo explicado en el párrafo anterior haremos uso de la siguiente figura.


Ilustración 32: Ejemplo de MaxPooling2D

Tenemos una imagen que estará representada por esa matriz de 4x4, una ventana de 2x2 que se desplaza también 2x2 (representada por un cuadrado rojo, estos valores establecidos por los campos pool_size y stride), y la imagen reducida será las matrices de 2x2 que se encuentran debajo de las “imágenes”, como podemos apreciar esta ventana primero cogería el 8 al ser el valor más grande que se encuentra en la agrupación (circulo verde), y la guardaría en la imagen de salida en su posición correspondiente (cuadrado azul), tras esto se desplazaría a la derecha y repetiría esta tarea sustrayendo el 6 que es el número de mayor valor, al haber llegado al final del desplazamiento lateral en esa fila bajaría dos pixeles, y volvería a repetir esta secuencia hasta finalizar su recorrido.


Por último, hay que añadir que el MaxPooling no es la única función de submuestreo que existe, también tenemos AveragePooling, GlobalMaxPooling y GlobalAveragePooling, en la siguiente figura encontraremos la función AveragePooling2D, donde en vez de buscar el valor máximo de una agrupación se toma la medía de todos los pixeles de la agrupación.


Ilustración 33: Ejemplo de AveragePooling2D


Ejemplo de código para añadir a una red neuronal una capa de MaxPooling2D con matriz de dos de alto y dos de ancho y que se desplaza uno de alto y uno de ancho (valor por defecto del campo stride).

 

model.add(MaxPooling2D(pool_size = (2,2)))

 


Terminos:

BackPropagation

Tras una serie de entrenamientos los pesos de la matriz se irían adaptando a las características de las imágenes entrantes, a este proceso se le conoce como BackPropagation.

10 visualizaciones0 comentarios

Entradas Recientes

Ver todo

Comments


bottom of page