如何在卷积网中使用im2col操作更有效率?

时间:2017-09-14 07:55:31

标签: neural-network conv-neural-network correlation convolution deconvolution

我正在尝试实现卷积神经网络,但我不明白为什么使用im2col操作更有效。它基本上存储要在不同列中乘以过滤器的输入。但为什么不应该直接使用循环来计算卷积而不是先执行im2col?

1 个答案:

答案 0 :(得分:9)

  1. 嗯,你正在以正确的方式思考,在Alex Net中,几乎95%的GPU时间和89%的CPU时间花费在卷积层和完全连接层上。

  2. 卷积层和完全连接层使用GEMM实现,代表通用矩阵到矩阵乘法。

  3. 所以基本上在GEMM中,我们使用一个名为im2col()的函数将卷积运算转换为矩阵乘法运算,该函数以一种可以通过矩阵乘法实现卷积输出的方式排列数据。 / p>

  4. 现在,您可能有一个问题,而不是直接进行元素明智的卷积,为什么我们在两者之间添加一个步骤来以不同的方式排列数据,然后使用GEMM。

  5. 对此的答案是,科学程序员花了数十年时间优化代码来执行大型矩阵到矩阵乘法,并且非常规则的内存访问模式带来的好处超过任何其他损失。 我们在cuBLAS库中有一个优化的CUDA GEMM API,英特尔MKL具有优化的CPU GEMM,而ciBLAS的GEMM API可用于支持OpenCL的设备。

  6. 元素智能卷积由于其中涉及的不规则内存访问而表现不佳。

  7. 反过来,Im2col()以矩阵乘法的内存访问规则的方式排列数据。

  8. Im2col()函数虽然增加了大量的数据冗余,但使用Gemm的性能优势超过了这种数据冗余。

  9. 这就是在神经网络中使用Im2col()操作的原因。

  10. 此链接说明了Im2col()如何为GEMM安排数据: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/