Aprendizaje de redes neuronales convolucionales: parte 1: reconocer y construir una red neuronal convolucional de dos capas


1. Prefacio

   Este artículo está basado en Beijing PostFundamentos de la ciencia de datosLas asignaciones de mitad de período y el conocimiento del material didáctico relacionado del curso se basan en el entorno de Pytorch para implementar una red neuronal convolucional de dos capas, y derivar y calcular cada parámetro. El objetivo de este artículo:

  1. Consolidar el conocimiento y dominar el conocimiento básico relevante del aprendizaje automático, que incluye principalmente la capa convolucional y la capa de activación en el material educativo;
  2. Fortalecer el proceso , dominar el proceso de aprendizaje automático convencional y modificar algunos parámetros en el modelo para comprender el significado de los parámetros;
  3. Se transmite de generación en generación, para ayudar a los estudiantes posteriores a comprender mejor el conocimiento del curso y comenzar (pero parte del código estará oculto y no se le dará la oportunidad de copiar el código)

   La realización del modelo completo incluye tres partes: construcción de la red, modelo de formación y evaluación del modelo, que corresponden al conocimiento correspondiente de la estructura de la red, estrategia de aprendizaje e índice de evaluación respectivamente. Esta parte partirá principalmente de la investigación y realización de la red y elaborará el significado de los parámetros y la configuración de funciones.
   Dado que el autor está realmente demasiado ocupado y demasiado ocupado, solo puedo actualizar lo que pienso primero ~ La actualización lenta también es un proceso de aprendizaje lento (en caso de que realmente vaya a un laboratorio de ciencia de datos en el futuro)


---- 19 de noviembre de 2020, Universidad de Correos y Telecomunicaciones de Beijing No. 333



Dos, realización de la red

1. Construcción del modelo

   Ahora primero construya el modelo de red neuronal convolucional de dos capas que necesitamos. Entonces, antes de construir, debemos pensar en cuántas funciones de la red neuronal convolucional. Aquí tomamos el modelo dado en el material didáctico como ejemplo y prestamos atención al significado de las funciones y parámetros correspondientes.

class ConvNet(nn.Module):
    # 课件上的代码
    def __init__(self):
        super().__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, 5)
        self.conv2 = torch.nn.Conv2d(10, 20, 3)
        self.fc1 = torch.nn.Linear(20*10*10, 500)
        self.fc2 = torch.nn.Linear(500, 10)
    def forward(self, x):
        in_size = x.size(0)
        # 卷积层 -> Relu -> 最大池化
        out = self.conv1(x)
        out = F.relu(out)
        out = F.max_pool2d(out, 2, 2)
        # 卷积层 -> Relu
        out = self.conv2(out)
        out = F.relu(out)
        # 多行变一行 -> 全连接层 -> relu -> 全连接层 -> sigmoid
        out = out.view(in_size, -1)
        # 全连接层 -> Relu
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out, dim = 1)
        return out

2. El significado y la naturaleza de las clases y funciones

(1) nn.Conv2d

   Los parámetros completos de la clase Conv2d son los siguientes:

nn.Conv2d (in_channels, out_channels, kernel_size, stride = 1, padding = 0, dilation = 1, groups = 1, bias = True)


   En correspondencia con muchos parámetros, en este artículo nos centramos en los tres primeros parámetros, estos son los principales factores que nos limitan. Nos centraremos en la importancia de la modificación de parámetros en la siguiente función. Mirando el código aquí solo, varios parámetros pertenecen a la parte que se personaliza de acuerdo con los requisitos.


in_channels El número de canales de entrada, que es la profundidad de la capa actual.
out_channels El número de canales de salida, que es la profundidad de la salida.
kernel_size Tamaño del kernel de convolución


   Conv2d es una clase generada para redes neuronales convolucionales 2D. Su función es generar una red neuronal convolucional correspondiente a un canal de entrada y un canal de salida, y volver a generar la imagen a través del kernel de convolución (el paso predeterminado es 1). El mecanismo de acción es el siguiente:


