ニューラルネットワークインフラストラクチャの畳み込みを学習DataWhaleチームキャンプtask05-1パンチ

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

2次元コンボリューション層
このセクションでは、一般に、画像データを処理する際に使用される最も一般的な2次元コンボリューション層です。

算出二次元相互相関
二次元相互相関(相互相関)操作入力は、2次元入力配列と二次元コア(カーネル)アレイである、出力は、アレイは、一般的に、コアまたはコアのコンボリューションと呼ばれている、請求二次元アレイでありますフィルタ(フィルタ)。コンボリューションカーネルサイズ、入力配列上のコンボリューションカーネルスライドは、各位置で、コンボリューションカーネルは、入力アレイよりも一般に小さい場所で入力要素サブアレイを乗じて出力配列内の対応する位置を与えるために加算されます要素。図1に示す相互相関演算の一例をそれぞれ斜線部、計算領域の第1の入力、及びコアの出力の対応するアレイ。
ここに画像を挿入説明
二次元の図相互相関演算
我々は、入力配列X配列と核Kを取り、アレイを出力する二次元相互相関演算corr2d機能を実現下記Y.

import torch 
import torch.nn as nn

def corr2d(X, K):
    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

例で見てみましょう、我々は6コンストラクト黒(0)、(1)白、エッジの所望の色が検出された残りの画像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 * 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次元コンボリューションの二次元アレイは、空間次元(幅と高さ)に入力を特徴付けるとみなすことができ、また、特徴マップ(特徴マップ)として知られています。効果素子
(入力の実際のサイズよりも大きくすることができる)全ての可能な入力領域のXのと呼ばれる受容野X(受容野)前に算出されます。

1例として、4つの入力要素が斜線部受容野出力要素を網掛けされています。我々は、図における形状。2 2出力はY、Y字形状と他の表記
2
メーク相互相関演算、単一のコア配列要素Z 2の出力を。だから、Y受容野におけるZは、9つのすべての要素を含む入力受容フィールドに、すべての4つの要素Yを含みます。入力は、大きいサイズをキャプチャするために、前記我々は、図受容野の個々の要素が広くなることを特徴と深い畳み込みニューラルネットワークを介して見ることができます。

そして、ステップ埋める
、我々は二つのパラメータのスーパーコンボリューション層、すなわち、充填およびストライドを紹介し、彼らは出力を変更する形状とコンボリューションカーネルの入力の形状を与えてもよいです。

充填
パディング(パディング)、我々は、元の入力の高さと幅の要素値0の両側に追加されたパディング要素(典型的には0要素)の両方の高さと幅の入力手段、図2。
ここに画像を挿入説明
図2は、入力された2次元相互相関計算の高さと幅の両側の要素0に充填され
、元の高さと幅は、N-入力された場合にHおよびN- W、高さとコンボリューションカーネルの幅であるK H及びK Wを内、双方のp充填高い全Hの行、広い充填Pの両側の合計Wカラムは、出力の形状がある。
ここに画像を挿入説明
我々は、3のように、核における畳み込みニューラルネットワークの奇数の態様を使用3,5コンボリューションカーネル5

ペース
相互相関演算において、入力アレイスライド上のコンボリューションカーネル、各スライドストライド(ストライド)で行と列の数。以前、我々はストライド1、図3に示す3の高いペースで広いストライドで2二次元相互相関演算を使用しています。
ここに画像を挿入説明
3高さと幅をそれぞれストライド図3と2次元相互相関を計算
ストライドが高いSである場合、一般的にH、Sはステップの幅であるW、出力の形状がある:
ここに画像を挿入説明
もしP H = K H -1、P W = K W -1、その後、出力が形成する削減される
ここに画像を挿入説明
入力の高さと幅缶ストライドは高さと幅で割り切れるである場合、出力の形状は、(N-なり、さらにH / S H)*(N- W / S W)。
P場合はH = P Wが = P、我々は、pを満たさ呼び出すと、SときH = S W = sが、我々は呼んでストライドがsです。

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

複数の入力チャンネルの
畳み込み層は、複数の入力チャネルを備えていてもよい、図4に示す二次元入力チャンネル相互相関演算を有する例を示します。
ここに画像を挿入説明
図用の2つの入力チャネルを有する相互相関演算4
チャンネルは、入力データCと仮定するI、コンボリューションカーネルKの形状H * k個のW、我々は、各入力チャンネルのkのための形状のそれぞれを割り当てるH * K Wコアアレイは、C Iの二次元出力チャネルによる相互相関演算は、出力として2次元配列を得るために添加されます。我々 C Iは、接続チャネルで二次元配列、すなわち、Cた形状コアI * K H * K Wの畳み込みカーネルを。

MIMOチャネルの
畳み込み層はまた、複数の出力チャネルを備えることができる、提供畳み込みカーネル入力チャネルと出力チャネルがCであり、IおよびC Oの高さと幅がKであり、HおよびK Wあなたは、複数のチャンネルを有する出力を得たい場合、我々は、各出力チャンネルのために作成することができるCとして形成されているI * K H * K Wは、出力チャンネルの次元に接続され、コアアレイ即ち、コンボリューションカーネルCの形状O C * I * K H * K W

