Pytorch-convolutional-neural-network
PyTorch-畳み込みニューラルネットワーク
ディープラーニングは機械学習の一部であり、ここ数十年で研究者がとった重要なステップと考えられています。 ディープラーニングの実装例には、画像認識や音声認識などのアプリケーションが含まれます。
ディープニューラルネットワークの2つの重要なタイプを以下に示します-
- 畳み込みニューラルネットワーク
- リカレントニューラルネットワーク。
この章では、最初のタイプ、つまり畳み込みニューラルネットワーク(CNN)に焦点を当てます。
畳み込みニューラルネットワーク
畳み込みニューラルネットワークは、アレイの複数のレイヤーを介してデータを処理するように設計されています。 このタイプのニューラルネットワークは、画像認識や顔認識などのアプリケーションで使用されます。
CNNと他の通常のニューラルネットワークの主な違いは、CNNは入力を2次元配列として受け取り、他のニューラルネットワークが焦点を当てる特徴抽出に焦点を当てるのではなく、画像に直接作用することです。
CNNの主要なアプローチには、認識の問題の解決策が含まれます。 GoogleやFacebookなどのトップ企業は、認知プロジェクトの研究開発プロジェクトに投資して、活動をより迅速に完了させています。
すべての畳み込みニューラルネットワークには3つの基本的なアイデアが含まれています-
- 現地の各分野
- 畳み込み *プーリング
これらの各用語を詳細に理解しましょう。
ローカルの各フィールド
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)