IDL im2col和col2im函数示例
本人在卷积神经网络的卷积层、池化层的im2col和反向传播的col2im方法上有所启发,考虑到IDL本身并没有im2col和col2im函数,于是编写了相关的IDL函数。话不多说,直接上代码!
1. im2col
;input_data: 由(高, 长)的2维数组构成的输入数据
;filter_h: 滤波器的高
;filter_w: 滤波器的长
;stride=stride: 步幅
;pad=pad: 填充的个数(默认填充值为0)
;return 二维数组
FUNCTION fun_im2col, input_data, filter_h, filter_w, stride=stride, pad=pad
param_number = N_PARAMS() ;返回非关键字参数的个数(即位置参数的个数)
IF param_number EQ 3 THEN BEGIN
arr_info = SIZE( input_data )
w = arr_info[1] ;w和h为矩阵的长(列)和高(行)
h = arr_info[2]
;out_h和out_w分别为输出矩阵的长和高
out_h = FLOOR( (h + 2*pad - filter_h) / stride ) + 1
out_w = FLOOR( (w + 2*pad - filter_w) / stride ) + 1
img = REPLICATE(0.0, w + 2 * pad, h + 2 * pad)
end_w = w - 1 + pad
end_h = h - 1 + pad
img[pad:end_w, pad:end_h] = input_data
column = FLTARR(filter_w, filter_h, out_w, out_h)
FOR x = 0, filter_w-1 DO BEGIN
x_max = x + stride*out_w
FOR y = 0, filter_h-1 DO BEGIN
y_max = y + stride*out_h
; if y_max ge h + 2 * pad or x_max ge w + 2