卷积实现基于 GEMM(矩阵乘法)或基于 1x1 内核意味着什么?

Joe*_*ack 5 tiling convolution matrix-multiplication conv-neural-network tensorflow

我一直试图理解(但惨败)图像(具有高度、宽度、通道)的卷积是如何在软件中实现的。

我听人们说他们的卷积实现是使用 GEMM 完成的,或者使用“直接卷积”完成的,或者使用 1x1 内核完成的。

我发现它非常令人困惑,无法理解到处都有描述的如此多不同的方式 - 我以为我将像pytorch conv2d这样的典型卷积理解为图像上的数学运算,但是当有人说他们做 conv2d 时,他们是什么意思使用以下方法之一?

  • 1x1 内核或 1x1 卷积(内核在这里是什么意思)
  • GEMM
  • “直接卷积”

对于使用 GEMM 进行卷积,我根据本文的理解是,每个输入图像和滤波器都使用im2colim2row操作转换为二维矩阵,然后将这两个矩阵简单地进行矩阵相乘。

3d 输入图像(高度、宽度、输入通道)转换为 2d 矩阵,4d 内核(输出通道、输入通道、内核高度、内核宽度)转换为 2d 矩阵。或者“基于 GEMM 的卷积实现”还有其他含义吗?如果这就是它的意思,那么它与“使用 1x1 内核进行卷积”有何不同?

Szy*_*zke 2

\n

1x1 内核或 1x1 卷积(内核在这里是什么意思)

\n
\n

你可以进行3x3卷积,这样你就有一个包含9在图像上滑动的元素的正方形(具有一些指定的步长、膨胀等)。在这种情况下,您有1x1卷积,因此内核是单个元素(stride=1也有膨胀但没有膨胀)。

\n

因此,您只需使用这个单值内核线性投影每个像素,而不是使用求和来滑动窗口。

\n

它是一种廉价的操作,被用作许多现代架构中使用的深度可分离卷积的一部分,以增加/减少通道数量。

\n

GEMM

\n

在您提供的文章中,顶部有:

\n
\n

[...] 称为 GEMM 的函数。它\xe2\x80\x99s BLAS(基本线性代数\n子程序)的一部分

\n
\n

因此,BLAS是一个规范,描述了一组低级代数运算以及它们如何在计算机上执行。

\n

现在,您有很多针对特定架构量身定制的 BLAS 实现,或者具有在某些上下文中可用的某些特征。例如,有针对 GPU 编写和优化的cuBLAS(并被 PyTorch 等深度学习“高级”库大量使用)或针对Intel CPU 的Intel MKL(您可以在网络上的任何地方阅读有关 BLAS 的更多信息)

\n

通常这些是用低级(Fortran、C、汇编、C++)语言编写的,以获得最大性能。

\n

GEMM 是通用矩阵乘法例程,用于实现全连接层和卷积,由各种 BLAS 实现提供。\n它与深度学习卷积本身无关,它是一个快速矩阵乘法例程(考虑到诸如缓存命中)

\n

直接卷积

\n

这是一种O(n^2)复杂的方法,因此您只需将项目相互相乘即可。有一种更有效的方法,即使用快速傅里叶变换O(n*log(n))此答案中提供的一些信息以及有关此部分的问题将更适合数学相关的堆栈交换。

\n