Ayu*_*sia 6 convolution neural-network correlation conv-neural-network deconvolution
我正在尝试实现卷积神经网络,我不明白为什么使用im2col操作更有效.它基本上存储要在不同列中乘以过滤器的输入.但为什么不应该直接使用循环来计算卷积而不是首先执行im2col?
Abh*_*kam 12
好吧,你正在以正确的方式思考,在Alex Net中,几乎95%的GPU时间和89%的CPU时间花费在卷积层和完全连接层上.
卷积层和完全连接层使用GEMM实现,代表通用矩阵到矩阵乘法.
所以基本上在GEMM中,我们通过使用一个函数将卷积运算转换为矩阵乘法运算,该函数im2col()以一种可以通过矩阵乘法实现卷积输出的方式排列数据.
现在,您可能有一个问题而不是直接进行元素明智的卷积,为什么我们在两者之间添加一个步骤来以不同的方式排列数据然后使用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/
| 归档时间: |
|
| 查看次数: |
3647 次 |
| 最近记录: |