深ハンズオン科学学習 - 畳み込みニューラルネットワーク1

ここに画像を挿入説明
ホワイトボーゆうプラットフォームを娼婦、または波の広告を再生し、およそ感謝します。
主に研究ノートは、問題解決には時間と労力を無駄にしないように、このブログでは無視することができます

畳み込みニューラルネットワークインフラストラクチャ

これは、畳み込みニューラルネットワークの基本的な考え方を説明し、そして細胞層が主層の畳み込みである、充填、ストライド、入力チャネルと出力チャネルの意味を解釈します。

二次元相互相関演算

公式の説明:二次元相互相関(相互相関)操作入力は、2次元入力配列と二次元コア(カーネル)アレイである、出力は、コア配列は、典型的に畳み込みまたはフィルタと呼ばれている、請求二次元アレイであります(フィルタ)。コンボリューションカーネルサイズ、入力配列上のコンボリューションカーネルスライドは、各位置で、コンボリューションカーネルは、入力アレイよりも一般に小さい場所で入力要素サブアレイを乗じて出力配列内の対応する位置を与えるために加算されます要素。図1に示す相互相関演算の一例をそれぞれ斜線部、計算領域の第1の入力、及びコアの出力の対応するアレイ。

図1
人気のあることを個人的な理解:入力アレイは畳み込みカーネルが実行を乗算ポイントカバー注意がマトリックス操作ではない、上の図は、プロセス0の計算例である0 + 1。 1. 3 + 2 + 4。 3. 19 =。
Pytorch機能は使用corr2dすることができます二次元の相互相関演算を実現するには、入力X及びコア配列Kの配列を受け取り、アレイを出力Y.

import torch 
import torch.nn as nn

def corr2d(X, K):
	# X代表输入数组,K代表卷积核
	# H/h 行,W/w代表列
    H, W = X.shape
    h, w = K.shape
    Y = torch.zeros(H - h + 1, W - w + 1)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
    return Y

構成入力配列X上図、相互相関出力の動作を検証するために二次元のコア配列K

X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
Y = corr2d(X, K)
print(Y)

出力テンソル([19、25]、[37、43]])

レイヤ2次元コンボリューション

二次元相互相関畳み込み演算を行うための入力層の畳み込み、及び出力を得るためにオフセットスカラーを加えます。レイヤーはコンボリューションモデルパラメータとスカラーオフセット畳み込みカーネルを備えます。

