卷积计算转换为矩阵乘计算的几种场景和方法

这篇具有很好参考价值的文章主要介绍了卷积计算转换为矩阵乘计算的几种场景和方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文默认卷积的输入输出数据格式为NHWC。

为什么要把卷积转换为矩阵乘计算

有几个原因,1. 因为矩阵乘优化已经被研究了几十年,有丰富的研究成果,有性能很好的BLAS加速库可用。2. 矩阵乘优化比卷积更加简单,这主要是因为矩阵乘的参数比较少,主要是M, N, K三个参数,此外可以再加一个batch也就4个参数。而卷积输入有[N, Hi, Wi, Ci],filter有[Hf, Wf, Ci, Co],还有stride等其他参数。因此卷积的种类远远超过矩阵乘的种类,因此优化往往更加困难。

当然也不是一定要把卷积转换为矩阵乘,转换为矩阵乘只是卷积优化的一种手段之一。有些场景并不见得需要转换为矩阵乘,比如depthwise conv。

1x1卷积

卷积转换为矩阵乘法,推理引擎,深度学习编译器,卷积,矩阵乘,加速,算子卷积转换为矩阵乘法,推理引擎,深度学习编译器,卷积,矩阵乘,加速,算子

输入shape为[N, H, W, C] , filter为[Hf, Wf, Ci, Co]

