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