class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super(Conv2D, self).__init__()
        self.weight = nn.Parameter(torch.randn(kernel_size))
        self.bias = nn.Parameter(torch.randn(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias

例で見てみましょうが、我々は残りの(1)白さ、黒(0)のような6×8の画像、中間体4を構成し、エッジの所望の色が検出されます。我々のラベルが6×7の二次元アレイであり、第2列は、第6列は、-1(0から1までのエッジ)1(0〜1の端部から)です。

X = torch.ones(6, 8)
Y = torch.zeros(6, 7)
X[:, 2: 6] = 0
Y[:, 1] = 1
Y[:, 5] = -1
print(X)
print(Y)

出力
テンソル([[1、1、0、1と0の0の0、、、、1]の、
[1、0の0の0の0の1、、、、、 1、1]、
[1、1、0.5、0.5、0.5、0.5、1、1]、
[1、1、0.5、0.5、0.5、0 。、1、1]、
[1、1、0.5、0.5、0.5、0.5、1、1]、
[1、1、0.5、0、0。 、0、1、1]])の
0の0の0の([0のテンソル、1、、、、-1、0]の
0、0の0、1の[ 。、0、-1、0.5]、
[0.5、1、0.5、0.5、0.5、-1、0.5]、
[0.5、1、0.5、0.5、 0.5、-1、0.5]、
[0.5、1、0.5、0.5、0.5、-1、0.5]、
[0.5、1、0.5、0、0。 、-1、0.5])、
1×2の畳み込み層を学びたい人学びたいは、エッジは、カラー層を畳み込むことによって検出されます。

conv2d = Conv2D(kernel_size=(1, 2))
step = 30  #周期
lr = 0.01 # 学习率
for i in range(step):
    Y_hat = conv2d(X)
    l = ((Y_hat - Y) ** 2).sum()
    l.backward()
    # 梯度下降
    conv2d.weight.data -= lr * conv2d.weight.grad
    conv2d.bias.data -= lr * conv2d.bias.grad
    
    # 梯度清零
    conv2d.weight.grad.zero_()
    conv2d.bias.grad.zero_()
    if (i + 1) % 5 == 0:
        print('Step %d, loss %.3f' % (i + 1, l.item()))
        
print(conv2d.weight.data)
print(conv2d.bias.data)

运算结果
ステップ5、損失4.569
ステップ10、損失0.949
ステップ15、損失0.228
ステップ20、損失0.060
ステップ25、損失0.016
ステップ30、損失0.004
テンソル([1.0161、-1.0177]])
ンソル([0.0009])

充填およびストライド

ウルトラ2つのパラメータは、畳み込み層、即ち、充填およびストライドを導入し、それらを形状および出力を変更するためのコンボリューションカーネルの入力の形状を与えることができます。

充填

我々は、元の入力の高さと幅の要素値0の両側に添加したパディング(パディング)パディング要素(典型的には0要素)の両方の高さと幅の入力手段、図2。
ここに画像を挿入説明
図のそれぞれの入力側の2高さと幅は、0次元相互相関演算要素で充填しました

元の高さと幅は、入力NH及びNW、及びKHキロワットと高いpH側での総充填ライン幅高い畳み込みカーネルである場合は、両側の出力の形状を全体の幅PWカラムを充填しました。

(NH +性pH-KH + 1)×(故郷+スリープ-KW + 1)

我々は非常に高い、1ステップ、2K + 1コアサイズのような畳み込みは、高さ(または幅)は、3×3,5×5カーネルとしてコアの畳み込みニューラルネットワーク奇数の側面を、使用します(または幅)充填K、入力と出力の選択されたサイズの両側には同じサイズのままことができます。
簡単に述べるとフィラーは、例えばパディング= 1、行を埋め、すべての要素ダウンして、開発された入力配列要素の周囲に充填されている0

ストライド

相互相関演算、入力アレイスライド上のコンボリューションカーネル、各スライドストライド(ストライド)で行と列の数。以前、我々はストライド1、図3に示す3の高いペースで広いストライドで2二次元相互相関演算を使用しています。
また、各セル2、セル3はそれぞれ長手方向に移動の横方向の動き
ここに画像を挿入説明
図3及び高い広いストライド上、それぞれ3及び2次元相互相関計算

一般的に、ときSH、ハイペースのストライド幅SW、出力の形状は以下のとおりです。

⌊(NH +のpHは、KH + SH)/sh⌋×⌊(NW + PW-KW + SW)/sw⌋

であればpH = KH-1、PW = KW-1、出力は⌊形状に(NH + SH-1)/sh⌋×⌊(NW + SW-1)/sw⌋が低減されます。入力された高さと幅缶ストライドは高さと幅で割り切れる場合はさらに、出力は、形状(NH / SH)×(NW / SW)であろう。

ときのpH = PW = P、我々は充填pに対して呼び出す;場合は、SH = SW = S、我々はストライドをsと呼びます。

汎用式がある(H-Fは、+は、2P)/ S + +1
Pアレイが充填されているH入力配列サイズ、Fコンボリューションカーネルのサイズは、Sは、移動ステッププラスオフセットを表します。

複数の入力チャネルと複数の出力チャネル

入力と出力の前には、二次元アレイであるが、データの実際の寸法は、多くの場合より高いです。例えば、高さの外形寸法及び幅並びにのような2つのRGB(赤、緑、青)の3つのカラーチャネルにカラー画像。高さと、カラー画像を想定幅はそれぞれ、それが多次元配列W 3×H×として表すことができ、H及び(ピクセル)wであり、この寸法の大きさは、チャンネル3(チャンネル)の寸法と呼ぶことにします。

複数入力単一出力チャネル

入力層の畳み込み、図を複数のチャネルを含んでもよい。二次元入力チャンネル相互相関演算を有する図4の例。
ここに画像を挿入説明
仮定入力チャンネルの数は、CI、畳み込みカーネル形状KH×KWは、我々は、相互相関演算CI二次元出力チャネルを追加することにより、KWコアアレイ×KHの各入力チャンネルのための形状のそれぞれを割り当てています出力としての2次元配列を得ました。我々は、接続チャネル、すなわち、CI×KH×KW畳み込みカーネルた形状に次元アレイコアをCI。

複数の入力と複数の出力チャネル

畳み込み層の出力は、それぞれ、複数のチャネルを含み、チャネルの数は、それぞれ、CIおよびCO、高さと幅のコンボリューションカーネルの入出力チャネルを提供し、及びKH KWできます。あなたは、複数のチャンネルを有する出力を得たい場合、我々は、各出力チャンネルのために作成することができるCI×KH×KWコア配列、その出力チャネルに接続された寸法、畳み込みカーネルCO×CI×KHの即ち形状として形成されています×キロワット

我々は理解を与える、A CI×KH×KWコア配列は、いくつかの局所的な特徴を抽出することができるコンボリューションカーネルの出力チャネルに対して、入力特徴の豊富を有していてもよく、我々は、CI×KHを複数持っている必要が×KWコアアレイ、異なるコアのアレイは、異なる特徴抽出です。

1x1の畳み込み層

最後に1×1の畳み込みカーネルの形状は、我々は通常、1×1のこの畳み込み畳み込みを呼び出して、このコンボリューションコンボリューション層の畳み込みカーネルを含む層は、1×1であると述べました。図5に示す相互相関は、入力チャンネル3と出力チャネル1の2×1コンボリューションカーネルの数を用いて計算されます。

ここに画像を挿入説明
図5 1x1の畳み込みカーネル相互相関計算。入力と出力が同じ高さと幅を持っています

1×1チャネルの数を調整、アスペクトを変更せずに畳み込みを承認しました。1×1高とコンボリューションカーネルを認識しないが、主チャネルの寸法に発生算出されるパターン要素に隣接する広い寸法、から構成される。我々は、完全な畳み込み層接続層同等物の作用を1×1、寸法データサンプルと要素の高さと幅、フィーチャ寸法ようなチャネル寸法をとります。

フル畳み込み層の接続層との比較

2次元コンボリューション層は、しばしば、以前の完全リンク層と比較して、画像を処理するために使用され、それは2つの主な利点を有します。

第1の層が完全にベクトル画像に平らに接続され、もはや可能要素に隣接する入力画像が困難に隣接する平坦化操作は、ローカル情報ネットワークを捕捉するため。コンボリューション層の設計、自然にローカルな情報を抽出する能力を持っています。

第二に、以下のパラメータ層の畳み込みの量。オフセット、形状(W CI、CO、Hなど)を考慮せずにコンボリューションカーネルパラメータの量に関係なく、入力画像の幅と高さのCI×W×H×CO、です。接続は全体接続層を使用する場合は、入力と出力層の形状は、畳み込み(C1、H1、W1)及び(C2、H2、W2)である場合、パラメータの数は、C1×C2×H1×W1×H 2倍ですW2。畳み込み層は、より大きな画像に対応するパラメータのより少ない数であってもよいです。

シンプルなコンボリューション層の実装

pytorch中nn.Conv2d可以简单实现主要注意下面几个参数
in_channels(パイソン:INT) -入力IMAGの中のチャネルの数
out_channels(パイソン:INT) -畳み込みによって生成されるチャネルの数
kernel_size(パイソン:intまたはタプル) -畳み込むカーネルのサイズ
ストライド(パイソン:intまたはタプル、オプション) -畳み込みのストライド。デフォルト:1
パディング(パイソン:intまたはタプル、オプション) -ゼロパディングが入力の両側に添加しました。デフォルト:0
バイアス(ブール値、オプション) - Trueの場合、出力に学習可能バイアスを追加します。デフォルト:true

四次元テンソルの形状(N、CIN、ヒン、ウィン)としてフォワード機能のパラメータ、戻り値は、Nがバッチサイズである四次元テンソルの形状(N、Coutは、ハウト、Woutの)であり、C、 H、Wは、チャンネル数、高さ、幅を表します。

X = torch.rand(4, 2, 3, 5)
print(X.shape)

conv2d = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=(3, 5), stride=1, padding=(1, 2))
Y = conv2d(X)
print('Y.shape: ', Y.shape)
print('weight.shape: ', conv2d.weight.shape)
print('bias.shape: ', conv2d.bias.shape)

