Primeros pasos con pyTorch (2): funciones comunes de capa de red y entrenamiento de redes neuronales convolucionales

aprender mejor de los demás,

ser el mejor

—— "WeikaZhixiang"

a7fd2b6bd110dd976a563812a301ac2e.jpeg

La extensión de este artículo es de 17309 palabras y se espera que se lea durante 5 minutos.

prefacio

El artículo anterior " Introducción a pyTorch (1) - Capacitación de reconocimiento de datos escritos a mano de Minist Red totalmente conectada " creó una capa completamente conectada y archivos de capacitación, e hizo la capacitación de Minist más simple, y el resultado de capacitación final alcanzó el 97%. Api más comúnmente utilizadas y capas convolucionales de la capa de red pyTorch

b7925ddc6f1aaceeb8cbc701edc55bc1.png

# Funciones comunes de la capa de red
nn.Lineal combinación lineal de señales
nn.Conv2d Convolución 2D de múltiples señales 2D
nn.MaxPool2d Agrupación máxima para señales 2D
nn.ReLU La función de activación más utilizada
nn.CrossEntropyLoss Función de pérdida, nn.LogSoftmax() combinada con nn.NLLLoss() para cálculo de entropía cruzada
optim.SGD optimizador, descenso de gradiente estocástico
optim.zero_grad Borrar el gradiente de parámetros administrados (el gradiente de tensor no se borra automáticamente, sino que se acumula)
paso.optimo Actualizar el parámetro de peso una vez
nn.Secuencial Se utiliza para envolver una capa de red en orden

Las anteriores son las funciones más utilizadas, y nuestro entrenamiento Minist es suficiente para completar el entrenamiento con estas, y nos centraremos en las siguientes funciones que requieren parámetros de entrada:

nn. Combinación lineal lineal (parámetro) de señales

  • in_features: el número de nodos de entrada

  • out_features: el número de nodos de salida

  • sesgo: si se requiere sesgo

nn.Conv2d(parámetro) realiza una convolución bidimensional en múltiples señales bidimensionales

  • in_channels: número de canales de entrada

  • out_channels: el número de canales de salida, equivalente al número de núcleos de convolución

  • kernel_size: tamaño del kernel de convolución

  • zancada: tamaño del paso

  • relleno: el número de relleno

  • dilatación: tamaño de la convolución del agujero

  • grupos: configuración de convolución de grupo

  • sesgo: sesgo

nn.MaxPool2d(parámetro) Agrupación máxima para señales bidimensionales

  • kernel_size: tamaño del kernel de agrupación

  • zancada: tamaño del paso

  • relleno: el número de relleno

  • dilatación: tamaño de intervalo de kernel de agrupación

  • ceil_mode: el tamaño se redondea hacia arriba

  • return_indices: registrar índices de píxeles agrupados

Optimizador optim.SGD (parámetros), método de descenso de gradiente estocástico

  • params: grupo de parámetros a gestionar

  • lr: tasa de aprendizaje inicial

  • monentum: Coeficiente de momento, β

  • weight_decay: coeficiente de regularización L2

  • nesterov: Ya sea para usar NAG

nn.Sequential(parámetros) envuelve un conjunto de capas de red secuencialmente

  • Secuencia: las capas de la red se construyen en estricto orden

  • Reenvío incorporado (): en el reenvío incorporado, la operación de propagación hacia adelante se realiza secuencialmente a través del bucle for

2437680ef22d4d7537b59a4341b833f2.png

Micro tarjeta Zhixiang

Red de capa convolucional

dcaa1822c6fe5840b509139b717f72df.png

En la imagen de arriba, cambiamos el ministmodel.py en el artículo anterior a train.py, porque todo es un archivo de entrenamiento, por lo que la identificación es más clara, y luego creamos un nuevo archivo ModelConv2d.py.

9fa417e0f27c6b6f28b299792c45c48d.png

