【问题标题】:What does it mean to say convolution implementation is based on GEMM (matrix multiply) or it is based on 1x1 kernels?说卷积实现是基于 GEMM(矩阵乘法)还是基于 1x1 内核是什么意思?
【发布时间】:2021-02-06 21:38:22
【问题描述】:

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

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

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

  • 1x1 内核或 1x1 卷积(这里的内核是什么意思)
  • 创业板
  • “直接卷积”

对于使用 GEMM 进行卷积,我基于this paper 的理解是,每个输入图像和过滤器都使用im2colim2row 操作转换为二维矩阵,然后这两个只是矩阵相乘.

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

【问题讨论】:

    标签: tensorflow conv-neural-network matrix-multiplication convolution tiling


    【解决方案1】:

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

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

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

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

    创业板

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

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

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

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

    通常使用低级(Fortran、C、Assembly、C++)语言编写以获得最佳性能。

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

    直接卷积

    这是一种O(n^2) 复杂性的方法,因此您只需将项目相乘即可。使用快速傅立叶变换的更有效方法是O(n*log(n))。一些信息presented in this answer 和有关这部分的问题将更适合与数学相关的堆栈交换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2021-12-25
      • 2017-03-13
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多