卷积优化方法之Winograd

在卷积神经网络当中, 卷积运算是尤其是计算敏感的, 尤其是在端上设备中, 对于性能的要求更为苛刻。对于卷积优化的方法也有很多种,本文便针对近年来最常见的优化方法Winograd做一个简单总结。

相关资料

winograd算法最早是1980年由Terry Winograd提出的,当时并没有引起太大的轰动。在CVPR'16会议上,Lavin等人[1]提出了利用winogrd加速卷积运算,于是winograd加速卷积优化在算法圈里火了一把。网上较多的实现版本为andravin实现的py版本[2]。目前cudnn中计算卷积就使用了该方法。

[1] "Fast Algorithms for Convolutional Neural Networks" Lavin and Gray, CVPR 2016.
[2] https://github.com/andravin/wincnn

算法

在winograd算法下,对于一维卷积,当输出为m,卷积核长为r,要对应的乘法数量:
\[ u(F(m,r)) = m+r+1 \]
将一维卷积扩展到二维,如果输出维度为mxn,卷积核维度为rxs,则对应的乘法数量:
\[u(F(m * n,r * s)) = u(F(m,r)) * u(F(n,s)) = (m+r-1) * (n+s-1) \]

对一个矩阵大小为4 * 4的输入,卷积核大小为3 * 3,对应的输出为2 * 2,正常计算的情况下,滑动窗口或者im2col的计算方法的乘法次数为2*2*3*3 = 36次,而当使用winograd时,对应的乘法次数为$ u(F(2*2,3*3)) = (2+3-1) * (2+3-1)=16 $,乘法次数明显减少。

假设对应的一维输入为[d0,d1,d2,d3],对应的卷积为[g0,g1,g2],对应的输出为[m0,m1,m2],那么:
\[ F(2,3) = \begin{bmatrix}d0 & d1 & d2\\\\d1 & d2 &d3\end{bmatrix} \begin{bmatrix}g0\\\\g1\\\\g3\end{bmatrix} = \begin{bmatrix}m1+m2+m3\\\\m2-m3-m4\end{bmatrix}\]

其中:
\[ m1 = (d0-d1)g0 \]
\[m2 = 0.5(d1+d2)(g0+g1+g2)\]
\[m3 = 0.5(d2-d1)(g0-g1+g2)\]
\[m4 = (d1-d3)g2\]

这种计算方式需要2+3-1=4次乘法,4次加法。写成矩阵乘法的形式即为:
\[ Y = A^T \left[\left[Gg\right] \odot \left[B^Td\right]\right] \]

其中$ \odot $表示 element-wise multiplication. 对于F(2,3),以上矩阵分别为:

\[ B^{T}=\begin{bmatrix} 1 &0&-1 &0 \\ 0&1 &1 &0 \\ 0&-1 &1 &0 \\ 0& 1& 0& -1 \end{bmatrix} \]

\[ G=\begin{bmatrix} 1 & 0 & 0\\ 0.5& 0.5 &0.5 \\ 0.5& -0.5 &0.5 \\ 0& 0 &1 \end{bmatrix} \]

\[ A^{T}=\begin{bmatrix} 1 & 1 & 1 & 0\\ 0 & 1& -1 & -1 \end{bmatrix} \]

\[ g=\begin{bmatrix} g_{0} &g_{1} &g_{2} \end{bmatrix}^{T} \]

\[ d=\begin{bmatrix} d_{0} &d_{1} &d_{2}&d_{3} \end{bmatrix}^{T} \]

扩展为二维的形式即为:

\[ Y = A^T \left[\left[GgG^T\right] \odot \left[B^TdB\right]\right]A \]

