あざらしなので

備忘録と日常のこと

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

f:id:Taiki-azrs:20200422023046p:plain
実装法自体は非常に単純です.
まず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)

計算式:
Y=A^ T[[ GgG^ T ]⊙[B^ TdB]]A

変換行列:
A^ T =
\begin{bmatrix}
1 & 1 & 0 \\\
0 & 1 & 1
\end{bmatrix}

B^ T =
\begin{bmatrix}
1 & -1 & 0 \\\
0 &  1 & 0 \\\
0 & -1 & 1  
\end{bmatrix}

G =
\begin{bmatrix}
1 & 0\\\
1 & 1 \\\
0 & 1
\end{bmatrix}

F(2,2)

計算式:
Y=A^ T[Gg ⊙B^ Td]
変換行列:
A^ T =
\begin{bmatrix}
1 & 1 & 0 \\\
0 & 1 & 1
\end{bmatrix}

B^ T =
\begin{bmatrix}
1 & -1 & 0 \\\
0 &  1 & 0 \\\
0 & -1 & 1  
\end{bmatrix}

G =
\begin{bmatrix}
1 & 0\\\
1 & 1 \\\
0 & 1
\end{bmatrix}