Convolución horizontal y vertical de strides

Autor: | Última modificación: 18 de abril de 2024 | Tiempo de Lectura: 2 minutos
Temas en este post:

Algunos de nuestros reconocimientos:

Premios KeepCoding

La convolución horizontal y vertical de strides se encuentra dentro de la serie de procesos que se llevan a cabo para las redes neuronales convolucionales en cada una de las capas de su arquitectura.

Por ello, en el desarrollo de este post, te mostramos cómo se comporta la convolución horizontal y vertical de strides.

Convolución horizontal y vertical de strides

Hay que partir de que los detectores de patrones en las redes convolucionales no están detectando nada, simplemente están multiplicando y sumando cosas.

Vamos a ver unos ejemplos para comprobar qué es lo que pasa cuando hacemos estas multiplicaciones y sumas para la convolución horizontal y vertical de strides:

# Hacemos los imports necesarios
import numpy as np
from scipy import signal
from scipy import misc
ascent = misc.ascent()
kernel = np.array([[-1, 0, +1],
                   [-1, 0, +1],
                   [-1, 0, +1]])
grad = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')
import matplotlib.pyplot as plt

# función para mostrar dos imágenes juntas
def plot_two(img_orig, img_conv):
  fig, (ax_orig, ax_mag) = plt.subplots(1, 2, figsize=(20, 50))
  ax_orig.imshow(img_orig, cmap='gray')
  ax_orig.set_title('Original')
  ax_orig.set_axis_off()
  ax_mag.imshow((img_conv), cmap='gray')
  ax_mag.set_title('Gradiente')
  ax_mag.set_axis_off()
plot_two(ascent, grad)
Convolución horizontal y vertical de strides

Parece que estamos detectando algunos bordes que son, en definitiva, líneas.

Por tanto, parece que tenemos un detector de líneas verticales.

¿Cómo podríamos conseguir uno de líneas horizontales?

kernel = np.array([[-1, -1, -1],
                   [ 0,  0,  0],
                   [+1, +1, +1]])
grad_v = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')
plot_two(ascent, grad_v)
Convolución horizontal y vertical de strides
kernel = 1/9 * np.ones((3,3))
grad_v = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')
plot_two(ascent, grad_v)
Convolución horizontal y vertical de strides

Estos son algunos de los kernels más utilizados en redes convolucionales tradicionales:

Convolución horizontal y vertical de strides

Vamos a ver los ejemplos nosotros mismos:

# Cargamos y mostramos la imagen original
url_img = 'https://upload.wikimedia.org/wikipedia/commons/5/50/Vd-Orig.png'
from urllib.request import urlopen 
from io import BytesIO
from PIL import Image
file = BytesIO(urlopen(url_img).read()) 
img = np.asarray(Image.open(file), dtype='uint8')
plt.imshow(img)
plt.axis('off')

(-0.5, 99.5, 99.5, -0.5)

Convolución horizontal y vertical de strides
def convolve3d(img, kernel):
  img_out = np.zeros(img.shape)
  for i in range(img.shape[-1]):
     img_out[:,:,i] = signal.convolve2d(img[:,:,i], kernel, boundary='symm', mode='same')
  return img_out.astype('uint8')
# Probamos con el kernel identidad
kernel = [[0, 0, 0],
         [0, 1, 0],
         [0, 0, 0]]
img_ki = convolve3d(img, kernel)
plot_two(img, img_ki)
Convolución horizontal y vertical de strides

Ahora que conoces cómo funciona la convolución horizontal y vertical de strides, te aconsejamos continuar aprendiendo al respecto y ajustar este conocimiento a tu desenvolvimiento laboral.

De hecho, desde KeepCoding te ofrecemos nuestro Bootcamp en Machine Learning. Gracias a este, podrás aprender todo lo relacionado con las herramientas y lenguajes actuales y más populares del mundo del manejo de los macrodatos. ¡Inscríbete ahora mismo!

Posts Relacionados

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado