Darknetソースコードリーディングノート(2)

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ます。

 

 

 

 

 

おすすめ

転載: blog.csdn.net/juluwangriyue/article/details/109185644