人工知能 (Pytorch) モデルの構築 6 - Pytorch を使用して畳み込みニューラル ネットワーク ResNet モデルを構築する

こんにちは、Wei Xue AI です。今日は、人工知能 (Pytorch) モデルの構築 6 - Pytorch を使用して畳み込みニューラル ネットワークの ResNet モデルを構築する方法を紹介します。この記事では、PyTorch を使用して畳み込みニューラル ネットワークの ResNet モデルを構築する方法を学びます。畳み込みニューラル ネットワーク ResNet モデル。生成された偽のデータをトレーニングしてテストします。この記事では、ResNet モデルの概要、ResNet モデルの構造、偽データの生成、ResNet モデルの実装、モデルのトレーニングとテストの内容について説明します。

1. ResNet モデルの概要

ResNet (残差ネットワーク) モデルは、2015 年に He Yuming らによって提案された深層畳み込みニューラル ネットワークです。その主な革新は残差構造の導入であり、これにより ResNet はディープ ニューラル ネットワークのトレーニングが難しいという問題を効果的に解決できます。ResNet は、ImageNet 大規模視覚認識チャレンジを含む、いくつかの画像分類タスクで非常に良い結果を達成しました。ResNet モデルは、畳み込みニューラル ネットワークが層数に制限されないようにし、層数が深くなるほどモデルの予測結果が悪化するという問題を解決します。

2. ResNet モデルの構造

ResNet の中心的なアイデアは残差ブロックを導入することであり、残差ブロックの入力は次の層に直接渡されるだけでなく、スキップ接続 (Skip Connection) を通じて後続の層に直接接続されます。この構造は勾配消失の問題を効果的に軽減できるため、ネットワークを効果的にトレーニングできます。

一般的な残差ブロックには、2 つの畳み込み層、2 つの活性化関数、および 1 つのスキップ接続が含まれます。ResNet ネットワークの層の数は、一般的な ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152 など、異なる数の残差ブロックを積み重ねることによって実現できます。

59448bf4644146d3961ad57b50d4a5e7.png

3. 偽のデータを生成する

モデルのトレーニングとテストをデモンストレーションするために、この記事全体で生成された偽のデータを使用します。1000 個の 3 チャネル 32x32 画像のデータセットを生成し、乱数を使用して画像のピクセル値を表し、各画像に 0 ~ 9 のクラス ラベルを割り当てます。

4 番目に、ResNet モデルを実装します。

次に、PyTorch フレームワークを使用して ResNet-18 モデルの簡易バージョンを実装します。まず、必要なライブラリをインポートする必要があります。

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

残留接続グラフ: 

8c9a04aad4174dd1bafd61d10dfd9cb8.png

5. トレーニングとテストのモデル

次に、データセット、モデル、損失関数、オプティマイザーを作成し、トレーニングします。

# 生成假数据
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. まとめ

この記事では、PyTorch を使用して畳み込みニューラル ネットワーク ResNet モデルを構築し、生成された偽データでトレーニングおよびテストする方法について詳しく説明します。ResNet-18 モデルの簡易バージョンを実装することで、残差ブロックの構造と原理、および残差構造を使用してディープ ニューラル ネットワークを効果的にトレーニングする方法を理解しました。実際のアプリケーションでは、モデルの構造とパラメーターを調整し、実際のデータセットを使用することで、モデルのパフォーマンスをさらに向上させることができます。

 

おすすめ

転載: blog.csdn.net/weixin_42878111/article/details/130873253