PyTorchを使用して畳み込みニューラルネットワークを構築する
PyTorchでCNNを構築する
イントロダクション
畳み込みニューラルネットワーク(CNNまたはConvNet)は、オブジェクトの認識が重要なタスク(画像分類、検出、セグメンテーションなど)に特に設計されたディープラーニングアルゴリズムです。 CNNは、複雑なビジョンタスクで最先端の精度を達成し、監視システム、倉庫管理などの多くの実際のアプリケーションを支えています。
- 「AGENTS内部 半自律LLMエージェントを構築するための新しいオープンソースフレームワーク」
- 「大規模な言語モデルを使用した顧客調査フィードバック分析の強化」
- 「画像の匿名化はコンピュータビジョンのパフォーマンスにどのような影響を与えるのか? 伝統的な匿名化技術とリアルな匿名化技術の比較」
私たち人間は、パターン、形状、色を分析することで、簡単に画像の中のオブジェクトを認識できます。 CNNも同様にこの認識を行うようにトレーニングすることができます。例えば、猫と犬の写真を区別しようとする場合、私たちの脳は固有の形状、テクスチャ、顔の特徴に焦点を当てます。 CNNは、これらと同様の識別特性を見つけ出すことを学びます。非常に細かい分類タスクでも、CNNはピクセルから直接複雑な特徴表現を学ぶことができます。
このブログ記事では、畳み込みニューラルネットワークについて学び、PyTorchを使用して画像分類器を構築する方法を学びます。
畳み込みニューラルネットワークの仕組み
畳み込みニューラルネットワーク(CNN)は、画像分類タスクに一般的に使用されます。高レベルでは、CNNには次の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エポック訓練します。
- モデルのforward関数を使用して、順方向のパス、損失関数を使用した逆方向のパス、そして重みの更新を行います。このステップは、あらゆる種類のニューラルネットワークモデルでほぼ同様です。
- その後、テストデータローダーを使用して各エポックの最後にモデルのパフォーマンスを評価します。
- モデルの精度を計算し、結果を表示します。
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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- ディープラーニングライブラリーの紹介:PyTorchとLightning AI
- 「Now You See Me (CME) 概念ベースのモデル抽出」
- 効果的な小規模言語モデル:マイクロソフトの13億パラメータphi-1.5
- 「BlindChat」に会いましょう:フルブラウザおよびプライベートな対話型AIを開発するためのオープンソースの人工知能プロジェクト
- 「コンテキストに基づくドキュメント検索の強化:GPT-2とLlamaIndexの活用」
- 「AIはどれくらい環境に優しいのか?人間の作業と人工知能の二酸化炭素排出量を比較する」
- 大規模言語モデル:RoBERTa — ロバストに最適化されたBERTアプローチ