PyTorchを使用して畳み込みニューラルネットワークを構築する

PyTorchでCNNを構築する

 

イントロダクション

 

畳み込みニューラルネットワーク(CNNまたはConvNet)は、オブジェクトの認識が重要なタスク(画像分類、検出、セグメンテーションなど)に特に設計されたディープラーニングアルゴリズムです。 CNNは、複雑なビジョンタスクで最先端の精度を達成し、監視システム、倉庫管理などの多くの実際のアプリケーションを支えています。

私たち人間は、パターン、形状、色を分析することで、簡単に画像の中のオブジェクトを認識できます。 CNNも同様にこの認識を行うようにトレーニングすることができます。例えば、猫と犬の写真を区別しようとする場合、私たちの脳は固有の形状、テクスチャ、顔の特徴に焦点を当てます。 CNNは、これらと同様の識別特性を見つけ出すことを学びます。非常に細かい分類タスクでも、CNNはピクセルから直接複雑な特徴表現を学ぶことができます。

このブログ記事では、畳み込みニューラルネットワークについて学び、PyTorchを使用して画像分類器を構築する方法を学びます。

 

畳み込みニューラルネットワークの仕組み

 

畳み込みニューラルネットワーク(CNN)は、画像分類タスクに一般的に使用されます。高レベルでは、CNNには次の3種類のメインレイヤーが含まれています:

  1. 畳み込みレイヤー。入力に畳み込みフィルタを適用して特徴を抽出します。これらのレイヤーのニューロンはフィルタと呼ばれ、入力の空間的なパターンを捉えます。
  2. プーリングレイヤー。畳み込みレイヤーからの特徴マップをダウンサンプリングして情報を統合します。最大プーリングと平均プーリングは一般的に使用される戦略です。
  3. 全結合レイヤー。畳み込みおよびプーリングレイヤーのハイレベルな特徴を分類のための入力として使用します。複数の全結合レイヤーを積み重ねることができます。

畳み込みフィルタは特徴検出器として機能し、入力画像の特定のパターンや形状を見つけたときに活性化することを学習します。これらのフィルタが画像全体に適用されると、特徴の存在する場所を強調する特徴マップが生成されます。

例えば、あるフィルタは垂直線を見つけると活性化し、画像の垂直線を示す特徴マップを生成するかもしれません。同じ入力に複数のフィルタを適用すると、画像の異なる側面を捉えた特徴マップのスタックが生成されます。

   

複数の畳み込みレイヤーを積み重ねることにより、CNNは特徴の階層を学習することができます。単純なエッジやパターンからより複雑な形状やオブジェクトにまで構築していきます。プーリングレイヤーは特徴表現を統合し、位置不変性を提供します。

最終的な全結合レイヤーは、これらの学習された特徴表現を使用して分類を行います。画像分類タスクの場合、出力層では通常、ソフトマックス活性化を使用してクラスの確率分布を生成します。

PyTorchでは、畳み込み、プーリング、および全結合レイヤーを定義してCNNのアーキテクチャを構築することができます。以下はサンプルコードです:

# 畳み込みレイヤー
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size)
self.conv2 = nn.Conv2d(in_channels, out_channels, kernel_size)

# プーリングレイヤー
self.pool = nn.MaxPool2d(kernel_size)

# 全結合レイヤー
self.fc1 = nn.Linear(in_features, out_features)
self.fc2 = nn.Linear(in_features, out_features)

 

その後、畳み込みニューラルネットワークを画像データでトレーニングし、逆伝播と最適化を使用します。畳み込みとプーリングレイヤーは効果的な特徴表現を自動的に学習し、ネットワークがビジョンタスクで強力なパフォーマンスを発揮できるようにします。

 

CNNの始め方

 

このセクションでは、CIFAR10をロードし、PyTorchを使用してCNNベースの分類モデルを構築およびトレーニングします。 CIFAR10データセットは、テスト画像分類モデルのテストに便利な10のクラスの32×32 RGB画像を提供します。クラスは整数0から9でラベル付けされています。

