传统的卷积计算方式如上图所示(上半部分),是提取一个个与 Kernel 大小一致的图像区域,然后分别和 Kernel 进行计算得到输出结果。
传统的计算方法复杂且耗费时间。然后就提出了 im2col 的方法对 CNN 的计算过程进行了优化(上图中的下半部分)。简单说就是将输入图像转换成一个大矩阵,kernel 也转换成一个大矩阵,然后将这两个矩阵进行相乘计算就可以。这样做的优点是逻辑简单,实现也简单。缺点就是消耗内存。
再来一幅图,展示计算过程:
这两幅图均来自参考 [1] 的论文,更具体的内容可以查阅论文。
im2col 算法实现过程可以参考 [2] 中的代码,感兴趣的话也可以自己从头跟着实现 CNN 的前向传播和反向传播,收获会很大。
参考:
[1]. High Performance Convolutional Neural Networks for Document Processing
[2]. 手把手带你用Numpy实现CNN <零>
[3]. 在 Caffe 中如何计算卷积?