コンボリューションカーネルの出力チャネルのために、我々は理解を提供する、C I * K H * K Wのコア配列は、いくつかの局所的な特徴を抽出することができる、入力機能の豊富を有していてもよく、我々は、そのような複数を持っている必要がC I * K H * K Wのコア配列、異なるコアのアレイは、異なる特徴抽出です。

1x1の畳み込み層は
また、我々は、通常、畳み込み、そのような畳み込み演算を* 1つの畳み込み1で呼び出し、畳み込みカーネル1 * 1の形状を議論し、そのようなAを含む層は、コンボリューションカーネルの畳み込み層は、1×1であることを特徴とします。図5に示す3つの入力チャネルの使用は、相互相関演算の出力チャネル* 1 1 2畳み込みカーネル。
ここに画像を挿入説明
図5 1x1の畳み込みカーネル相互相関計算。入力と出力が同じ高さと幅を持っています

1x1の畳み込みは、チャネルの数を調整、アスペクトを変更せずに承認しました。1x1の畳み込みカーネル・モードは、チャネルが発生して算出され、その主要寸法を構成する隣接する要素の高さと幅の寸法を認識しません。我々は、ディメンションデータサンプルとして要素の特徴寸法、高さと幅とチャネルの寸法を仮定し、完全なレイヤの1x1の畳み込みの効果は、接続層に相当します。

比較畳み込み層の完全に接続された層を
前の層に比べて頻繁に使用される二次元畳み込み処理画像層は、完全には2つの主な利点を有し、接続されています。

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

第二に、以下のパラメータ層の畳み込みの量。オフセットを考慮せずに、(Cの形状I、C Oパラメータw量畳み込みカーネル、hは)CであるI XC Oの関わらず、入力画像の幅と高さの、xhxw。入力と出力層の形状は、(それぞれC、畳み込みである場合。1、H 1、W 1)、及び(C 2 H、2 W、2)接続が全体接続層を使用する場合、パラメータの数はCである。1 XH 。1 XW 。1 XC 2 XH 2 XW 2畳み込み層は、より大きな画像に対応するパラメータのより少ない数であってもよいです。

シンプルなコンボリューション層リアライズは
、我々がnn.Conv2dクラスPytorchを使用することを2次元コンボリューション層、次のコンストラクタのパラメータの主な焦点で実装さ:

  • in_channels(のpythonます。int) - 入力IMAGのチャンネル数
  • out_channels(のpythonます。int) - 畳み込みによって生成チャンネル数
  • kernel_size(のpython:intまたはタプル) - 畳み込むカーネルのサイズ
  • ストライド(のpython:intまたはタプル、オプション) - 畳み込みのストライド。デフォルト:1
  • パディング(パイソン:intまたはタプル、オプション) - 入力の両側に添加ゼロパディング。デフォルト:0
  • バイアス(ブール値、オプション) - Trueの場合、出力に学習可能バイアスを追加します。デフォルト:true

四次元テンソルの形状としてフォワード機能のパラメータ(N、C において、H 、Wは)、戻り値は四次元テンソルの形状(N、Cであり、OUT、H OUTは、WはOUT)、前記Nバッチサイズであり、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])

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

類似した二次元の最大のプールが、平均演算子を置き換えるために、最大の演算子と二次元作品の平均プール。ウィンドウのプーリング形状は、操作と呼ばれるプールp×q個のプールされた前記セル層p×q個のp×q個の細胞層、と呼ばれています。

細胞層とも形状の出力側を変更するために、高度に充填されたストライドと広い入力を移動ウィンドウを調整することができます。プーリング層は、作業メカニズムとペース畳み込み層と同じストライドを充填で満たされています。

場合、プールの各入力チャンネルの各細胞層をマルチチャンネル入力データの処理ではなく、画像の畳み込み層を合計チャネルによって各チャンネルの結果として。プールは、層の出力チャネル数と入力チャネルの数に等しい、この手段。

シンプルプーリング層を達成するため
、我々はコンストラクタのパラメータ以下、nn.MaxPool2d最大プーリング層でPytorchを使用します。

  • kernel_size - 最大オーバーを取るために、ウィンドウのサイズ
  • ストライド - ウィンドウのストライド。デフォルト値はkernel_sizeです
  • パディング-追加される暗黙的なゼロパディング両側の
    四次元テンソルの形状としてフォワード機能パラメータ(N、C、H Wは、であり、)、戻り値は四次元テンソルの形状(N、C、ですH OUT、WはOUT 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)

ここに画像を挿入説明
同じ方法nn.MaxPool2dを使用して、nn.AvgPool2dを用いて平均細胞層。

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

おすすめ

転載: blog.csdn.net/qq_44750620/article/details/104396602