注意:サンプルコードはMachineLearningMastery.comブログの改変版です。

まず、torchvisionを使用してCIFAR10データセットをダウンロードしてロードします。また、torchvisionを使用してテストセットとトレーニングセットの両方をテンソルに変換します。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision

transform = torchvision.transforms.Compose(
    [torchvision.transforms.ToTensor()]
)

train = torchvision.datasets.CIFAR10(
    root="data", train=True, download=True, transform=transform
)

test = torchvision.datasets.CIFAR10(
    root="data", train=False, download=True, transform=transform
)

 

data/cifar-10-python.tar.gzをdata/cifar-10-python.tar.gzにダウンロード中

100%|██████████| 170498071/170498071 [00:10<00:00, 15853600.54it/s]

data/cifar-10-python.tar.gzをdataに展開中
ファイルはすでにダウンロードされ、検証済みです

 

その後、データローダーを使用して画像をバッチに分割します。 

batch_size = 32
trainloader = torch.utils.data.DataLoader(
    train, batch_size=batch_size, shuffle=True
)
testloader = torch.utils.data.DataLoader(
    test, batch_size=batch_size, shuffle=True
)

 

単一バッチの画像を視覚化するために、matplotlibとtorchvisionのユーティリティ関数を使用します。 

from torchvision.utils import make_grid
import matplotlib.pyplot as plt

def show_batch(dl):
    for images, labels in dl:
        fig, ax = plt.subplots(figsize=(12, 12))
        ax.set_xticks([]); ax.set_yticks([])
        ax.imshow(make_grid(images[:64], nrow=8).permute(1, 2, 0))
        break
show_batch(trainloader)

 

見ると、車、動物、飛行機、船の画像があります。 

   

次に、CNNモデルを構築します。そのために、Pythonクラスを作成し、畳み込み、プーリング、完全接続レイヤーを初期化します。私たちのアーキテクチャは、プーリングと線形レイヤーを持つ2つの畳み込みレイヤーを持っています。 

初期化した後、forward関数ですべてのレイヤーを順番に接続しません。PyTorchに初めて触れる方は、詳細なコンポーネントを理解するために、「PyTorchで解釈可能なニューラルネットワーク」を読むことをお勧めします。 

class CNNModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=(3,3), stride=1, padding=1)
        self.act1 = nn.ReLU()
        self.drop1 = nn.Dropout(0.3)
 
        self.conv2 = nn.Conv2d(32, 32, kernel_size=(3,3), stride=1, padding=1)
        self.act2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=(2, 2))
 
        self.flat = nn.Flatten()
 
        self.fc3 = nn.Linear(8192, 512)
        self.act3 = nn.ReLU()
        self.drop3 = nn.Dropout(0.5)
 
        self.fc4 = nn.Linear(512, 10)
 
    def forward(self, x):
        # 入力 3x32x32, 出力 32x32x32
        x = self.act1(self.conv1(x))
        x = self.drop1(x)
        # 入力 32x32x32, 出力 32x32x32
        x = self.act2(self.conv2(x))
        # 入力 32x32x32, 出力 32x16x16
        x = self.pool2(x)
        # 入力 32x16x16, 出力 8192
        x = self.flat(x)
        # 入力 8192, 出力 512
        x = self.act3(self.fc3(x))
        x = self.drop3(x)
        # 入力 512, 出力 10
        x = self.fc4(x)
        return x

 

モデルを初期化し、損失関数を設定し、オプティマイザを作成します。 

model = CNNModel()
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

 

訓練フェーズでは、モデルを10エポック訓練します。

  1. モデルのforward関数を使用して、順方向のパス、損失関数を使用した逆方向のパス、そして重みの更新を行います。このステップは、あらゆる種類のニューラルネットワークモデルでほぼ同様です。
  2. その後、テストデータローダーを使用して各エポックの最後にモデルのパフォーマンスを評価します。
  3. モデルの精度を計算し、結果を表示します。
