PyTorch - Red neuronal convolucional

El aprendizaje profundo es una división del aprendizaje automático y se considera un paso crucial dado por los investigadores en las últimas décadas. Los ejemplos de implementación de aprendizaje profundo incluyen aplicaciones como reconocimiento de imágenes y reconocimiento de voz.

Los dos tipos importantes de redes neuronales profundas se dan a continuación:

  • 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 a través de múltiples capas de arreglos. Este tipo de redes neuronales se utilizan en aplicaciones como el reconocimiento de imágenes o el reconocimiento facial.

La principal diferencia entre CNN y cualquier otra red neuronal ordinaria es que CNN toma la entrada como una matriz bidimensional y opera directamente en las imágenes en lugar de enfocarse en la extracción de características en las que se enfocan otras redes neuronales.

El enfoque dominante de CNN incluye soluciones para problemas de reconocimiento. Las principales empresas como Google y Facebook han invertido en proyectos de investigación y desarrollo de proyectos de reconocimiento para realizar actividades con mayor rapidez.

Cada red neuronal convolucional incluye tres ideas básicas:

  • Campos respectivos locales
  • Convolution
  • Pooling

Entendamos cada una de estas terminologías en detalle.

Campos respectivos locales

CNN utiliza correlaciones espaciales que existen dentro de los datos de entrada. Cada una de las capas concurrentes de redes neuronales conecta algunas neuronas de entrada. Esta región específica se llama campo receptivo local. Solo se enfoca en neuronas ocultas. La neurona oculta procesará los datos de entrada dentro del campo mencionado sin darse cuenta de los cambios fuera del límite específico.

La representación del diagrama de la generación de campos respectivos locales se menciona a continuación:

Circunvolución

En la figura anterior, observamos que cada conexión aprende un peso de neurona oculta con una conexión asociada con el movimiento de una capa a otra. Aquí, las neuronas individuales realizan un cambio de vez en cuando. Este proceso se llama "convolución".

El mapeo de conexiones desde la capa de entrada al mapa de características ocultas se define como "pesos compartidos" y el sesgo incluido se denomina "sesgo compartido".

Agrupación

Las redes neuronales convolucionales utilizan capas de agrupación que se colocan inmediatamente después de la declaración de CNN. Toma la entrada del usuario como un mapa de características que genera redes convolucionales y prepara un mapa de características condensado. La agrupació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 representación por lotes de una red neuronal convolucional. Nuestra forma de lote para la entrada x tiene una dimensión de (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 los primeros cambios de tamaño de convolución de (3, 32, 32) a (18, 32, 32).

El tamaño de la dimensión cambia de (18, 32, 32) a (18, 16, 16). Reformar la dimensión de datos de la capa de entrada de la red neuronal debido a que el tamaño cambia de (18, 16, 16) a (1, 4608).

Recuerde que -1 infiere esta dimensión de la otra dimensión dada.

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)