Notas de estudio de PyTorch: el uso del esqueleto básico de la red neuronal Torch.NN y el principio de convolución

1. Introducción a torch.nn.Module

torch.nnPuede ayudarnos a entrenar la red neuronal de manera más elegante y hacer que el código de la red neuronal sea más conciso y flexible. Documentación oficial: Torch.NN .

En el documento, puede ver que la primera pieza de contenido se llama Container (contenedor), que es equivalente al esqueleto de la red neuronal. Las cosas después del Contenedor se usan para llenar el esqueleto, como Convolution Layers (capa de convolución ), Pooling Layers (capas de agrupación). capa), aquellos que tienen la base de la red neuronal convolucional deben estar familiarizados con estas palabras.

Hay seis módulos en Container: Module, Sequential, ModuleList, ModuleDict, ParameterList, ParameterDict, el más utilizado es Module, que es la clase más básica de todas las redes neuronales, y su método de construcción básico es el siguiente:

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

class Model(nn.Module):
    def __init__(self):  # 初始化
        super().__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):  # 前向传播
        x = F.relu(self.conv1(x))  # 将 x 进行第一层卷积后用 ReLU 激活函数输出
        return F.relu(self.conv2(x))  # 将处理后的 x 再进行第二层卷积后用 ReLU 处理后返回最后结果

Ahora intentamos crear una red neuronal simple nosotros mismos y generar el resultado de la propagación hacia adelante:

import torch
import torch.nn as nn

class Network(nn.Module):
    def __init__(self):  # 初始化
        super(Network, self).__init__()

    def forward(self, input):
        output = input + 1
        return output

network = Network()
x = torch.tensor(1.0)  # x 为 tensor 类型
output = network(x)  # Module 中的 __call__ 函数会调用 forward 函数
print(output)  # tensor(2.)

2. Principio de red neuronal convolucional

La operación de convolución en una red neuronal convolucional (CNN) es equivalente a la "operación de filtro" en el procesamiento de imágenes. Para los datos de entrada, la operación de convolución desliza una ventana de filtros (núcleos de convolución) en un cierto intervalo (tamaño de paso) y los aplica. Como se muestra en la siguiente figura, los elementos del filtro en cada posición se multiplican por los elementos correspondientes de la entrada y luego se suman (este cálculo a veces se denomina operación de multiplicación y acumulación ). Luego, guarde este resultado en la ubicación correspondiente de la salida. Realice este proceso en todas las posiciones para obtener el resultado de la operación de convolución:

inserte la descripción de la imagen aquí

En una red neuronal completamente conectada, además de los parámetros de peso, también existen sesgos. En CNN, los parámetros del filtro corresponden a los pesos anteriores. Además, hay sesgos en las CNN. El flujo de procesamiento de la operación de convolución, incluido el sesgo, se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Para una explicación más detallada de las redes neuronales convolucionales, puede ir a: [Notas de estudio] Introducción al aprendizaje profundo: teoría e implementación basada en Python .

Ahora, volvamos a PyTorch, tomemos Conv2dla función como ejemplo, el documento oficial de la función: TORCH.NN.FUNCTIONAL.CONV2D .

Esta función tiene los siguientes parámetros:

  • input: La imagen de entrada, de tamaño (mini_batch, in_channels, height, width).
  • weight: El tamaño del kernel de convolución, el tamaño es (out_channels, in_channels/groups, height, width).
  • bias: sesgo, por defecto es None.
  • stride: Tamaño de paso, que se utiliza para controlar el intervalo de movimiento del kernel de convolución. Si xes , el tamaño de paso en ambas direcciones horizontal y vertical es x. Si (x, y)es el tamaño de paso en la dirección vertical es x, y el tamaño de paso en la dirección horizontal es y.
  • padding: La operación de expansión de borde se realiza en el borde de la imagen de entrada para garantizar que el tamaño de la imagen antes y después de la entrada y la salida permanezca sin cambios. En la definición de la capa de convolución de PyTorch, el valor predeterminado es paddingcero relleno 0 en el borde.
  • padding_mode: La forma de expandir el borde.
  • dilation: establece el intervalo entre búsquedas.

Por ejemplo:

import torch
import torch.nn.functional as F

input = torch.tensor([
    [1, 2, 3, 0],
    [0, 1, 2, 3],
    [3, 0, 1, 2],
    [2, 3, 0, 1]
])

kernel = torch.tensor([
    [2, 0, 1],
    [0, 1, 2],
    [1, 0, 2]
])

input = torch.reshape(input, (1, 1, 4, 4))  # batch_size = 1,channel = 1
kernel = torch.reshape(kernel, (1, 1, 3, 3))

output = F.conv2d(input, kernel, stride=1)
print(output)
# tensor([[[[15, 16],
#           [ 6, 15]]]])

output = F.conv2d(input, kernel, stride=1, bias=torch.tensor([3]))  # 注意 bias 必须也是矩阵
print(output)
# tensor([[[[18, 19],
#           [ 9, 18]]]])

Supongo que te gusta

Origin blog.csdn.net/m0_51755720/article/details/128065712
Recomendado
Clasificación