この記事では、最初にプーリングに対応する操作について説明し、次にプーリングの背後にある原理のいくつかを分析し、最後にプーリングの Python 実装を示します。
1. プーリングに対応する操作
まず第一に、プーリング全体の直感的な概念があります (つまり、プーリングの入力、出力、および特定の機能を説明しますが、特定の実装の詳細は無視します)。プーリングは行列であり、出力は行列です。完成した関数は、入力行列のローカル領域を操作して、その領域に対応する出力がその領域の特性を最もよく表すことができるようにすることです。図 1 に示すように、左側の図の黄色の行列は入力行列を表し、右側の図の青色の行列は出力行列を表し、動的オレンジ色の行列は選択された入力行列の局所領域を表します。選択されたすべての代表が、元の入力行列に対応する空間的位置関係に従って出力行列内で並べ替えられます。
このプロセスは選挙プロセスにたとえることができます。北京市長を選出したい場合、実現可能なアプローチは、北京の各区がその区の利益に最も適した代表者を選出し、選出された代表者が北京市長の選出方法を決定することです。もちろん、私たちは各地区で選出された議員がその地区の利益に最もよく応えられることを望んでいます。プーリングを簡単に例えると、北京 入力マトリックス、朝陽区、海淀区、その他の 地方地域が 出力マトリックスを表します (会議中に地理的位置に従って配置されている場合、これはプーリングの特性と同じです (非常に似ています)。
2. プールの背後にある理由
地域の代表者を選出するプロセスでは、私たちの一般的なアプローチは、その地域で最も権威のある人を代表者として選択することです(最大プールに対応)、またはその人を選択することですこれに応じて、エリア所有者の一般的な特徴を持つ人が代表者として使用されます (平均プーリングに対応)。プーリングには 2 つの一般的な方法があります。1 つは最大のローカル エリア値を持つ人がエリアの代表者として選ばれます。または、エリア内のすべての値がエリアの代表として平均化されます。
地域内で最も評判の高い人を代表として選ぶのと、地域内の全員の一般的な特徴を最もよく表す人を代表として選ぶのとでは、次のような利点があります。
1) これは、地元で最も評判の高い人が市長を選ぶ 偏りはあるが、高齢に頼っている可能性があり、地域の一般大衆の意見を代表することはできない(極大値、一般的な特性は無視されやすい)。
2) 地域内のすべての人の一般的な特性を最もよく代表する人は、その地域のすべての住民の最大の権利と利益を代表することができますが、その人の認知能力は限られているため (局所平均は小さい) 、そのため彼の認知能力には限界がある)、市長を選ぶ際にバイアスが生じやすい。
3) エリア内の人々がある程度の移動の自由(平行移動と回転の不変性に相当)を持っている場合、基本的には上記の 2 つの代表者選出方法に影響を与えません。
プーリングの正式な説明
関連理論によると: (1) 近傍のサイズが制限されているため、推定値の分散が増加します。(2) 誤差により推定平均値の偏差が生じます。一般に、平均プーリングは最初のエラーを減らし、画像のより多くの背景情報を保持できますが、最大プーリングは 2 番目のエラーを減らし、より多くのテクスチャ情報を保持できます。
一般に、プーリングの入力次元は高く、出力次元は低くなります。これは、プーリング原理の上記の説明に基づいて、この次元削減プロセスであると推測できます。入力すべき最も重要な情報の一部を大幅に保持します。実際にプーリングを適用する場合には、実際の問題の特性に基づいて詳細な分析を行う必要があります。実際、プーリングの動作と原理を理解したら、具体的な問題とうまく組み合わせれば、それは良いイノベーションのポイントになります(笑)。
3. pooing の Python 実装
コードを書くときの著者の考えの一部は次のとおりです。その核心は、複雑な問題をコードで直接実装できる問題に分割することです。
1) 入力。コードを記述するときにこれら 2 つの形式を直接考慮すると、どこから始めればよいかわかりません (考慮すべき状況がたくさんあり、多次元行列になると混乱しやすくなります)。 。注意深く分析した結果、mxn 行列のプーリングを実装すると、mxn 行列の実装を使用して mxnxp 行列を簡単に実装できることがわかりました。
2) mxn 行列入力の場合、図 1 のオレンジ色のボックスが入力行列を正確にカバーできない可能性があるため、入力行列を拡張する必要があります。拡張も非常に簡単です。最後の poolStride に対応する poolSize が入力行列をカバーできる限り、他の行列も確実にカバーできます。
3) 最後に、for ループは同様の操作を実行します。
def pooling(inputMap,poolSize=3,poolStride=2,mode='max'): """INPUTS: inputMap - input array of the pooling layer poolSize - X-size(equivalent to Y-size) of receptive field poolStride - the stride size between successive pooling squares OUTPUTS: outputMap - output array of the pooling layer Padding mode - 'edge' """ # inputMap sizes in_row,in_col = np.shape(inputMap) # outputMap sizes out_row,out_col = int(np.floor(in_row/poolStride)),int(np.floor(in_col/poolStride)) row_remainder,col_remainder = np.mod(in_row,poolStride),np.mod(in_col,poolStride) if row_remainder != 0: out_row +=1 if col_remainder != 0: out_col +=1 outputMap = np.zeros((out_row,out_col)) # padding temp_map = np.lib.pad(inputMap, ((0,poolSize-row_remainder),(0,poolSize-col_remainder)), 'edge') # max pooling for r_idx in range(0,out_row): for c_idx in range(0,out_col): startX = c_idx * poolStride startY = r_idx * poolStride poolField = temp_map[startY:startY + poolSize, startX:startX + poolSize] poolOut = np.max(poolField) outputMap[r_idx,c_idx] = poolOut # retrun outputMap return outputMap # 测试实例 test = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) test_result = pooling(test, 2, 2, 'max') print(test_result)
テスト結果:
概要: まずテクノロジーのインプット、アウトプット、機能を理解し、次に人生における同様の例を探します。最後に、テクノロジーを達成可能なステップに分解します。