Establezca la estructura de red de Conv2dNet. Como se puede ver en la figura anterior, hemos creado tres capas. El orden de cada capa se procesa primero con un kernel de convolución 3X3, luego se agrupa y luego se activa. Después de tres capas de procesamiento, el full La conexión se reduce de la entrada de 180 a los 10 finales. Aquí, la capa completamente conectada se usa 5 veces, lo que puede reducir la cantidad de veces aquí.

ModelConv2dNet.py

import torch
import torch.nn as nn
import torch.nn.functional as F


class Conv2dNet(nn.Module):
    def __init__(self):
        super(Conv2dNet, self).__init__()
        ##源图像为1 * 28 * 28
        ##从一层channel转为输出5层, 卷积和是3,所以输出的宽和高就是28-3+1 = 26
        ##输出的图像就是 5 * 26 * 26, 然后做pooling下采样2, 变为 5 * 13 * 13
        self.conv1 = nn.Sequential(
            nn.Conv2d(1, 5, kernel_size=3),
            nn.MaxPool2d(2),
            nn.ReLU()
        )


        ##从上层channel的5转为输出10层, 卷积和是3,所以输出的宽和高就是13-3+1 = 11
        ##输出的图像就是 10 * 11 * 11, 然后做pooling下采样2, 变为 10 * 5 * 5
        self.conv2 = nn.Sequential(
            nn.Conv2d(5, 10, kernel_size=3),
            nn.MaxPool2d(2),
            nn.ReLU()
        )


        ##从上层channel的10转为输出20层, 卷积和是3,所以输出的宽和高就是5-3+1 = 3
        ##本层不再做池化了,所以输出的图像就是 20 * 3 * 3,
        self.conv3 = nn.Sequential(
            nn.Conv2d(10, 20, kernel_size=3),
            nn.ReLU()
        )


        ##经过上面的图像20 * 3 * 3 = 180,进行全连接,我们多做几层将输出层降到10
        self.fc = nn.Sequential(
            nn.Linear(180, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, 32),
            nn.ReLU(),
            nn.Linear(32, 16),
            nn.ReLU(),
            nn.Linear(16, 10)
        )     


        ##定义损失函数
        self.criterion = torch.nn.CrossEntropyLoss()


    
    def forward(self, x):
        in_size = x.size(0)


        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)


        x = x.view(in_size, -1)
        x = self.fc(x)


        return x

Micro tarjeta Zhixiang

Modificación de archivos de entrenamiento

f15c739582e5eaccf1003ba649931a7a.png

En el archivo train.py, importe el ModelConv2d recién creado y luego cambie la variable train_name a Conv2dNet

adca1edf14c7ff56ff6ed4fbaafb3cd4.png

Luego agregue un juicio a la función de cambio. Si es Conv2dNet, regrese directamente a Conv2dNet (), y los otros códigos no necesitan moverse en absoluto. El siguiente paso es ejecutar el entrenamiento para ver el efecto.

8393201f1523fefd3e3885fe9b696598.png

En la figura anterior, podemos ver que la tasa de predicción de nuestro resultado de entrenamiento es del 98 %.

encima

5c1aae10436d49c11d5640b1ad44112d.png

be77c5ae099d94c5269436de6d99ef27.png

Maravillosa revisión del pasado.

64c9c2189f50786645cb61d3d2a11de3.jpeg

Comenzando con pyTorch (1) - Red totalmente conectada de entrenamiento de reconocimiento de datos escritos a mano Minist

 

2f9157b5c2ca69cee3e57d2092123a5e.jpeg

Android Kotlin crea una pizarra de firmas y guarda imágenes

 

bb7ee24a4ea0a3cdbc5a02fcb5841770.jpeg

Capacitación súper simple de pyTorch-> modelo onnx-> razonamiento C ++ OpenCV DNN (con dirección de código fuente)

Supongo que te gusta

Origin blog.csdn.net/Vaccae/article/details/128195856
Recomendado
Clasificación