實際上在一些深度學習框架的底層,當實現conv2d運算時,是將conv轉化為im2col和gemm來進行運算的(比如caffe和mxnet),之前面試的時候就被問到怎麼實現im2col。
img2col是將img和kernel對應的那一塊鋪開成一行,然後將kernel鋪成一列,兩者進行矩陣乘法運算,這樣可以減少記憶體搬運。
下面就實現了im2col的py版本:
# import os
import numpy as np
def im2col(input_data, ksize, stride=1, pad=0):
n, c, h, w = input_data.shape
out_h = (h + 2 * pad - ksize) // stride + 1
out_w = (w + 2 * pad - ksize) // stride + 1
img = np.pad(input_data, [(0, 0), (0, 0), (pad, pad), (pad, pad)], "constant")
col = np.zeros((n, c, ksize, ksize, out_h, out_w))
for y in range(ksize):
y_max = y + stride * out_h
for x in range(ksize):
x_max = x + stride * out_w
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(n*out_h*out_w, -1)
return col
def main():
a = np.arange(1, 49).reshape(3, 4, 4)
input_img = a.reshape(1, 3, 4, 4)
col = im2col(input_img, 3, stride=1, pad=1)
print(col)
if __name__ == "__main__":
main()
卷積運算的im2col
include include include using namespace std typedef double dtype void kernel reshape dtype weight in,dtype weight out,int k,int c,int n n k k c k k c ...
caffe原始碼解析 im2col
im2col這個函式特別棒!為啥?因為它讓卷積變得簡單,他將卷積操作轉變為矩陣乘法,對比發現全連線層的實質就是矩陣乘法,所以這個函式使得卷積層的很多操作只需要仿照全連線層就可以了。下面主要介紹一下這兩個函式 im2col cpu,將輸入feature map轉變為矩陣 col2im cpu,將輸出的...
卷積神經網路重要的輔助函式im2col
toc 卷積神經網路重要的輔助函式 im2col 卷積神經網路裡的一重要步驟需要把多維的資料扁平化成一行一行組成矩陣,然後可以快速的跟濾波器權重和偏置進行矩陣點積運算。這個步驟由 im2col 函式實現。雖然大部分的框架都提供了這個函式,我認為非常值得去花點時間去弄明白這個函式是怎麼樣實現的,至少它...