输出结果
torch.Size([4、2、3、5])
Y.shape:torch.Size([4、3、3、5])
weight.shape:torch.Size([3、2、3、5 ])
bias.shape:torch.Size([3])

プーリング

プーリング層は、主に畳み込み位置の上に感光層を緩和するために使用されます。畳み込みレイヤ、入力データのリザーバ層と出力要素を計算するたびに(また窓をプールとして知られている)固定形状の窓、プールされた層は、直接最大値または細胞ウィンドウ要素の平均値を算出し、その動作も最大規模のプールや平均プールされたと呼ばれました。2×2ウィンドウの最大のプールの形状をプールし、図6に示します。
ここに画像を挿入説明
最大平均層プーリングおよびプールをプール、単純平均又は最大点トークは、核プールのカバーの入力配列です。

シンプルプーリング層の実装

私たちは、コンストラクタのパラメータ以下、nn.MaxPool2d最大プーリング層でPytorchを使用します。

kernel_size -上の最大を取るために、ウィンドウのサイズ
のストライド-ウィンドウののストライドデフォルト値はkernel_size IS
パディング-両側に追加する暗黙ゼロパディングは、
四次元テンソルの形状(Nとしてフォワード機能をパラメータC、ヒン、ウィン)は、戻り値は四次元テンソルの形状(N、C、ハウト、Woutをある )、 Nはバッチサイズであり、C、H、Wは、チャンネル数、高さ、幅を表します。

X = torch.arange(32, dtype=torch.float32).view(1, 2, 4, 4)
pool2d = nn.MaxPool2d(kernel_size=3, padding=1, stride=(2, 1))
Y = pool2d(X)
print(X)
print(Y)

出力
テンソル([[[[0、1、2、3]の
[4、5、6、7]、
[8、9、10、11]、
[ 12、13、14、15]、

     [[16., 17., 18., 19.],
      [20., 21., 22., 23.],
      [24., 25., 26., 27.],
      [28., 29., 30., 31.]]]])

テンソル([[[[5、6、7、7]、
[13、14、15、15]、

     [[21., 22., 23., 23.],
      [29., 30., 31., 31.]]]])

同じ方法を使用して、nn.AvgPool2dを用いて平均細胞層nn.MaxPool2d

公開された12元の記事 ウォンの賞賛0 ビュー268

おすすめ

転載: blog.csdn.net/inventertom/article/details/104632775