PyTorch – red neuronal convolucional

El Deep Learning es una rama del aprendizaje automático que se considera un paso importante dado por los investigadores en las últimas décadas. Los ejemplos de implementaciones de Deep Learning incluyen aplicaciones como el reconocimiento de imágenes y el reconocimiento de voz.

Los siguientes son dos tipos importantes de redes neuronales profundas:

  • Redes neuronales convolucionales
  • Redes neuronales recurrentes.

En este capítulo, nos centraremos en el primer tipo, es decir, redes neuronales convolucionales (CNN).

Redes neuronales convolucionales

Las redes neuronales convolucionales están diseñadas para procesar datos en varias capas de matrices. Este tipo de red neuronal se utiliza en aplicaciones como el reconocimiento de imágenes o el reconocimiento facial.

La principal diferencia entre CNN y cualquier otra red neuronal convencional es que CNN toma la entrada como una matriz bidimensional y trabaja directamente con imágenes, en lugar de centrarse en la extracción de características, en la que se centran otras redes neuronales.

El enfoque dominante de CNN implica resolver problemas de reconocimiento. Empresas líderes como Google y Facebook han invertido en I + D relacionados con proyectos de reconocimiento para hacer el trabajo más rápido.

Cada red neuronal convolucional incluye tres ideas principales:

  • Campos relevantes locales
  • Circunvolución
  • Unión

Echemos un vistazo a cada una de estas terminologías en detalle.

Campos relevantes locales

CNN usa correlaciones espaciales que existen en los datos de entrada. Cada una de las capas paralelas de redes neuronales conecta varias neuronas de entrada. Esta región en particular se llama campo receptivo local. Solo se enfoca en neuronas ocultas. La neurona oculta procesará la entrada dentro del campo especificado sin darse cuenta de cambios más allá de un cierto límite.

La vista de diagrama de la generación de campos coincidentes locales se menciona a continuación:

Campos relevantes locales

Circunvolución

En la figura anterior, podemos ver que cada conexión aprende el peso de la neurona oculta con la conexión correspondiente moviéndose de una capa a otra. Aquí, las neuronas individuales cambian de vez en cuando. Este proceso se llama «plegado».

El mapeo de conexión de la capa de entrada al mapa de características ocultas se denomina «pesos totales» y el desplazamiento incluido se denomina «desplazamiento global».

Unión

Las redes neuronales convolucionales utilizan capas de agrupación que se encuentran inmediatamente después del anuncio de CNN. Acepta la entrada del usuario en forma de mapa de características, que genera redes convolucionales y prepara un mapa de características comprimido. La combinación de capas ayuda a crear capas con neuronas de capas anteriores.

Implementación de PyTorch

Los siguientes pasos se utilizan para crear una red neuronal convolucional utilizando PyTorch.

Paso 1

Importe los paquetes necesarios para crear una red neuronal simple.

from torch.autograd import Variable
import torch.nn.functional as F

Paso 2

Cree una clase con una representación por lotes de una red neuronal convolucional. Nuestro formulario de lote para la entrada x tiene el tamaño (3, 32, 32).

class SimpleCNN(torch.nn.Module):
   def __init__(self):
      super(SimpleCNN, self).__init__()
      #Input channels = 3, output channels = 18
      self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
      self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
      #4608 input features, 64 output features (see sizing flow below)
      self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
      #64 input features, 10 output features for our 10 defined classes
      self.fc2 = torch.nn.Linear(64, 10)

Paso 3

Calcule la activación de cambiar el primer tamaño de convolución de (3, 32, 32) a (18, 32, 32).

La dimensión cambia de (18, 32, 32) a (18, 16, 16). Cambie el tamaño de los datos de la capa de entrada de la red neuronal, que cambiará el tamaño de (18, 16, 16) a (1, 4608).

Recuerde que -1 saca esta dimensión de otra dimensión especificada.

def forward(self, x):
   x = F.relu(self.conv1(x))
   x = self.pool(x)
   x = x.view(-1, 18 * 16 *16)
   x = F.relu(self.fc1(x))
   #Computes the second fully connected layer (activation applied later)
   #Size changes from (1, 64) to (1, 10)
   x = self.fc2(x)
   return(x)

🚫