Winograd大白话

先声明一些定义
输入:数量N,通道C,高H,宽W
卷积核:通道C,高R,宽S
F(m × n,r × s): 输出m x n的图,卷积核大小r x s

一维的情况比较好懂。就是论文里写的F(2, 3),就是2次[1 x 3]的卷积,输出2个结果。

这里解释一下 二维的例如F(6 x 6, 3 x 3)
有6 x 6次[3 x 3]的卷积。
因为卷积核大小为3 x 3,为了得到6 x 6的输出,其实会输入一张8 x 8的图。如果是边界的话,会通过padding一层0来保证信息没有丢失。

公式6还是很好理解,但是很粗暴地给出了公式8,我也不知道怎么来的(估计是线性代数的一些知识,一维变二维什么的),就当他是对的好了。。

所以有了这个公式,我们就可以在知道一个8x8的图和3x3卷积的情况下算出它们卷积之后结果。相比传统方法,这样省去了im2col的过程,且理论上乘法次数更少,实现起来也就若干次矩阵乘法。

然而,实际实现中,是不能直接用矩阵乘法来实现的,因为矩阵里面很多0,做了无效的操作,反而会更慢。所以我们需要用提取公因式的方法来计算最后的结果。在github上找个wincnn的计算器,然后手动计算公因式(微笑)。

以G x g x Gt为例,实现一个函数Iwt(g) = G x g,
则G x g x Gt = Iwt((Iwt(g))t) = G x (G x g)t = G x (gt x Gt) = G x gt x Gt,
然后你会奇怪这里本来要求G x g x Gt,结果算的G x gt x Gt,不过没事,因为其他几个函数也是做的转置,最后就会转置回去。

在外部代码的实现中,每次取8x8的框,移动步长6x6,把输出的6x6 Scatter到output_data里就可以了。注意一下处理边界。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值