Here, I am the Caffe in the im2col of the parsing process directly pulled out, using C + + output, easy to understand. The code is as follows:
1#include <iostream>2 3 using namespacestd;4 5 BOOLIs_a_ge_zero_and_a_lt_b (intAintb)6 {7 if(a>=0&& a <b)return true;8 return false;9 }Ten One voidIM2COL_CPU (Const float* Data_im,Const intchannels, A Const intHeightConst intWidthConst intKernel_h,Const intKernel_w, - Const intPad_h,Const intPad_w, - Const intStride_h,Const intStride_w, the Const intDilation_h,Const intDilation_w, - float*Data_col) { - Const intOutput_h = (height +2* Pad_h- -(Dilation_h * (Kernel_h-1) +1))/Stride_h +1; + Const intOutput_w = (width +2* Pad_w- -(Dilation_w * (Kernel_w-1) +1))/Stride_w +1; + Const intchannel_size = Height *width; A for(intChannel = channels; channel--; Data_im + =channel_size) { at for(intKernel_row =0; Kernel_row < Kernel_h; kernel_row++) { - for(intKernel_col =0; Kernel_col < Kernel_w; kernel_col++) { - intInput_row =-pad_h + Kernel_row *Dilation_h; - for(intOutput_rows = Output_h; Output_rows; output_rows--) { - if(!is_a_ge_zero_and_a_lt_b (input_row, height)) { - for(intOutput_cols = Output_w; Output_cols; output_cols--) { in* (data_col++) =0; - } to}Else { + intInput_col =-pad_w + Kernel_col *Dilation_w; - for(intOutput_col = Output_w; Output_col; output_col--) { the if(Is_a_ge_zero_and_a_lt_b (input_col, width)) { ** (data_col++) = Data_im[input_row * Width +Input_col]; $}Else {Panax Notoginseng* (data_col++) =0; - } theInput_col + =Stride_w; + } A } theInput_row + =Stride_h; + } - } $ } $ } - } - the - intMain ()Wuyi { the float*Data_im; - intheight=5; Wu intWidth=5; - intKernel_h=3; About intkernel_w=3; $ intPad_h=1; - intpad_w=1; - intStride_h=1; - intstride_w=1; A intDilation_h=1; + intdilation_w=1; the float*Data_col; - intChannels =3; $ Const intOutput_h = (height +2* Pad_h- the(Dilation_h * (Kernel_h-1) +1))/Stride_h +1; the Const intOutput_w = (width +2* Pad_w- the(Dilation_w * (Kernel_w-1) +1))/Stride_w +1; theData_im =New float[channels*height*width]; -Data_col =New float[channels*output_h*output_w*kernel_h*Kernel_w]; in the //init input image Data the for(intm=0; m<channels;++m) About { the for(intI=0; ii) the { the for(intj=0; j<width;++j) + { -DATA_IM[M*WIDTH*HEIGHT+I*WIDTH+J] = m*width*height+ I*width +J; thecout <<data_im[m*width*height+i*width+j] <<' ';Bayi } thecout <<Endl; the } - } - the im2col_cpu (data_im, channels, the height,width, Kernel_h, Kernel_w, the Pad_h, Pad_w, the Stride_h, Stride_w, - Dilation_h, Dilation_w, the data_col); thecout <<channels<<Endl; thecout <<output_h<<Endl;94cout <<output_w<<Endl; thecout <<kernel_h<<Endl; thecout <<kernel_w<<Endl; thecout <<"Error"<<Endl;98 for(intI=0; i<kernel_w*kernel_h*channels;++i) About { - for(intj=0; j<output_w*output_h;++j)101 {102cout <<data_col[i*output_w*output_h+j]<<' ';103 }104cout <<Endl; the }106 107 return 0;108}
Multi-channel convolution image others have given a lot of, we can search for the basic is from a piece. Here is an understanding of my own process, and the output of the program is exactly the same
Analysis of the realization of Im2col in Caffe