neural-network - 如何在卷积网络中使用 im2col 操作更有效?

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

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

最佳答案

  • 好吧,你的想法是正确的,在 Alex Net 中,几乎 95% 的 GPU 时间和 89% 的 CPU 时间都花在了卷积层和全连接层上。
  • 卷积层和全连接层是使用 GEMM 实现的,GEMM 代表 General Matrix to Matrix Multiplication。
  • 所以基本上在 GEMM 中,我们通过使用一个名为 im2col() 的函数将卷积运算转换为矩阵乘法运算。它以一种可以通过矩阵乘法实现卷积输出的方式排列数据。
  • 现在,您可能会有一个问题,而不是直接进行元素智能卷积,为什么我们要在两者之间添加一个步骤以不同的方式排列数据,然后使用 GEMM。
  • 答案是,科学程序员花了数十年时间优化代码以执行大型矩阵到矩阵的乘法,并且非常规则的内存访问模式带来的好处超过了任何其他损失。
    我们在 cuBLAS 库中有一个优化的 CUDA GEMM API,Intel 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/
  • 关于neural-network - 如何在卷积网络中使用 im2col 操作更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213531/

    相关文章:

    machine-learning - 如何在虚拟机中运行堆喷射分析

    python - 从头开始构建的简单神经网络不是学习

    neural-network - Caffe 中的多个精度层

    php - 如何计算与给定序列 (A) 具有给定相关性的随机值序列 (B)

    python - 即使经过数小时的训练,神经网络(从头开始,没有 tensorflow )也会给出错误的答案

    c++ - 随着计算的进行,我的 C++ 程序变慢了

    python - Pytorch CNN错误: Expected input batch_size (4) to match target batch_size (64)

    conv-neural-network - 卷积图输出维度

    r - 绘制因子(分类数据)的等价相关矩阵?和混合类型?

    r - cor(mydata) 中的错误 : 'x' must be numeric