Categories
モデル

ResNet

概要

ResNet(Residual Neural Network)は、ディープラーニングにおける畳み込みニューラルネットワーク(CNN)の一種です。ResNetは、主に画像認識やコンピュータビジョンのタスクで使用されます。

ResNetは、2015年にMicrosoft Researchの研究者によって提案されました。それ以前のニューラルネットワークの設計では、ネットワークの深さが増すと性能が向上する一方で、学習の困難さや勾配消失の問題が発生することがありました。ResNetは、この問題を解決するために「残差学習」を導入しました。

残差学習では、ネットワーク内の層に対するスキップ接続(ショートカット接続)を導入します。スキップ接続は、入力を直接追加することによって、ネットワーク内の層の出力を目標出力に近づけるような残差を学習します。これにより、層を深くすることができ、学習の困難さを軽減しながらネットワークのパフォーマンスを向上させることができます。

ResNetは、畳み込み層、バッチ正規化層、活性化関数(通常はReLU)、プーリング層、全結合層などの基本的なニューラルネットワークの構成要素を持ちながら、層の深さを大幅に増やすことができます。これにより、非常に深いネットワークであっても、過学習のリスクを減らしながら高い表現力を持つことができます。

ResNetの派生モデルは、画像認識のコンペティションで優れた性能を発揮し、広く使われるようになりました。例えば、ResNet-50、ResNet-101、ResNet-152などは、層の数が異なるが共通のアーキテクチャを持つモデルです。これらのモデルは、畳み込みニューラルネットワークの訓練と応用において非常に重要な役割を果たしています。

コード例

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torchvision.models import resnet18

# デバイスの設定
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# データの前処理
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# データセットのダウンロードと読み込み
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)

# ネットワークの定義と訓練
net = resnet18().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)

for epoch in range(10):
    net.train()
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(trainloader):
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

# テストデータでの精度評価
net.eval()
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %.2f %%' % (100 * correct / total))

このコードでは、torchvision.models.resnet18を使用してResNet-18モデルを作成し、CIFAR-10データセットを使用してモデルを訓練しています。訓練後にテストデータでモデルの精度を評価しています。

ただし、このコードは単純な例であり、実際のプロジェクトに適応する場合には、ハイパーパラメータやデータの前処理、ネットワークの構造などを適切に調整する必要があります。また、実行するためにはPyTorchや必要な依存関係がインストールされている必要があります。