網(wǎng)絡(luò):wincnn Winograd最小卷積算法生成器完全入門指南)
3行代碼加速卷積神經(jīng)網(wǎng)絡(luò)wincnn Winograd最小卷積算法生成器完全入門指南【免費下載鏈接】wincnnWinograd minimal convolution algorithm generator for convolutional neural networks.項目地址: https://gitcode.com/gh_mirrors/wi/wincnnwincnn 是一個輕量級 Python 開源模塊用于計算卷積神經(jīng)網(wǎng)絡(luò)CNN中的Winograd 最小卷積算法最小乘法變換矩陣。它基于 CVPR 2016 論文《Fast Algorithms for Convolutional Neural Networks》中的改進(jìn) Cook-Toom 算法能把卷積里的乘法次數(shù)降到理論上可證明的最少是學(xué)習(xí)卷積加速原理的絕佳工具 為什么需要 Winograd 卷積直接做 3×3 卷積每個輸出點要做9 次乘累加MAC而 Winograd F(4×4, 3×3) 算法每 4×4 塊只需 16 次乘法攤到每個輸出點僅2.25 次 MAC——乘法階段直接快了近 4 倍 ?方案每輸出點乘法次數(shù)特點直接卷積9 次實現(xiàn)簡單FFT 卷積約 1.5 次/輸入使用復(fù)數(shù)需更多工作內(nèi)存Winograd 最小算法1 次/輸入實數(shù)運(yùn)算專為小型卷積設(shè)計 Winograd 變換把輸入和濾波器搬到另一個空間在那里卷積變成逐元素相乘——這正是它比傅里葉變換更快、更省的原因。wincnn 是什么wincnn 生成的是一類稱為改進(jìn) Cook-Toom 算法的 Winograd 子集。它利用拉格朗日插值多項式把等價于卷積的多項式乘法轉(zhuǎn)換為插值點上的逐元素乘法。對于卷積神經(jīng)網(wǎng)絡(luò)中最常見的 3×3 卷積這種變換變大、乘法變少的權(quán)衡尤其劃算因為變換開銷比乘法階段低一個數(shù)量級。一鍵安裝wincnn 安裝步驟wincnn 已發(fā)布在 PyPI一條命令即可安裝pip install wincnn環(huán)境要求當(dāng)前版本 2.0.1Python ≥ 3.8SymPy ≥ 1.9符號計算引擎自動隨依賴安裝許可證Apache-2.0如果想閱讀源碼也可以克隆倉庫git clone https://gitcode.com/gh_mirrors/wi/wincnn3行代碼上手生成 Winograd 變換矩陣核心就 3 行代碼。以經(jīng)典的F(2,3)算法為例即 2×2 輸出、3×3 濾波器的 1D 版本import wincnn points (0, 1, -1) # 插值點需要 mr-2 23-2 3 個 wincnn.showCookToomFilter(points, 2, 3)運(yùn)行后會打印出三張變換矩陣AT、G、BT并自動完成符號級驗證——輸出嚴(yán)格等于標(biāo)準(zhǔn)卷積結(jié)果從數(shù)學(xué)上保證矩陣正確無誤 ?解讀輸出AT、G、BT 三大矩陣各干什么以 F(2,3) 為例輸出形如AT G BT ?1 1 1 0? ?1 0 0 ? ?1 0 -1 0? ?0 1 -1 1? ?1/2 1/2 1/2? ?0 1 1 0? ?1/2 -1/2 1/2? ?0 -1 1 0? ?0 0 1 ? ?0 -1 0 1?矩陣作用對象含義AT輸出逆數(shù)據(jù)變換從乘法空間還原結(jié)果G濾波器 g濾波器變換BT輸入數(shù)據(jù) d數(shù)據(jù)變換計算流程一句話概括先變換AT·G·BT再逐元素相乘最后還原即AT·((G·g)°(BT·d))。進(jìn)階用法F(m,r) 怎么選插值點規(guī)則很簡單F(m,r) 需要 mr?2 個插值點。F(2,3) → 3 個點如(0, 1, -1)F(4,3) → 5 個點如(0, 1, -1, 2, -2)F(6,3) → 7 個點可加入分?jǐn)?shù)點建議用sympy.Rational保持符號精確from sympy import Rational wincnn.showCookToomFilter( (0, 1, -1, 2, -2, Rational(1, 2), -Rational(1, 2)), 6, 3 )?? 注意用浮點數(shù)當(dāng)插值點會引入舍入誤差符號計算請使用有理數(shù)。線性卷積模式如果目標(biāo)是線性卷積而非 FIR 濾波只需把數(shù)據(jù)矩陣和逆變換矩陣交換并轉(zhuǎn)置即論文中的 Transposition Principlewincnn.showCookToomConvolution((0, 1, -1), 2, 3)常見問題速答FAQ 精選Q1變換階段那么多加減法總運(yùn)算量真的少嗎會少。設(shè) 3×3 卷積層輸入通道 C、輸出通道 K、空間尺寸 H×W直接算法需 HWCK×9 次乘累加而 F(4×4,3×3) 只需 HWCK×2.25 次三個變換階段分別是 O(HWC)、O(CK)、O(HWK)各比乘法階段低一個數(shù)量級只要層尺寸足夠大就可忽略不計。Q2支持 stride跨步卷積嗎支持。先把輸入和濾波器按偶/奇分量拆分把跨步卷積分解為若干個無跨步卷積之和每個都可套用 Winograd 算法2D 跨步 2 需 4 個無跨步卷積求和。Q3支持空洞卷積dilated嗎支持。膨脹卷積本質(zhì)是在抽取移位后的輸入上做普通卷積每種移位分量都能用 Winograd 計算。Q4變換矩陣會不會數(shù)值不穩(wěn)定Cook-Toom 算法的變換隨規(guī)模增大確實會不穩(wěn)定因此它特別適合 CNN 里的小尺寸 3×3 卷積更大的變換可參考項目附帶的補(bǔ)充材料。以上問題的完整解答見 FAQ.md。項目結(jié)構(gòu)一覽整個項目非常精簡核心代碼只有一個文件適合通讀學(xué)習(xí)文件說明wincnn.py全部核心源碼矩陣構(gòu)造、cookToomFilter、符號驗證函數(shù)等tests/test_wincnn.pypytest 測試套件覆蓋 F(2,3)/F(4,3)/F(6,3) 及驗證邏輯FAQ.mdWinograd 原理、運(yùn)算量分析、跨步/空洞卷積等深度問答2464-supp.pdfCVPR 2016 論文補(bǔ)充材料中國剩余定理版 Winograd 算法CHANGELOG.md版本記錄2.0.0 起僅支持 Python 3pyproject.toml項目元數(shù)據(jù)與依賴聲明源碼中的關(guān)鍵入口cookToomFilter(a, n, r, fractionsIn)—— 返回 AT、G、BT 矩陣元組fractionsIn參數(shù)可控制分母出現(xiàn)在哪個矩陣默認(rèn)放在 G 中filterVerify/convolutionVerify—— 符號驗證變換正確性showCookToomFilter/showCookToomConvolution—— 帶驗證的打印版本最易上手小結(jié)與延伸閱讀wincnn 用不到 300 行代碼把Winograd 最小卷積算法這一 CNN 加速的核心技術(shù)變成了可以交互式推導(dǎo)、驗證的玩具pip install wincnn一鍵安裝3 行代碼生成并驗證任意 F(m,r) 變換矩陣結(jié)合FAQ.md與2464-supp.pdf深入理解算法原理如果你在論文中使用了 wincnn建議引用項目提供的 BibTeX作者 Andrew Lavin2016Apache-2.0以支持開源生態(tài)的發(fā)展 【免費下載鏈接】wincnnWinograd minimal convolution algorithm generator for convolutional neural networks.項目地址: https://gitcode.com/gh_mirrors/wi/wincnn創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考