簡単な紹介
プーリングレイヤーは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のネットワーク構造は次のとおりです。
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