Winograd stride2勉強メモ
Winograd Stride2の実装法ないかなーってググったら新しめの論文が出てきたので読んでメモ
Stride 2 1-D, 2-D, and 3-D Winograd for Convolutional Neural Networks
この論文の提案手法ではNvidiaGPUにて通常の畳み込みよりカーネル3x3で1.44倍,5x5で2.04倍,7x7で2.42倍,3x3x3で1.73倍速くなっているようです.
このメモでは3x3のみ解説していきます
Winograd自体の解説はこちら
3x3 Winograd Stride2
実装法自体は非常に単純です.
まずinputを5x5に分割し,inputとkernelを上の画像のように色ごとに4つのグループに分けます.1stグループはWinograd F(2x2,2x2),2nd,3rdグループはF(2,2)を2回,4thグループはスカラの乗算をし,その結果の総和がoutputとなります.
おわり
おまけ
input5x5をKernel3x3のwinograd_st2で計算するプログラム(numpy実装)を作りました.参考にどうぞ
github.com
さらにおまけ
各グループで使うWinogradの計算式と変換行列を載せておきます.
ここで⊙は各要素の乗算です.
F(2x2,2x2)
計算式:
変換行列:
F(2,2)
計算式:
変換行列: