PyTorch-畳み込みニューラルネットワーク
ディープラーニングは機械学習の一部門であり、ここ数十年で研究者が取った重要なステップと見なされています。ディープラーニングの実装例には、画像認識や音声認識などのアプリケーションが含まれます。
ディープニューラルネットワークの2つの重要なタイプを以下に示します-
- 畳み込みニューラルネットワーク
- リカレントニューラルネットワーク。
この章では、最初のタイプ、つまり畳み込みニューラルネットワーク(CNN)に焦点を当てます。
畳み込みニューラルネットワーク
畳み込みニューラルネットワークは、アレイの複数のレイヤーを介してデータを処理するように設計されています。このタイプのニューラルネットワークは、画像認識や顔認識などのアプリケーションで使用されます。
CNNと他の通常のニューラルネットワークの主な違いは、CNNは入力を2次元配列として受け取り、他のニューラルネットワークが焦点を当てている特徴抽出に焦点を合わせるのではなく、画像を直接操作することです。
CNNの主なアプローチには、認識の問題に対する解決策が含まれます。グーグルやフェイスブックのようなトップ企業は、活動をより迅速に行うために、認識プロジェクトの研究開発プロジェクトに投資してきました。
すべての畳み込みニューラルネットワークには、3つの基本的なアイデアが含まれています-
- ローカルのそれぞれのフィールド
- Convolution
- Pooling
これらの各用語を詳しく理解しましょう。
ローカルのそれぞれのフィールド
CNNは、入力データ内に存在する空間相関を利用します。ニューラルネットワークの同時層のそれぞれは、いくつかの入力ニューロンを接続します。この特定の領域は、ローカル受容野と呼ばれます。隠れたニューロンにのみ焦点を当てています。隠されたニューロンは、特定の境界の外側の変化を認識せずに、言及されたフィールド内の入力データを処理します。
ローカルのそれぞれのフィールドを生成する図表現を以下に示します-
畳み込み
上の図では、各接続が隠れニューロンの重みを学習し、ある層から別の層への移動に関連する接続があることを確認しています。ここでは、個々のニューロンが時々シフトを実行します。このプロセスは「畳み込み」と呼ばれます。
入力レイヤーから非表示のフィーチャマップへの接続のマッピングは「共有ウェイト」として定義され、含まれるバイアスは「共有バイアス」と呼ばれます。
プーリング
畳み込みニューラルネットワークは、CNN宣言の直後に配置されるプーリング層を使用します。ユーザーからの入力を畳み込みネットワークから出てくる特徴マップとして受け取り、凝縮された特徴マップを作成します。プーリングレイヤーは、前のレイヤーのニューロンを含むレイヤーを作成するのに役立ちます。
PyTorchの実装
次の手順は、PyTorchを使用して畳み込みニューラルネットワークを作成するために使用されます。
ステップ1
単純なニューラルネットワークを作成するために必要なパッケージをインポートします。
from torch.autograd import Variable
import torch.nn.functional as F
ステップ2
畳み込みニューラルネットワークのバッチ表現を使用してクラスを作成します。入力xのバッチ形状は、次元が(3、32、32)です。
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
#Input channels = 3, output channels = 18
self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
#4608 input features, 64 output features (see sizing flow below)
self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
#64 input features, 10 output features for our 10 defined classes
self.fc2 = torch.nn.Linear(64, 10)
ステップ3
(3、32、32)から(18、32、32)への最初の畳み込みサイズ変更のアクティブ化を計算します。
寸法のサイズが(18、32、32)から(18、16、16)に変わります。サイズが(18、16、16)から(1、4608)に変化するため、ニューラルネットの入力層のデータ次元を再形成します。
-1は、他の指定された次元からこの次元を推測することを思い出してください。
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = x.view(-1, 18 * 16 *16)
x = F.relu(self.fc1(x))
#Computes the second fully connected layer (activation applied later)
#Size changes from (1, 64) to (1, 10)
x = self.fc2(x)
return(x)