概要
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や必要な依存関係がインストールされている必要があります。