winograd 卷積計算加速

論文:https://arxiv.org/pdf/1509.09308.pdf
論文PPT
參考騰訊開源的NNCN對winograd的實現,NCNN的開源地址

一維F(2,3)實現代碼:

# 論文地址 https://arxiv.org/abs/1509.09308
import numpy

x0 = 1
x1 = 2
x2 = 3
x3 = 4
x = numpy.matrix([[x0, x1, x2],[x1, x2, x3]])

w0 = 7
w1 = 8
w2 = 9
w = numpy.matrix([w0, w1, w2]).T
# 普通的x*w^T 矩陣乘法, 乘法的次數 2*3 = 6次,6次加法
y = x*w
print(y)


# 一維winograd, 4次乘法, 8次加法 ,跟w相關的加減乘除可以在初始化的時候
# 計算好,所以不佔用計算量
# µ(F(m, r)) = m + r - 1
m1 = (x0 - x2) * w0
m2 = (x1 + x2) * (w0 + w1 + w2)/2
m4 = (x1 - x3) * w2
m3 = (x2 - x1) * (w0 - w1 + w2) /2

y = numpy.matrix([m1+m2+m3, m2-m3-m4]).T
print(y)

擴展到2D
在這裏插入圖片描述
卷積核的元素拉成一列,將輸入信號每個滑動窗口中的元素拉成一行。注意圖中紅線劃分成的分塊矩陣,每個子矩陣中重複元素的位置與一維時相同,同時重複的子矩陣也和一維時相同。

圖片出自論文Sparse Winograd Convolutional neural networks on small-scale systolic arrays

在這裏插入圖片描述
linux x86上面的實現,主要的入口在convolution_x86.h文件

int Convolution_x86::create_pipeline(const Option& opt) {

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章