Kernel de convolución


   En la figura, podemos encontrar que cada vez que se convoluciona la imagen, su salida cambia en consecuencia. Como se muestra en la figura, su entrada es 5x5, y bajo la acción de un kernel de convolución de 3x3 y un tamaño de paso de 1, el tamaño de la característica de imagen de salida final ya no es 5, sino 5-3 + 1 = 3. Entonces, después de la capa convolucional, de hecho, su tamaño de salida cambiará en consecuencia.


(2) F.max_pool2d

   Los parámetros completos de la clase F.max_pool2d son los siguientes:

F.max_pool2d_with_indices (entrada, kernel_size, stride)


entrada entrar
kernel_size Tamaño máximo de ventana agrupada
paso Paso

   F.max_pool2d es una clase para agrupar y filtrar la matriz de características. Además, la clase MaxPool2d en nn también puede lograr el mismo efecto. Un ejemplo del principio de agrupación máxima es el siguiente:


Agrupación máxima


   podemos ver que después de la agrupación máxima, será el mismo que después de la convolución, lo que hace que cambie el tamaño de la matriz de características. Lo que debe recordarse aquí es que el tamaño del cambio está relacionado con el tamaño de la ventana.


(3) F.relu

   F.relu es una función de activación no lineal y aquí se selecciona relu como función de activación no lineal. Tiene muchas ventajas y desventajas, pero se usa ampliamente. Puedes consultar este artículo para conocer más sobre sus características: El rol de relu es
   más común. Las preguntas también incluyen: ¿Por qué relu es después de conv1? Esto está determinado principalmente por la estructura general del cuerpo celular.Para una red neuronal completa, las funciones de convolución y activación juntas forman esta capa de neuronas. Y puede aumentar considerablemente la capacidad de procesamiento de generalizaciones.

La estructura básica de las neuronas.

(4) F.log_softmax

   F.log_softmax generalmente se aplica a la capa de salida de la red para hacer un procesamiento de regresión, y su esencia también es una función de activación especial.
   Aquí debemos entender por qué es regresión y aplicación. En primer lugar, cuando estamos haciendo el problema de clasificación, su esencia es un problema de probabilidad: de qué categoría tiene una alta probabilidad. Pero la entrada y salida de nuestra red neuronal convolucional son solo uno o más valores específicos, no una probabilidad. Por lo tanto, se necesita una función de activación para asignar este valor a una cierta probabilidad p.
   Cuando se utiliza nuestra red neuronal convolucional para resolver el problema de clasificación, primero obtiene la característica X a través de la capa convolucional, luego obtiene WX + b a través del clasificador, y luego obtiene la probabilidad p a través de la función Sigmoid, logSoftmax o Softmax, y finalmente obtiene la categoría según la probabilidad máxima p . Entonces aquí, no es solo esta función. También se puede cambiar a otras funciones, pero en general, la capa de salida de la red neuronal convolucional necesita una función no lineal para conectar el valor con la distribución de probabilidad, a fin de completar el problema de clasificación.
   Si todavía no entiendo muy bien algunos, a continuación, se puede hacer referencia al enlace: capa de salida red neuronal utilizada softmax ¿Por qué? , ¿Por qué utiliza la arquitectura de red neuronal una búsqueda dardos Softmax implementado por discreta a la conversión continua? Y multi-clase clasificación softmax Por qué no los otros métodos de normalización? Una mirada más cercana. Si el optimizador que elige es un optimizador de entropía cruzada, puede ver la explicación detallada de la pérdida de softmax, la relación entre softmax y la entropía cruzada, y comprender mejor la relación entre ellos y las precauciones al usarlos.

(5) nn Lineal

   Los parámetros completos de la clase Linear son los siguientes:

nn.Linear (in_features, out_features, bias = True)


