Modelo de construcción de inteligencia artificial (Pytorch) 6-Uso de Pytorch para construir un modelo ResNet de red neuronal convolucional

Hola a todos, soy Wei Xue AI. Hoy les presentaré la construcción de modelos de inteligencia artificial (Pytorch) 6-Uso de Pytorch para construir un modelo ResNet de red neuronal convolucional. En este artículo, aprenderemos cómo usar PyTorch para construir un modelo ResNet de red neuronal convolucional, y entrenar y probar los datos falsos generados. Este artículo cubrirá estos contenidos: Introducción al modelo ResNet, estructura del modelo ResNet, generación de datos falsos, implementación del modelo ResNet, modelos de entrenamiento y prueba.

1. Introducción al modelo ResNet

El modelo ResNet (red residual) es una red neuronal convolucional profunda propuesta por He Yuming et al. en 2015. Su principal innovación es la introducción de una estructura residual, a través de la cual ResNet puede resolver de manera efectiva el problema de que las redes neuronales profundas son difíciles de entrenar. ResNet ha logrado muy buenos resultados en varias tareas de clasificación de imágenes, incluido el Desafío de reconocimiento visual a gran escala de ImageNet. El modelo ResNet hace que la red neuronal convolucional no esté limitada por el número de capas y resuelve el problema de que cuanto más profundo es el número de capas, peor es el resultado de la predicción del modelo.

2. Estructura del modelo ResNet

La idea central de ResNet es introducir un bloque residual. La entrada del bloque residual no solo pasa directamente a la siguiente capa, sino que también se conecta directamente a la capa posterior a través de una conexión de salto (Skip Connection). Esta estructura puede aliviar efectivamente el problema de la desaparición del gradiente, de modo que la red pueda entrenarse de manera efectiva.

Un bloque residual típico contiene dos capas convolucionales, dos funciones de activación y una conexión de salto. El número de capas de la red ResNet se puede lograr apilando diferentes números de bloques residuales, como los comunes ResNet-18, ResNet-34, ResNet-50, ResNet-101 y ResNet-152.

59448bf4644146d3961ad57b50d4a5e7.png

3. Genera datos falsos

Para demostrar el entrenamiento y las pruebas del modelo, utilizaremos datos falsos generados a lo largo de este artículo. Generaremos un conjunto de datos de 1000 imágenes de 32x32 de 3 canales, usaremos números aleatorios para representar los valores de píxeles de la imagen y asignaremos a cada imagen una etiqueta de clase entre 0 y 9.

Cuarto, implementar el modelo ResNet

A continuación, implementaremos una versión simplificada del modelo ResNet-18 utilizando el marco PyTorch. Primero, necesitamos importar las bibliotecas requeridas:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
import numpy as np

class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)

        self.skip_connection = nn.Sequential()
        if stride != 1 or in_channels != out_channels:
            self.skip_connection = nn.Sequential(
                nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(out_channels)
            )

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.skip_connection(x)
        out = F.relu(out)
        return out

class ResNet(nn.Module):
    def __init__(self, block, num_classes=10):
        super(ResNet, self).__init__()
        self.in_channels = 64
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(64)
        self.layer1 = self._make_layer(block, 64, stride=1)
        self.layer2 = self._make_layer(block, 128, stride=2)
        self.layer3 = self._make_layer(block, 256, stride=2)
        self.layer4 = self._make_layer(block, 512, stride=2)
        self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(512, num_classes)

    def _make_layer(self, block, out_channels, stride):
        layers = [block(self.in_channels, out_channels, stride)]
        self.in_channels = out_channels
        layers.append(block(out_channels, out_channels))
        return nn.Sequential(*layers)

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.avg_pool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

Gráfico de conexión residual: 

8c9a04aad4174dd1bafd61d10dfd9cb8.png

5. Modelo de entrenamiento y pruebas

Ahora creamos el conjunto de datos, el modelo, la función de pérdida y el optimizador, y entrenamos:

# 生成假数据
num_samples = 1000
image_data = np.random.rand(num_samples, 3, 32, 32).astype(np.float32)
labels = np.random.randint(0, 10, size=num_samples, dtype=np.int64)

# 创建数据集和数据加载器
train_data = TensorDataset(torch.from_numpy(image_data), torch.from_numpy(labels))
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)

# 创建模型、损失函数和优化器
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = ResNet(ResidualBlock).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for i, (images, labels) in enumerate(train_loader):
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / (i + 1)}")

# 测试模型
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print(f"Accuracy of the model on the {total} test images: {100 * correct / total}%")

6. Resumen

El artículo detalla cómo usar PyTorch para construir un modelo ResNet de red neuronal convolucional y entrenar y probar los datos falsos generados. Al implementar una versión simplificada del modelo ResNet-18, comprendemos la estructura y el principio del bloque residual y cómo usar la estructura residual para entrenar de manera efectiva una red neuronal profunda. En aplicaciones prácticas, el rendimiento del modelo se puede mejorar aún más ajustando la estructura y los parámetros del modelo y utilizando conjuntos de datos reales.

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42878111/article/details/130873253
Recomendado
Clasificación