n_epochs = 10
for epoch in range(n_epochs):
    for i, (images, labels) in enumerate(trainloader):
        # 順方向のパス
        outputs = model(images)
        loss = loss_fn(outputs, labels)

        # 逆方向のパスと最適化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    correct = 0
    total = 0
    with torch.no_grad():
        for images, labels in testloader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

    print('エポック %d: 精度: %d %%' % (epoch,(100 * correct / total)))

 

シンプルなモデルの精度は57%ですが、レイヤーを追加し、エポック数を増やし、ハイパーパラメータの最適化を行うことでモデルのパフォーマンスを改善することができます。

エポック 0: 精度: 41 %
エポック 1: 精度: 46 %
エポック 2: 精度: 48 %
エポック 3: 精度: 50 %
エポック 4: 精度: 52 %
エポック 5: 精度: 53 %
エポック 6: 精度: 53 %
エポック 7: 精度: 56 %
エポック 8: 精度: 56 %
エポック 9: 精度: 57 %

 

PyTorchを使用すると、畳み込みニューラルネットワークのすべてのコンポーネントをゼロから作成する必要はありません。すでに利用可能です。 `torch.nn.Sequential`を使用すれば、さらに簡単になります。 PyTorchはモジュール式に設計されており、ニューラルネットワークの構築、訓練、評価においてより高い柔軟性を提供します。

 

結論

 

この記事では、PyTorchを使用して画像分類のための畳み込みニューラルネットワークを構築して訓練する方法について探求しました。フィーチャー抽出のための畳み込みレイヤー、ダウンサンプリングのためのプーリングレイヤー、予測のための完全接続レイヤーなど、CNNアーキテクチャの中心的なコンポーネントについて説明しました。

この記事がPyTorchを使用した畳み込みニューラルネットワークの実装についての有益な概要を提供できたことを願っています。CNNはコンピュータビジョンの深層学習における基本的なアーキテクチャであり、PyTorchはこれらのモデルを素早く構築、訓練、評価するための柔軟性を提供しています。

    Abid Ali Awan (@1abidaliawan)は、機械学習モデルの構築が大好きな認定データサイエンティストです。現在、彼はコンテンツ作成と機械学習およびデータサイエンス技術に関する技術ブログの執筆に焦点を当てています。Abidはテクノロジーマネジメントの修士号とテレコミュニケーションエンジニアリングの学士号を持っています。彼のビジョンは、メンタルヘルスの問題に苦しむ学生向けにグラフニューラルネットワークを使用したAI製品を開発することです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

偉大さの開放:アレクサンダー大王の創造的AIとの旅 (Idai-sa no kaihō Arekusandā Taio no sōzō-teki AI to no tabi)

「生成型AI(GAI)はコーチングの効果を高めるためにどのように使用できるのか、また生成型AI(GAI)をコーチングツールとし...

機械学習

「JavaとGradleを使用したAIアプリケーションの開発」

実際のコード例を通じて、Deeplearning4j、Weka、そしてEncogなどの人気のあるライブラリを使用して、JavaとGradleを使ったAI...

機械学習

PythonでのChatGPT統合:AI会話の力を解き放つ

このブログでは、PythonとのChatGPTの統合について掘り下げ、さまざまなアプリケーションにChatGPTをPythonと統合する方法に...

機械学習

「NVIDIAのグレース・ホッパー・スーパーチップがMLPerfの推論ベンチマークを席巻する」

MLPerf業界ベンチマークに初登場したNVIDIA GH200 Grace Hopperスーパーチップは、すべてのデータセンターインファレンステス...

データサイエンス

サムスンはAIとビッグデータを採用し、チップ製造プロセスを革新します

世界的なメモリチップメーカーであるSamsung Electronics Co.は、最先端の人工知能(AI)とビッグデータ技術を活用して、チッ...

機械学習

(Samsung no AI to chippu gijutsu no mirai e no senken no myōyaku)

サムスンエレクトロニクスは、韓国ソウルにあるサムスンの研究開発キャンパスで開催されたサムスンAIフォーラム2023で主役と...