img2col:將特征圖image(3D)根據卷積核的尺寸按原圖對應位置展開成行col(2D)。
當卷積步長小於核邊長時,img2col會造成特征圖像素的重疊復制增加內存,但是依然是更有效率的。
核矩陣:將每個卷積核展成一列,即核矩陣的高為k*k*(
為每個卷積核的通道數),寬為
特征圖矩陣:image2col的關鍵就是根據卷積步長和卷積核的尺寸將featuremap(3D)按原圖的位置依次轉化成 由多個寬為k*k*的行向量(col),這些col拼成了特征圖矩陣。
以下為亂寫了。。。。。。
假設原圖為H1*W1*C,卷積核為k*k*C*Fn(Fn為卷積核數目)
H*W個行向量(行向量維度為k*k*C),image矩陣維度為(H*W)*(k*k*C),然后將每個卷積核也展開成k*k*C的列向量,因此核矩陣的維度為(k*k*C)*Fn。
矩陣乘法后即為(H*W)*Fn,H*W為卷積后輸出特征圖的尺寸,Fn就是特征圖的輸出通道數。
- 無論是pytorch還是tensorflow其都是接收一個batch的數據進行處理,因此其卷積運算的矩陣乘法實現也是一個batch一次運算的。而把輸入圖片input轉換成矩陣的過程就是img2col。
- 首先將filter展開為(filter_h * filter_w * in_channnel, out_channel)大小的2D矩陣
- 如果按數學上的運算,則卷積讀取內存是不連續的,會增加時間成本。因此才有了img2col,矩陣在內存中是一個連續的內存塊。在matlab中img2col是將img每次卷積運算對應的patch展開成列向量。而在caffe中是將每個patch轉換成行,本質上沒區別。以下為tensorflow中的過程,類似matlab。