カフェim2col



Caffe Im2col



Tiger-Gaoの深い知識のおかげで、この記事はhttps://blog.csdn.net/mrhiuser/article/details/52672824から転送されます。

この記事は、カフェでの畳み込みプロセスについてです。 caffeの畳み込みがim2colとsgemmに基づいていることはよく知られています。インターネット上にはすでにim2colの説明がたくさんあります。私はこの記事を書くつもりはありませんでした。 (インターネット上にはcaffe im2colのプロセスを説明する記事がたくさんあります。いくつかの記事とcaffeの特定の実装は正しくありません。それらがあるかどうかは本当にわかりません。caffeコードの具体的な実装を見ると、多くの時間を無駄にしたそれらの記事のためです。)



この記事では、カフェでのim2colとsgemmの特定のプロセスの例を示します。これを説明する前に、caffeのデータはrow-majorに格納されます。1つ:im2col画像input_num = 1画像チャネルinput_channel = 1画像高さinput_h = 4画像幅input_w = 4カーネル高kernel_h = 3カーネル幅kernel_w = 3ストライド= 1;パッド= 0;畳み込み後、出力画像の計算式: output_h =(input_h-kernel_h)/ stride + 1 output_w =(input_w-kernel_w)/ stride + 1
以下に示すように(注:画像のデータは画像の色の値を表すものではありません) 元の画像(図a)は左から右、上から下に描かれ、(a)のサイズ3 * 3(カーネルサイズが3 * 3であるため)の行列が右の画像に描かれます(図a)。 b)。行。特定のプロセスを次の図に示します。
2:マルチチャネルim2col3つのチャネル(R、G、B)があると仮定します。画像チャネルinput_channel = 3画像はメモリに保存されます。最初に最初のチャネルのデータが継続的に保存され、次に2番目のチャネルのデータが保存されます。 3番目のチャネルのデータが保存されます。以下に示すように: マルチチャネルim2colのプロセスは、最初に最初のチャネルをim2colし、次にim2colの2番目のチャネル、最後にim2colの2番目のチャネルをim2colすることです。各チャネルim2colのデータもメモリに継続的に保存されます。以下に示すように: 3:カーネル以下に示すように、画像の各チャネルはカーネルチャネルに対応します(注:計算が簡単なため、カーネルの値を1に設定します。この値は、色の値を表していません)。 カーネルのチャネルデータもメモリに継続的に保存されます。したがって、上記のカーネルイメージは、次のイメージとして表すこともできます。 3:行列乗算sgemmcaffeでの画像とカーネルの行列乗算はkernel * imgです。つまり、行列の乗算ではM = 1、N = output_h * output_w K = input_channels * kernel_h * kernel_w
以下に示すように: 画像データは継続的に保存されるため、出力画像は次のようになります[output_h * output_w] = [2 * 2]:
4:マルチチャンネル画像出力コーヒー行列とカーネルの行列乗算:M = output_channels、N = output_h * output_w K = input_channels * kernel_h * kernel_w
以下に示すように: 同様に、複数の出力チャネル画像のデータは連続して保存されるため、出力画像は次のようになります[output_channels * output_h * output_w] = [3 * 2 * 2]、
(終了)