參考:https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/
平常都是無腦使用Pytorch提供的nn.Conv2d
方法,但是並不關心具體該如何實現,原來是把卷積操作轉化成矩陣乘法,而不是真的通過滑動卷積核來做卷積,下面做具體介紹。
首先看一下下面的示意圖,左邊是輸入圖像,右邊是卷積核(為方便說明,只用了一個卷積核)。
下面是用這個卷積核對輸入圖像做卷積操作,最后得到一個2維的平面
由下圖可以看到卷積操作其實就是把輸入圖像划分成若干個塊(patch),每個塊的維度和卷積核保持一致(這里暫時忽略stride,padding的影響)。然后我們可以把每個3維的patch展開成一維向量,然后拼接起來得到一個二維矩陣。
因為每個patch都是和相同的卷積核做卷積,那么我們也可以同樣把卷積核展開成以為向量。下圖中右邊的卷積核矩陣表示多個卷積核拼湊的結果。
完整的轉化過程可看下圖: