畳み込みニューラルネットワーク(CNN)

畳み込みニューラルネットワーク(CNN: Convolutional Neural Network)は、主に画像認識や画像分類などの視覚的データ処理に用いられるディープラーニングのモデルです。PyTorchでは、torch.nnモジュールを活用することで、CNNを柔軟に定義・訓練することができます。


1. CNNの基本構造

CNNは以下のようなレイヤーを組み合わせて構成されます:

  • 畳み込み層(Convolutional Layer)

    • フィルタ(カーネル)を用いて画像特徴を抽出

    • nn.Conv2dを使用

  • 活性化関数(Activation Function)

    • 非線形性を導入するためにReLUなどを適用

    • nn.ReLUなど

  • プーリング層(Pooling Layer)

    • 特徴マップの空間サイズを縮小(代表値抽出)

    • nn.MaxPool2dがよく使用される

  • 全結合層(Fully Connected Layer)

    • 最終的な分類を行う

    • nn.Linearを使用


2. PyTorchでの実装例

以下は、PyTorchでCNNを定義する簡単な例です:

python
import torch import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 畳み込み層1: 入力チャネル1、出力チャネル16、カーネルサイズ3 self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1) # プーリング層 self.pool = nn.MaxPool2d(2, 2) # 畳み込み層2 self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1) # 全結合層 self.fc1 = nn.Linear(32 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) # 出力クラス数: 10(例: MNIST) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) # Conv1 -> ReLU -> Pool x = self.pool(F.relu(self.conv2(x))) # Conv2 -> ReLU -> Pool x = x.view(-1, 32 * 7 * 7) # フラット化 x = F.relu(self.fc1(x)) # FC1 -> ReLU x = self.fc2(x) # FC2 (出力) return x

3. CNNの学習フロー

CNNモデルを学習させる際の基本的な手順は次の通りです:

  1. データのロード

    • torchvision.datasetstorch.utils.data.DataLoaderを使用

  2. モデルのインスタンス化

    • model = SimpleCNN()

  3. 損失関数とオプティマイザの定義

    • loss_fn = nn.CrossEntropyLoss()

    • optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

  4. 訓練ループの実装

    • 学習データに対して順伝播、損失計算、逆伝播、重み更新を行う

  5. 評価

    • テストデータで精度などの評価指標を確認


4. CNNの応用例

CNNは以下のようなタスクで広く利用されています:

  • 画像分類(MNIST, CIFAR-10)

  • 物体検出(YOLO, Faster R-CNN)

  • セマンティックセグメンテーション(U-Netなど)

  • 医療画像解析、顔認識、スタイル変換 など


5. PyTorchにおける利点

PyTorchのCNNモデル構築は以下の点で優れています:

  • nn.Moduleを使った柔軟なモデル設計

  • GPU対応による高速な学習(.to("cuda")で切替)

  • torchvision.transformsで画像前処理を効率化

  • autogradによる自動微分

生成日:2025/05/22