注意

  1. 以上描述的 Winograd 算法只展示了在二维的图像 (更确切的说是 tile) 上的过程, 具体在 ConvNet 的多个 channel 的情况, 直接逐个 channel 按照上述方法计算完然后相加即可;
  2. 按照 1. 的思路, 在计算多个 channel 的时候, 仍然有可减少计算次数的地方.
  3. 按照 2. 的思路, Winograd 在目前使用越来越多的 depthwise conv 中其优势不明显了.
  4. 在 tile 较大的时候, Winograd 方法不适用, 因为, 在做 inverse transform 的时候的计算开销抵消了 Winograd 带来的计算节省.
    Winograd 会产生误差

[winograd]winograd算法在卷积中的应用的更多相关文章

  1. 任意半径局部直方图类算法在PC中快速实现的框架。

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

  2. 06 - 从Algorithm 算法派生类中删除ExecuteInformation() 和ExecuteData() VTK 6.0 迁移

    在先前的vtk中,如vtkPointSetAlgorithm 等算法派生类中定义了虚方法:ExecuteInformation() 和 ExecuteData().这些方法的定义是为了平稳的从VTK4 ...

  3. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 293 ...

  4. KMP算法 --- 在文本中寻找目标字符串

    KMP算法 --- 在文本中寻找目标字符串 很多时候,为了在大文本中寻找到自己需要的内容,往往需要搜索关键字.这其中就牵涉到字符串匹配的算法,通过接受文本和关键词参数来返回关键词在文本出现的位置.一般 ...

  5. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  6. AES加解密算法在Android中的应用及Android4.2以上版本调用问题

     from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...

  7. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  8. 利用“海底捞算法”在MongoDB中优雅地存储一棵树

    目前常见的树形结构数据库存储方案有以下四种,但是在处理无限深度.海量数据的树结构时,都存在一些问题: 1)Adjacency List(邻接表):每个节点仅记录父节点主键.优点是简单,缺点是访问子树需 ...

  9. 图像处理之优化---任意半径局部直方图类算法在PC中快速实现的框架

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

随机推荐

  1. mac与windows共享键盘鼠标(synergy)

    桌面上有两台电脑, 一台mac一台windows, 由于桌面空间紧张, 放两套键盘鼠标有点浪费空间, 如果能让mac和windows共享键盘鼠标就好了, 经过一番搜寻, 找到了一款名为synergy的 ...

  2. 野路子码农系列(3)plotly可视化的简单套路

    又双叒叕要跟客户汇报了,图都准备好了吗?matplotlib出图嫌丑?那用用plotly吧,让你的图看上去经费爆炸~ P1 起因 第一次接触plotly这个库是在我们做的一个列车信号数据挖掘的项目里, ...

  3. [源码分析]AbstractStringBuilder

    [源码分析]AbstractStringBuilder Java中, AbstractStringBuilder是 StringBuilder 和 StringBuffer 的父类. 所以了解Stri ...

  4. 静态网站创建工具Docusaurus

    地址:https://docusaurus.io/docs/zh-CN/installation 安装 Docusaurus

  5. 前端面试题整理—React篇

    1.说一下React React是Facebook 开发的前端JavaScript库 V层:react并不是完整的MVC框架,而是MVC中的C层 虚拟DOM:react引入虚拟DOM,每当数据变化通过 ...

  6. (五)聊一聊深Copy与浅Copy

    一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可 ...

  7. Linux-Shell编程之判断文件类型

    前言 如需使用本博文源码或者撰写文章,请注明博文来源:https://www.cnblogs.com/johnnyzen/p/10534386.html,劳动所得,侵权必究. 题目 設計一個shell ...

  8. centos7.2下部署 python3

    安装Python3 1.环境准备 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...

  9. mysql定时器设置开机默认自启动

    1).查询mysql安装位置:show variables like "%char%"; 2).查询定时器是否开启: -查询定时器状态:show VARIABLES LIKE '% ...

  10. 【摘】Oracle 11g EM安全证书问题无法访问的解决办法

    本文摘自:http://www.cnblogs.com/wenlong/p/5255673.html  感谢攻城师10946无私分享 OS: Windows7 x64 Oracle: 11g R2 x ...