ピットへのディープ ラーニング - プーリングと numpy の実装

序文

      畳み込みニューラル ネットワーク (ConvNets または CNNs) は、ニューラル ネットワークの一種として、cv の開発をサポートします. この記事では、主に畳み込みニューラル ネットワークの別の操作であるプーリング操作とその原理を紹介し、Xiaobai の観点からプーリングを完成させます。 0 から 1 まで。

1

      シャオバイのピットインのシリーズとして、今日のオペレーターのプールが始まります.他のオペレーターを見逃した場合は、公式アカウントで無敵の張大道に注意して受け取ってください.

      プーリングという用語は、視覚的なメカニズムで始まり、リソースのマージと統合を指し、英語ではプーリング、中国語では文字通りプーリングと訳されます。プーリング操作 (サブサンプリングまたはダウンサンプリングとも呼ばれます) は、主に各特徴マップの次元を削減することです。これにより、パラメーター マトリックスのサイズが削減され、最終的な出力の数が削減されますが、最も重要な情報は保持されます。プーリングには、MaxPooling、AveragePooling、SumPooling など、さまざまなタイプがあります。

2

Max Poolingを例に      とると、最初にスライディング ウィンドウ (2×2 ウィンドウなど) を定義し、ウィンドウに対応する特徴マップから最大の要素を出力特徴の対応する位置値として取得し、次のステップを使用します。 of stride=2 長く、左から右へ、上から下へ、次の位置へ、下の図に示すように:
ここに画像の説明を挿入
      全体的な操作は次のとおりです: 5x5 機能、3x3 スライディング ウィンドウでのスライディング、各ステップは 1 、および最大プーリング 平均プーリングの結果は下図のようになります. AveragePooling と SumPooling の操作は基本的に同じです.AveragePooling各スライディング ウィンドウの平均値を計算することです. SumPooling は各スライディング ウィンドウの合計を計算します.操作は簡単ですが、効果は明ら​​かです. sumPooling は一般に画像では使用されません. , 主な理由は AveragePooling が sumPooling の形式であるためです.
ここに画像の説明を挿入
ここに画像の説明を挿入
      各機能マップには n チャネルがあります. プーリング操作はそれぞれに対して操作することです.チャネル、つまり、入力は特徴マップの 3 層であり、出力も 3 層であり、下の図に示すように (ここで私は自分の脳の穴を作ります。プーリングも一種の深度分離可能な畳み込みであり、ただし、ここでのプーリングはstaticであり、特徴値は固定されており、トレーニングには参加しません)。
ここに画像の説明を挿入

maxPooling次の図は、 と を使用し      た後の特徴マップの変化ですSumPooling. 一般に、地域の平均値を選択すると、データ全体の特性が保存されることが多く、背景情報がより強調されると考えられています.最大値 (最大プーリング) が選択されている場合、テクスチャをより適切に保存できます. 機能:
ここに画像の説明を挿入
      もちろん、他のさまざまなプーリング操作があります:
      さらに、加重最大プーリング、Lp プーリング、一般化最大プーリング、およびグローバルなどのいくつかのバリアントがあります。プーリング。

  • stochastic pooling: 要素は確率値に従ってランダムに選択されます. 要素が選択される確率はその値と正の相関があります. これは正則化操作です.
  • mixed pooling: 最大/平均プーリングでのランダム選択。
  • Data Driven/Detail-Preserving Pooling: 上記の方法はすべて手動で設計されていますが、現在、深層学習のすべての分野が実際に自動化の方向に発展しています。また、活性化関数から正規化まで、データ駆動型ソリューションの研究を開始したことも前に述べましたが、プーリングについても同様で、すべての画像はそれ自体に最適なプーリング方法を学習できます。

      このように、プーリングの操作はシンプルで便利で、多くの利点があります。

  • 特徴マップのサイズは徐々に小さくすることができます. 特徴マップが小さい場合, 元の画像に対応する受容野は大きくなります. maxpooling操作図に示すように, 5×5画像の場合, 特徴マップのサイズ畳み込み演算後のサイズは 5 × 5、プーリング演算後のサイズは 3 × 3 であるため、各要素は以前はピクセルに対応していましたが、現在は 3 × 3 の元の画像視野に対応し、受容野が高まります。
  • 同時に、多層畳み込み操作の後、モデル内のデータ量が実際に過剰適合していると誰もが想定しています.これにより、ネットワークのパラメーターと計算されたデータの量が減少し、過剰適合を効果的に防ぐことができます;
  • また、多くの記事で、プーリングは並進不変性を持つと言われていますが、プーリングは領域の特徴を連続的に抽象化し、位置を気にしないため、プーリングは畳み込み演算と同様に、並進不変性をある程度増加させます。 here, from another 一方では、受容野が十分に大きくない限り、conv などはローカルな情報しか学習できず、グローバルなビューを欠くため、cv のトランスフォーマーなどが台頭します。. これは後で説明します。今は言及しません。

