我正在尝试实现卷积神经网络,但我不明白为什么使用im2col操作更有效。它基本上存储要在不同列中乘以过滤器的输入。但为什么不应该直接使用循环来计算卷积而不是先执行im2col?
答案 0 :(得分:9)
嗯,你正在以正确的方式思考,在Alex Net中,几乎95%的GPU时间和89%的CPU时间花费在卷积层和完全连接层上。
卷积层和完全连接层使用GEMM实现,代表通用矩阵到矩阵乘法。
所以基本上在GEMM中,我们使用一个名为im2col()
的函数将卷积运算转换为矩阵乘法运算,该函数以一种可以通过矩阵乘法实现卷积输出的方式排列数据。 / p>
现在,您可能有一个问题,而不是直接进行元素明智的卷积,为什么我们在两者之间添加一个步骤来以不同的方式排列数据,然后使用GEMM。
对此的答案是,科学程序员花了数十年时间优化代码来执行大型矩阵到矩阵乘法,并且非常规则的内存访问模式带来的好处超过任何其他损失。 我们在cuBLAS库中有一个优化的CUDA GEMM API,英特尔MKL具有优化的CPU GEMM,而ciBLAS的GEMM API可用于支持OpenCL的设备。
元素智能卷积由于其中涉及的不规则内存访问而表现不佳。
反过来,Im2col()
以矩阵乘法的内存访问规则的方式排列数据。
Im2col()
函数虽然增加了大量的数据冗余,但使用Gemm的性能优势超过了这种数据冗余。
这就是在神经网络中使用Im2col()
操作的原因。
此链接说明了Im2col()
如何为GEMM安排数据:
https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/