Winograd_k7x7_st2勉強メモ
Winograd_st2勉強メモの続き.今回はカーネル7x7の実装法についてメモする.
カーネル7x7でも3x3と同じように入力ブロックをいくつかのグループに分けて畳み込み計算をする(元論文参照).計算量を削減するために各グループの畳み込みはWinogradで計算する必要があり,3x3では以下のツールで必要な変換行列を求めることができた.
このツールでは入力に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の変換行列について書いてありました...見落としてた)
計算式は以下
GPGPU実装をするにあたって自分用にリファレンス実装をnumpyで書いた.