3
      プーリング演算子の実装は torch や tensorflow などのフレームワークにパッケージ化されており, 箱から出してすぐに使えてとても便利です. これはあなた自身の理解を容易にするためです. プーリングは 0 から numpy まで実現されています. その考え方は以下の通りです.Layersクラスの継承も検討してください.Layerクラスのコードについては,conv演算子でのLayerクラスの実装を参照してください. プーリング オペレーターは Layer クラスを統合し、順方向および逆方向の実装は次のとおりです。

import numpy as np
from module import Layers 

class Pooling(Layers):
    """

    """
    def __init__(self, name, ksize, stride, type):
        super(Pooling).__init__(name)
        self.type = type
        self.ksize = ksize
        self.stride = stride 

    def forward(self, x):
        b, c, h, w = x.shape
        out = np.zeros([b, c, h//self.stride, w//self.stride]) 
        self.index = np.zeros_like(x)
        for b in range(b):
            for d in range(c):
                for i in range(h//self.stride):
                    for j in range(w//self.stride):
                        _x = i *self.stride
                        _y = j *self.stride
                        if self.type =="max":
                            out[b, d, i, j] = np.max(x[b, d, _x:_x+self.ksize, _y:_y+self.ksize])
                            index = np.argmax(x[b, d, _x:_x+self.ksize, _y:_y+self.ksize])
                            self.index[b, d, _x +index//self.ksize, _y +index%self.ksize ] = 1
                        elif self.type == "aveg":
                            out[b, d, i, j] = np.mean((x[b, d, _x:_x+self.ksize, _y:_y+self.ksize]))
        return out 

    def backward(self, grad_out):
        if self.type =="max":
            return np.repeat(np.repeat(grad_out, self.stride, axis=2),self.stride, axis=3)* self.index 
        elif self.type =="aveg":
            return np.repeat(np.repeat(grad_out, self.stride, axis=2), self.stride, axis=3)/(self.ksize * self.ksize)

      深層学習の発展以来、さまざまなオペレーターが当初、真の香りから放棄、真の香りへと繰り返し荒らされてきました.スタンフォード大学のエリック・カウデラー・エイブラムスは、機密マップを翻訳することにより、プーリングがパフォーマンスに影響を与えないように見えることをかつて発見しました.データ強化は、パフォーマンスを向上させることです。良い方法です。. つまり、畳み込みとステップ サイズを使用したプーリングはダウンサンプリングのためのものであり、それぞれに長所と短所があります。畳み込みのアクティブ化後、平均プーリングは安定して機能しますが、詳細が失われます。最大プーリングは、毎回最大値のみが保持され、勾配の戻りも中断されるため、平均プーリングの欠点を克服します。プーリングのサイズも考慮する必要があります。

参考:
[1] https://zhuanlan.zhihu.com/p/58381421
[2]https://www.zhihu.com/question/303215483/answer/615115629

より多くのCVについては、公式アカウントに注意してください:無敵の張大道

おすすめ

転載: blog.csdn.net/zqwwwm/article/details/123603044