あざらしなので

備忘録と日常のこと

Winograd_k7x7_st2勉強メモ

Winograd_st2勉強メモの続き.今回はカーネル7x7の実装法についてメモする.

カーネル7x7でも3x3と同じように入力ブロックをいくつかのグループに分けて畳み込み計算をする(元論文参照).計算量を削減するために各グループの畳み込みはWinogradで計算する必要があり,3x3では以下のツールで必要な変換行列を求めることができた.

github.com

このツールでは入力にpolynomial interpolation pointsとブロックの出力サイズ,カーネルサイズを与えると計算に必要な変換行列を返してくれる.WinogradはF(N,M)とF(NxN,MxM)は同じ変換行列を使い,計算方法が異なる.そのため上記のツールでは入力がNとMだけで,F(2x2,3x3)やF(4x4,6x6)などの変換行列を知ることが出来た.しかし,7x7_st2にはWinograd F(2x2,4x3)があり,一筋縄ではいかない(そもそもWinograd Convolutionを理解すれば良い話であるが...).

試行錯誤の結果,以下の変換行列でF(2x2,4x3)が計算できることが分かった.(追記:論文に4x3の変換行列について書いてありました...見落としてた)

 G=\begin{pmatrix}
  0.5&   0&   0&   0\\
 -0.5&-0.5&-0.5&-0.5\\
-1/6&1/6&-1/6&1/6\\
1/6&1/3&2/3&4/3  \\
0&0&0&1
\end{pmatrix}
 KG=\begin{pmatrix}
  1&   0.5&   0.5&   0\\
 0&0.5&-0.5&0\\
0&0.5&0.5&1
\end{pmatrix}
 B=\begin{pmatrix}
2&-1&-2&1&0\\
0&-2&-1&1&0\\
0&2&-3&1&0 \\
0&-1&0&1&0 \\
0&2&-1&-2&1
\end{pmatrix}
 KB=\begin{pmatrix}
1&0&0&0\\
0&1&-1&-1\\
-1&1&1&0 \\
0&0&0&1 \\
\end{pmatrix}
 A=\begin{pmatrix}
1&1&1&1&0\\
0&1&-1&2&1
\end{pmatrix}
 KA=\begin{pmatrix}
1&0\\
1&1\\
1&-1\\
0&1
\end{pmatrix}

計算式は以下

Y=A[[ GgKG]⊙[BdKB]]KA

GPGPU実装をするにあたって自分用にリファレンス実装をnumpyで書いた.

github.com