ニューラルネットワークCNNプーリングレイヤー

簡単な紹介

  プーリングレイヤーはCNNの一般的な操作です。プーリングレイヤーは通常、サブサンプリングまたはダウンサンプリングと呼ばれます。CNNネットワークを構築する場合、畳み込みレイヤーの後に使用されることがよくあります。プーリングレイヤーは、畳み込みレイヤーの出力のフィーチャディメンションを削減します。これにより、オーバーフィットを防ぎながら、ネットワークパラメーターを効果的に削減できます。
  プーリング操作と言えば、私たちがよく使うプーリング操作、つまり最大プーリングと平均プーリングを考えますが、実際には多くの種類のプーリング操作があります(詳細は以下を参照)。 。入力サイズがiiであると仮定しますi、出力サイズはooですO、カーネルサイズ为株式会社k、ストライドはsssの場合、次の式が満たされます。o= i − ks + 1 o = \ frac {ik} {s} + 1ザ・=sI - K+1 ;パッドがある場合、次の式が満たされます。o= i + 2×p− ks + 1 o = \ frac {i + 2 \ times p -k} {s} + 1ザ・=sI + 2 × P - K+1
プーリングレイヤーの
  主な機能は次のとおりです
    。1。ノイズを抑制し、情報の冗長性を低減します
    。2。
    モデルのスケール不変性と回転不変性を改善します
    。3。モデル計算の量を減らします。4。オーバーフィットを防ぎます。

プーリング層の分類

最大/平均プーリング

  最大プーリングとは、画像領域の最大値を領域のプール値として選択することです。方向が伝搬すると、勾配は順方向伝搬プロセスの最大値を伝搬し、その他の位置勾配は0になります。
  使用する場合、最大プーリングは、一般的なストライド=カーネル_サイズストライド=カーネル\ _サイズなど、特にオーバーラッププーリングと非オーバーラッププーリングです。s t r i d e=k e r n e l _ s i z eはオーバーラッププーリングに属します。オーバーラップしないプーリングと比較して、オーバーラッププーリングは予測精度を向上させるだけでなく、同僚は特定の領域でのオーバーフィットを軽減できます。
  重複しないプーリングのアプリケーション例は、yolov3-tinyバックボーンの最後のレイヤーが特徴抽出にstride = 1およびkernelsize = 2のmaxpoolingを使用することです。

import torch
import torch.nn.functional as F

input = torch.Tensor(1, 3, 32, 32)
output = F.max_pool2d(input, kernel_size=2, stride=2)
print(output.shape)

output = F.max_pool2d(input, kernel_size=2, stride=2, padding=1)
print(output.shape)

'''
output:
   torch.Size([1, 3, 16, 16])
   torch.Size([1, 3, 17, 17])
'''

  平均プーリングとは、選択した画像領域のすべての値の平均値を、その領域のプール値として使用することです。

import torch
import torch.nn.functional as F

input = torch.Tensor(1, 3, 32, 32)
output = F.avg_pool2d(input, kernel_size=2, stride=2)
print(output.shape)

'''
output:
   torch.Size([1, 3, 16, 16])
'''

プーリングの中央値

  中央値フィルターに似ていますが、使用される可能性が低くなります。メディアンプーリングは、エッジとテクスチャ構造を学習するという特徴があり、強力なアンチノイズ機能を備えています。

コンビネーションプーリング

  コンビネーションプーリングは、最大プーリングと平均プーリングの利点を同時に利用するプーリング戦略です。2つの一般的な組み合わせ戦略があります:追加と連結。分類タスクのトリックとしてよく使用されます。その機能は、機能レイヤーを強化することです。最大プーリングはローカル機能により多くの注意を払い、平均プーリングはグローバル機能により多くの注意を払います。

import torch
import torch.nn.functional as F

def add_avg_max_pool2d(input):
    max_output = F.max_pool2d(input, kernel_size=2, stride=2)
    avg_output = F.avg_pool2d(input, kernel_size=2, stride=2)
    return 0.5 * (max_output + avg_output)

def concat_avg_max_pool2d(input):
    max_output = F.max_pool2d(input, kernel_size=2, stride=2)
    avg_output = F.avg_pool2d(input, kernel_size=2, stride=2)
    return torch.cat([max_output, avg_output], 1)

if __name__ == '__main__':
    input = torch.Tensor(1, 3, 32, 32)
    output = add_avg_max_pool2d(input)
    print("add: " + str(output.shape))
    output = concat_avg_max_pool2d(input)
    print("concat: " + str(output.shape))
'''
output:
   add: torch.Size([1, 3, 16, 16])
   concat: torch.Size([1, 6, 16, 16])
'''

空間ピラミッドプーリング

ペーパーアドレスディープコンボリューションでの
  空間ピラミッドプーリング-1406.4729空間ピラミッドプーリングはSPPと省略されます。SPPはSPPNetで提案され、以前に提案されました。上記のSPPに関するペーパーへのリンクがあります。元々は、CNNを解決するために提案されました。入力画像のサイズの制限は、繰り返しの畳み込み計算と固定出力です。SPPのネットワーク構造は次のとおりです。
ここに写真の説明を挿入

SPPネットワーク構造
  要するに、特徴マップは3つのスケールのピラミッド層と別々にプールされ、プールされた結果は固定長の特徴ベクトルを取得するためにスプライスされ、分類のためにCNNに入力されます。

  yolov3にはyolov3-spp.cfgというネットワーク構造があります。このネットワークはyolov.cfgよりも高い精度を実現します。yolov3-spp.cfgのgitURLは次のとおりです。

### SPP ###
[maxpool]
stride=1
size=5

[route]
layers=-2

[maxpool]
stride=1
size=9

[route]
layers=-4

[maxpool]
stride=1
size=13

[route]
layers=-1,-3,-5,-6

### End SPP ###

  ここでのSPPは、元のSPPNetworksのバリアントと同等です。複数のカーネルサイズの最大プーリングを使用することにより、すべての機能マップが最終的にスプライスされ、新しい機能の組み合わせが取得されます。
SPPの利点:

  • 一貫性のない画像サイズの問題を解決します
  • さまざまな角度からの特徴の抽出、集約
  • アルゴリズムの堅牢な機能を反映して、精度を向上させます

グローバル平均/最大プーリング

  グローバル平均プーリングと平均プーリングの違いは、「グローバル」という言葉にあります。グローバルとローカルの両方が文字通り、プーリングウィンドウ領域を説明するために使用されます。ローカルは、機能マップのサブ領域を平均化してから、このサブ領域をスライドさせることです。グローバルは、明らかに機能マップ全体を平均化することです。
  グローバル最大プーリングについても同じことが言えます。

参照

https://www.jianshu.com/p/884c2828cd8e
ディープ畳み込みにおける空間ピラミッドプーリング-1406.4729https //www.plob.org/article/22160.html

おすすめ

転載: blog.csdn.net/CFH1021/article/details/105989297