Convolución horizontal y vertical de strides

| Última modificación: 3 de julio de 2024 | Tiempo de Lectura: 2 minutos

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)

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)
kernel = 1/9 * np.ones((3,3))
grad_v = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')
plot_two(ascent, grad_v)

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

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)

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)

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!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

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