論文: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) {
}