https://github.com/BBuf/Darknetから よく書かれたブログを参照してください:https://mp.weixin.qq.com/s/RruZSl49vv5B0eRif-p9HQ
最初に学びます。追加する追加のコンテンツがあります。
im2col分析
上記のコードからわかるように、畳み込み層の順方向伝搬のコアポイントは、im2col操作と、im2colを使用して再配置後にデータを計算するsgemmマトリックス計算方法です。次に、im2colアルゴリズムを分析しましょう。sgemmアルゴリズムは、im2colの実行直後に呼び出されるため、詳細については説明しません。
im2colのアイデアを写真と組み合わせると理解しやすいことを考慮して、CSDNTiger-Gaoブロガーの写真を使用して説明します。まず、長さと幅が4のシングルチャンネル画像をim2colで再配置するとどうなりますか?下の写真を見てください:
ここに写真の説明を挿入
変更プロセスを詳しく見てみましょう。
これはシングルチャネルの変更プロセスですが、マルチチャネルについてはどうでしょうか。元の画像を最初に見てください。
ここに写真の説明を挿入
マルチチャネルim2colのプロセスは、最初に最初のチャネルをim2colし、次に2番目のチャネルをim2colし、最後に3番目のチャネルをim2colすることです。各チャネルim2colのデータもメモリに継続的に保存されます。下の写真を見てください:
ここに写真の説明を挿入
これはim2col後の元のイメージの変更ですが、カーネルはどうですか?元の画像を参照してください:
ここに写真の説明を挿入
カーネルチャネルデータも継続的にメモリに保存されます。したがって、上記のカーネルイメージは、im2colアルゴリズムの後で次の図として表すことができます。
では、どのようにして順方向伝搬の結果を得るのでしょうか?DarkNetとCaffeでは、Kernel * Imgと同じ方法で、つまりマトリックス乗算で実装されます。
M=1 ,
N=output_h * output_w
K=input_channels * kernel_h * kernel_w
結果は次のとおりです。
画像データは継続的に保存されるため、出力画像は次の図のようになります[output_h * output_w] = [2 * 2]。
ここに写真の説明を挿入
マルチチャネル画像のプロセスは似ています。
同様に、複数の出力チャネルの画像データは連続して保存されるため、出力画像は次の図のようになります[output_channels * output_h * output_w] = [32 * 2]
ここに写真の説明を挿入
im2colアルゴリズムの実装は関数内にsrc/im2col.c
ありim2col_cpu
ます。