in_features Tamaño de entrada
out_features Tamaño de salida

   torch.nn.Linear es la clase más problemática, y sus parámetros son también las áreas principales que este artículo quiere estudiar con claridad. Se utiliza para configurar una capa completamente conectada. Pero la entrada y la salida de la capa completamente conectada son tensores bidimensionales y la forma general es [tamaño_lote, tamaño], que es diferente de la capa convolucional que requiere que la entrada y la salida sean tensores de cuatro dimensiones. Para lograr este equilibrio, la función de visualización se utilizará para reducir los datos originales a un vector de columna de un bit. De lo contrario, no se puede utilizar normalmente aquí.
   Dado que ahora es un vector de columna unidimensional, la entrada debe ser del tamaño de una de las muestras. Ya aquí para que todos comprendan mejor el tamaño de este asunto, necesitamos volver a conocer la red neuronal convolucional.
   En primer lugar, la red neuronal convolucional aquí no es una red bidimensional, es una red tridimensional, que contiene los datos bidimensionales originales y el número de canales de entrada en cada capa (es decir, la profundidad). Entonces, tendemos a adoptar la profundidad x altura x ancho en el formulario para indicar el tamaño de la entrada. Luego miramos el código nuevamente, encontraremos que el parámetro en este es 20x10x10 . 20 es fácil de entender, 20 es el número de canales de salida de Conv2, que es la profundidad en este momento. Pero, ¿por qué se expresa 10x10 en este momento de la altura x ancho de la misma? Según nuestro conocimiento, el tamaño de la imagen de entrada debería ser 28x28 en este momento , no 10x10 .
   Para comprender el origen de 10, primero debemos revisar el contenido relevante del núcleo de convolución en el conocimiento básico.

Kernel de convolución

   Para entender a partir de esta imagen, encontraremos que cada vez que la imagen se procesa una vez, su tamaño cambiará en consecuencia. Este cambio solo está relacionado con el tamaño del kernel de convolución, el tamaño del paso y el tamaño de la imagen en sí. A partir de esta imagen, podemos encontrar que su escala cumple la ley de la imagen L-L núcleo +1 .
   En otras palabras, cuando se ingresa a Linear, el tamaño de la imagen ya no es 28x28. En este punto, desde el punto de vista de la estructura de la red, ha pasado por dos convoluciones y una agrupación. El efecto de la puesta en común se puede ver de la misma manera. Entonces, 10 es en realidad el resultado del cálculo. El método de cálculo es:

  1. La primera convolución (el núcleo de convolución es 5): 28-5 + 1 = 24
  2. La primera agrupación (el filtro de agrupación es 2): 24/2 = 12
  3. La segunda convolución (el núcleo de convolución es 3): 12-3 + 1 = 10

   Aquí casi para romper el caso, por lo que podemos resumirlo por primera vez cuando Linear, sus parámetros de entrada para la profundidad x altura x ancho . La profundidad es el número de canales emitidos por la última capa convolucional, y la altura y la profundidad se calculan de acuerdo con el número de convoluciones y agrupaciones experimentadas en el proceso.


3. Resumen del modelo

   Ahora, para resumir las funciones y los pasos que mencionamos antes, podemos usar la función nn.Sequential para reconstruir cada capa y hacer que el resultado sea más intuitivo:

class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(1, 10, 5),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
            )
        self.conv2 = nn.Sequential(
            nn.Conv2d(10, 20, 3),
            nn.ReLU()
            )    
        self.fc = nn.Sequential(
            nn.Linear(20 * 10 * 10, 500),
            nn.ReLU(inplace=True),
            nn.Linear(500, 10)      
            )

    def forward(self, x):
        in_size = x.size(0)
        out = self.conv1(x)
        out = self.conv2(out)
        out = out.view(in_size, -1)
        out = self.fc(out)
        out = F.log_softmax(out, dim = 1)
        return out

   Desde la perspectiva de una estructura de red tan nueva, de hecho, la construcción de una red neuronal convolucional solo necesita cumplir: determinar el número de capas, definir la entrada y salida entre cada capa, capa y capa de acuerdo con la convolución, activación y si se requiere agrupación. Al hacer coincidir estos puntos, se puede construir una red neuronal convolucional.


Tres, resumen

   He estado escribiendo aquí durante tres o cuatro horas, porque también es un proceso de profundizar gradualmente la comprensión del aprendizaje automático, por lo que algunos lugares pueden no ser lo suficientemente rigurosos. También espero que si hay algo que no hice bien, pueda dejar un mensaje y estudiarlo juntos y hacer cambios juntos. Espero terminar todo antes de que termine el examen ~

Supongo que te gusta

Origin blog.csdn.net/L2000Ryan/article/details/109818999
Recomendado
Clasificación