- 函数原型:void im2col_cpu(const Dtype* data_im, const int channels,const int height, const int width, const int kernel_h, const int kernel_w,const int pad_h, const int pad_w,const int stride_h, const int stride_w,const int dilation_h, const int dilation_w,Dtype* data_col)
- 输入:
- data_im:输入data,当前layer的input blob data(也称为“bottom blob”);一般是float*类型。
- Channels:当前data的input blob data(也称为“bottom blob”)的channel个数;
- Height:当前data的input blob data(也称为“bottom blob”)的rows;
- Width:当前data的input blob data(也称为“bottom blob”)的cols;
- kernel_h:当前layer的卷积核的rows;
- kernel_w:当前layer的卷积核的cols;
- pad_h:当前layer的高度边缘要填充的个数,也就是要填充的rows的个数;
- pad_w:当前layer的宽度边缘要填充的个数,也就是要填充的cols的个数;
- stride_h:卷积时,窗口滑动的rows方向的步长;
- stride_w:卷积时,窗口滑动的cols方向的步长;
- dilation_h:卷积核rows方向的缩放系数,默认为1;一般不做修改或配置,下面的计算不考虑该因子;
- dilation_w:卷积核的cols方向的缩放系数,默认为1;一般不做修改或配置,下面的计算不考虑该因子;
- 输出:
- data_col:按列排列的数据;输出的大小如下:
其中,
- 标识输出矩阵的大小;
- 标识输入的数据的channels数,输出的数据channels数保持不变;
- 标识卷积核的高度;
- 标识卷积核的宽度;
- 标识卷积操作后的高度;
,其中,标识输入data的height;标识卷积层padding参数的高度;标识卷积核的高度;标识卷积的高度的步长;
- 标识卷积操作后的宽度;
,其中,标识输入data的width;标识卷积层padding参数的宽度;标识卷积核的宽度;标识卷积的宽度的步长;
- 返回值:无
- 处理:
展开的数据以如下的方式存储:
,
其中,H都是*大小的向量,和是卷积核的高度和宽度;
扩展变换方式很简单,其实就是把卷积核滑动时,卷积核覆盖的元素作为展开矩阵的列向量就好了。
设输入的矩阵为{1,3,120,120},卷积核的参数为==3、==3和==1。
则展开的输出矩阵中= =39;
生成的H向量,举例如下:
,其中头为0,是因为padding的y;然后每有一个0,是因为padding的x。该矩阵包含与卷积核中进行线性相乘的所有元素。
,因为滑动窗口y-轴方向已经下滑了一行,因此,不再受padding-y的影响;该矩阵包含与卷积核中进行线性相乘的所有元素。
依次类推即可。