FH, FW都为1,直接把输入shape reshape为[N, H * W, C], filter reshape为[[Hf * Wf * Ci, Co],然后进行矩阵乘得到[N, H * W, Co],再reshape为卷积的output shape即可。

kernel shape=strides卷积

卷积转换为矩阵乘法,推理引擎,深度学习编译器,卷积,矩阵乘,加速,算子

跟1x1卷积类似,这种卷积特点是每次卷积计算的输入数据块之间没有重叠,可以结合transpose简单处理为矩阵乘:

假设输入格式为[N, H, W, C],可以重新解释为[N, H1*H0, W1*W0, C], H0,W0即为kernel_shape大小,H1和W1为卷积输出的图像宽度,而filter的格式为[Hf, Wf, Ci, Co]

把卷积输入从[N, H1*H0, W1*W0, C] reshape和transpose转换为[N,H1*W1,H0*W0*C],然后与filter的[Hf*Wf*Ci, Co]做矩阵乘即可,得到输出为[N, Ho*Wo, Co],reshape为卷积输出的shape即可。

显式矩阵乘卷积(explicit GEMM convolution)

也叫做Im2Col或者im2row。这需要把卷积拆分为Im2Col和矩阵乘两个算子。

Im2Col思想非常简单,也就是把输入每次filter覆盖的FH*FW*Ci的那部分数据展开成为一行,作为矩阵乘的K,而filter的Co作为矩阵乘的N。

而输入数据整个Hi*Wi的图像宽度要计算Ho*Wo次卷积计算,因此作为矩阵乘的M部分,因此,输入数据经过Im2Col后变成[N, Ho*Wo, FH*FW*Ci]的tensor,而卷积的filter reshape为[FH*FW*Ci, Co]的tensor,两个做矩阵乘得到[N, Ho*Wo, Co],再Reshape一下即可作为卷积的输出。

这个方法的一个巨大的缺点是Im2Col之后的临时数据相比卷积的输入有巨大的提升,导致会占用大量的内存,特别是stride=1的情况。比如kernel_shape为3x3,stride=1,那么Im2Col后的张量数据为卷积输入的9倍。

隐式矩阵乘卷积(implicit GEMM convolution)

与Im2Col方法一样,但是不需要把卷积拆分为两个独立的Im2Col和矩阵乘两个部分,而是在矩阵乘计算的数据读取时,采用特定的数据读取方法,实现im2col。

implicit GEMM方法更偏好输入数据格式为NC1HWC0, 其中输入的C=C1*C0,C0通常为4,8,16等。

具体计算方法参考

卷积:从推理引擎优化和硬件优化角度理解 - 知乎

The Indirect Convolution Algorithm文章来源地址https://www.toymoban.com/news/detail-755860.html

卷积转换为矩阵乘法,推理引擎,深度学习编译器,卷积,矩阵乘,加速,算子

卷积转换为矩阵乘法,推理引擎,深度学习编译器,卷积,矩阵乘,加速,算子

上半部分为im2col的原理,下面为实际矩阵乘的时候,A矩阵每次读取若干行的同一列tile,而kernel读取若干列同一行的tile,并沿着k方向循环。

Winograd卷积

这种方法虽然只能处理几种比较特定kernel shape和stride的场景,但性能通常比Im2Col方法更好。Winograd通过input 和weight transform把卷积转换为矩阵乘计算,最后再通过output transform得到卷积结果,具体原理参考:

Winograd算法实现卷积原理_winograd卷积_Luchang-Li的博客-CSDN博客

winograd卷积实践_Luchang-Li的博客-CSDN博客

Ref

卷积:从推理引擎优化和硬件优化角度理解 - 知乎

OpenPPL 中的卷积优化技巧 - 知乎

The Indirect Convolution Algorithm

到了这里,关于卷积计算转换为矩阵乘计算的几种场景和方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最小二乘法的几种拟合函数

    目录 1.最小二乘法的原理和解决的问题 2.最小二乘法的公式解法 2.1  拟合h(x) = a * x 2.2 拟合 h(x) = a0 + a1*x 2.3拟合 h(x) = a0 + a1 *x + a3 * x^3  因为采用矩阵法来进行最小二乘法的函数拟合时,会出现系数矩阵的逆矩阵不存在的情况有一定的局限性,所以本篇对公式法进行简单说明

    2024年02月13日
    浏览(42)
  • 矩阵乘法实现卷积运算

            矩阵根据卷积核的大小进行,从左到右、从上到i 下 的移动,对应数据相乘再相加得到的数据为该区域的值。 ​​​​​​​ ​​​​​​​         原理:根据对于相乘相加的机制,发现通过对卷积核填零构成和输入矩阵大小一致的矩阵,然后展平拼接起来,

    2024年02月12日
    浏览(48)
  • Hive的几种排序方式、区别,使用场景

    Hive 支持两种主要的排序方式: ORDER BY 和 SORT BY 。除此之外,还有 DISTRIBUTE BY 和 CLUSTER BY 语句,它们也在排序和数据分布方面发挥作用。 1. ORDER BY ORDER BY 在 Hive 中用于对查询结果进行全局排序,确保结果集是全局有序的。但是,使用 ORDER BY 时,Hive 会将所有数据集中到一个

    2024年02月02日
    浏览(42)
  • Python通过函数名调用函数的几种场景

    除了执行系统命令外,我们有时还需要动态地执行一些python代码,有经验的朋友就会知道可以使用内置函数eval实现这一需求,如 eval(\\\"print(__file__)\\\") ,这还是比较简单的。 但如果要动态执行一个函数,讲的资料就会少一点,这次就要看这个需求该如何实现。 1 通过eval调用同一

    2024年04月13日
    浏览(36)
  • 状态转移矩阵计算方法及其离散化转换(含举例)

    一般地,对于一个线性定常系统,可以写成如下的柯西标准型形式 { x ˙ ( t ) = A ( t ) x ( t ) + B ( t ) u ( t ) y ( t ) = C ( t ) x ( t ) + D ( t ) u ( t ) begin{cases} dot x (t) = A(t) x(t) + B(t) u(t) \\\\ y(t) = C(t) x(t) + D(t) u(t) end{cases} { x ˙ ( t ) = A ( t ) x ( t ) + B ( t ) u ( t ) y ( t ) = C ( t ) x ( t ) + D ( t ) u

    2024年02月08日
    浏览(42)
  • 【MySQL】SQL索引失效的几种场景及优化

    MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。如果查询时没

    2024年02月13日
    浏览(41)
  • 蓝桥杯专题-试题版-【矩阵乘法】【连号区间数】【闰年判断】【时间转换】

    点击跳转专栏=Unity3D特效百例 点击跳转专栏=案例项目实战源码 点击跳转专栏=游戏脚本-辅助自动化 点击跳转专栏=Android控件全解手册 点击跳转专栏=Scratch编程案例 点击跳转=软考全系列 点击跳转=蓝桥系列 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、

    2024年02月11日
    浏览(50)
  • Java中常用的几种JSON格式的转换

    JSON在传输数据时,起到了特别大的作用,因此出现了各种各样五花八门的JSON转换第三方包,在这里做一个汇总,总结一些常用的 目录 com.alibaba.fastjson 常用的API Lsit---JSON JSON字符串---List 6种json转MAP json-lib(即net.sf.json ) 常用的API 1.把java 对象列表转换为json对象数组,并转为

    2024年02月04日
    浏览(80)
  • Redis 常见的几种数据结构说一下?各自的使用场景?

    介绍:string 数据结构是简单的 key-value 类型。 使用场景: 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。 介绍:list 即是 链表 使用场景:发布与订阅或者说消息队列、慢查询。 介绍:hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组

    2024年01月24日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包