# 6.3 ## 二維卷積的矩陣乘法 舉個例子,對一個單樣本、2通道、高$\times$寬=$3 \times 3$的樣本,以單個、2通道、$2 \times 2$的卷積核進行卷積。其中,兩個通道的樣本$\mathbf{X_0}$、$\mathbf{X_1}$分別是 $$ \mathbf{X_0} = \begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{pmatrix}, \mathbf{X_1} = \begin{pmatrix} 11 & 12 & 13\\ 14 & 15 & 16\\ 17 & 18 & 19 \end{pmatrix} $$ 兩通道的卷積核$\mathbf{K_0}$、$\mathbf{K_1}$分別是 $$ \mathbf{K_0} = \begin{pmatrix} 1 & 2\\ 3 & 4 \end{pmatrix}, \mathbf{K_1} = \begin{pmatrix} 5 & 6\\ 7 & 8 \end{pmatrix} $$ 可以看到,我們的樣本是一個(1,2,3,3)的四維張量,卷積核是一個(1,2,2,2)的四維張量。這時候我們可以做一個攤平的動作,把樣本張量攤成一個矩陣$\mathbf{X_{row}}$,把卷積核張量攤成一個矩陣$\mathbf{K_{col}}$ $$ \mathbf{X_{row}} = \begin{pmatrix} 1 & 2 & 4 & 5 & 11 & 12 & 14 & 15\\ 2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\ 4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\ 5 & 6 & 8 & 9 & 15 & 16 & 18 & 19 \end{pmatrix}, \mathbf{K_{col}} = \begin{pmatrix} 1\\ 2\\ 3\\ 4\\ 5\\ 6\\ 7\\ 8 \end{pmatrix} $$ 這時候我們得到卷積結果的攤平 $$ \mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}} = \begin{pmatrix} 379 \\ 418 \\ 490 \\ 526 \\ \end{pmatrix} $$ 因此卷積結果為 $$ \mathbf{Z} = \begin{pmatrix} 379 & 418 \\ 490 & 526 \end{pmatrix} $$ 我們可以做一下推廣,改成多樣本、多卷積核數目。 假設我們有樣本$\mathbf{X}$、卷積核$\mathbf{K}$,並輸出特徵圖$\mathbf{Z}$。 樣本$\mathbf{X}$:(樣本數,通道數,高,寬)=(N,C,H,W)的張量 卷積核$\mathbf{K}$:(卷積核數,通道數,高,寬)=(F,C,kH,kW)的張量 特徵圖$\mathbf{Z}$:(樣本數,單樣本生成特徵圖數量,高,寬)=(N,F,oH,oW)的張量 那只需要將原本的$\mathbf{X_{row}}$往下按照樣本數進行擴展,將原本的$\mathbf{K_{col}}$往右按照卷積核數進行擴展。 為了方便舉例,我們假設每個樣本都相同、每個卷積核都相同,設有2個樣本、3個卷積核,數值都和上面的舉例一樣。 $$ \mathbf{X_{row}} = \begin{pmatrix} 1 & 2 & 3 & 5 & 11 & 12 & 14 & 15\\ 2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\ 4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\ 5 & 6 & 8 & 9 & 15 & 16 & 18 & 19\\ 1 & 2 & 3 & 5 & 11 & 12 & 14 & 15\\ 2 & 3 & 5 & 6 & 12 & 13 & 15 & 16\\ 4 & 5 & 7 & 8 & 14 & 15 & 17 & 18\\ 5 & 6 & 8 & 9 & 15 & 16 & 18 & 19 \end{pmatrix}, \mathbf{K_{col}} = \begin{pmatrix} 1&1&1\\ 2&2&2\\ 3&3&3\\ 4&4&4\\ 5&5&5\\ 6&6&6\\ 7&7&7\\ 8&8&8 \end{pmatrix} $$ $$ \mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}} = \begin{pmatrix} 379&379&379 \\ 418&418&418 \\ 490&490&490 \\ 526&526&526 \\ 379&379&379 \\ 418&418&418 \\ 490&490&490 \\ 526&526&526 \end{pmatrix} $$ ## 二維卷積反向求導的矩陣乘法 已知$\mathbf{Z} = conv(\mathbf{X},\mathbf{K}) + b$,其中$conv(\mathbf{X},\mathbf{K})$可以表示成$\mathbf{Z_{row}} = \mathbf{X_{row}}\mathbf{K_{col}}$。 那要計算反向求導時,就可以比照全連接層的反向求導 $$db = np.sum(\mathbf{dZ},axis=(0,2,3))$$ $$\mathbf{dX_{row}} = \mathbf{dZ_{row}}\mathbf{K^T_{col}}$$ $$\mathbf{dK_{col}} = \mathbf{X^T_{row}}\mathbf{dZ_{row}}$$ 最後再進行攤平的逆過程,就可以得到$\mathbf{dX}$、$\mathbf{dK}$,但要注意的是$\mathbf{dX}$的逆攤平會有部分資料區塊重疊,這些重疊的梯度應該要相加起來。 以一維卷積舉例, $$ \mathbf{dX_{row}} = \begin{pmatrix} 1&2&3\\ 4&5&6\\ 7&8&9 \end{pmatrix} $$ 則 $$ \mathbf{dX} = \begin{pmatrix} 1 & 2+4 & 3+5+7 & 6+8 & 9 \end{pmatrix} $$ 問題: * 簡述二維捲積的矩陣乘法實現方法 * 為什麼在卷積神經網絡中要使用矩陣乘法來進行卷積操作?