<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          收藏 | 卷積神經(jīng)網(wǎng)絡(luò) C++ 從零開始實(shí)現(xiàn)

          共 2507字,需瀏覽 6分鐘

           ·

          2022-03-23 10:44

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          僅作學(xué)術(shù)分享,不代表本公眾號立場,侵權(quán)聯(lián)系刪除
          轉(zhuǎn)載于:作者丨山與水你和我@知乎

          目前搭建卷積神經(jīng)網(wǎng)絡(luò)(CNN)一般直接用 Pytorch、Tensorflow 等深度學(xué)習(xí)框架,很簡單。但如果是手寫反向傳播過程,情況就比 BP 網(wǎng)絡(luò)復(fù)雜多了,因?yàn)椴粌H僅是矩陣相乘。

          目標(biāo)是,從零開始實(shí)現(xiàn) CNN。

          剛開始,本人搜網(wǎng)上的卷積神經(jīng)網(wǎng)絡(luò)反向推導(dǎo)的相關(guān)博客,發(fā)現(xiàn)了幾個(gè)問題:

          • 公式看的實(shí)在腦袋疼,不好理解,一大堆的??,變量還特別多,最后自己實(shí)現(xiàn)才發(fā)現(xiàn),卷積的時(shí)間復(fù)雜度還挺高,好幾層 for;
          • 卷積層的反向傳播,從輸出回傳的梯度??,求輸入的梯度??存在一個(gè)權(quán)重矩陣 rot180 的操作,而且還需要對梯度??填充 padding 的問題,見卷積神經(jīng)網(wǎng)絡(luò)(CNN)反向傳播算法 - 劉建平Pinard - 博客園:https://www.cnblogs.com/pinard/p/6494810.html(劉建平老師的博客強(qiáng)烈推薦),如下
          例子

          這個(gè)例子沒有錯(cuò),但只是一種特殊情況,如果步長 stride 大于 1,就不僅僅是外圍填充 0 了,還需要對??數(shù) 據(jù)之間也做填充 0,具體過程和轉(zhuǎn)置卷積的前向過程一模一樣。但即使真的可以這樣做,寫對了,做 padding 消耗也是很大的,假設(shè) stride = 2,則大約有??的計(jì)算都是跟 0 做乘法,是無意義的計(jì)算,個(gè)人以為不可取,個(gè)人改用了其他思路。

          后續(xù)一步步實(shí)現(xiàn),遇到的也不僅僅這兩個(gè)問題,一一克服,整個(gè)過程的關(guān)鍵就是——硬著頭皮,老老實(shí)實(shí)寫,別看公式

          這也是本人一直以來的夙愿,終于實(shí)現(xiàn)。整個(gè)過程中,又回顧了一些 C++ 的坑與優(yōu)化技巧,對卷積的前向以及后向過程和如何搭建深度學(xué)習(xí)流程有了更清晰的認(rèn)識,收獲頗豐。

          提綱
          ?

          卷積神經(jīng)網(wǎng)絡(luò)(一)tensor 定義:https://zhuanlan.zhihu.com/p/463673933

          卷積神經(jīng)網(wǎng)絡(luò)(二)從圖像到 tensor:https://zhuanlan.zhihu.com/p/468161119

          卷積神經(jīng)網(wǎng)絡(luò)(三)ReLU 層:https://zhuanlan.zhihu.com/p/468161821

          卷積神經(jīng)網(wǎng)絡(luò)(四)池化層:https://zhuanlan.zhihu.com/p/468163843

          卷積神經(jīng)網(wǎng)絡(luò)(五)卷積層:https://zhuanlan.zhihu.com/p/468164733

          卷積神經(jīng)網(wǎng)絡(luò)(六)Linear 線性層:https://zhuanlan.zhihu.com/p/468165951

          卷積神經(jīng)網(wǎng)絡(luò)(七)搭建 CNN 網(wǎng)絡(luò)結(jié)構(gòu):https://zhuanlan.zhihu.com/p/469475509

          卷積神經(jīng)網(wǎng)絡(luò)(八)訓(xùn)練 CNN:https://zhuanlan.zhihu.com/p/468177334

          代碼

          https://github.com/hermosayhl/CNN

          環(huán)境

          1. Windows 11
          2. >=C++17(TDM GCC 10.3.0:https://jmeubank.github.io/tdm-gcc/download/
          3. OpenCV 4.5.2
          4. 構(gòu)建工具 Cmake

          數(shù)據(jù)集

          采用的小型圖像分類數(shù)據(jù)集,從 cat-dog-panda:https://www.kaggle.com/ashishsaxena2209/animal-image-datasetdog-cat-and-panda 數(shù)據(jù)集剔除 cat(cat 和 dog 相對比較難),然后又從 CUB-200 bird:http://www.vision.caltech.edu/visipedia/CUB-200.html 數(shù)據(jù)集中隨機(jī)抽出 1000 張鳥類圖像,湊成三分類的小型數(shù)據(jù)集。train : valid : test 比例 8:1:1。

          網(wǎng)絡(luò)模型

          本人也不知道是什么網(wǎng)絡(luò)結(jié)構(gòu),隨便設(shè)計(jì)的(能跑就行),只有卷積層、最大池化層、ReLU 層、Softmax 層、Linear 全連接層,比 AlexNet 要簡單,接受的輸入大小是 224x224x3,輸出 3 個(gè)值,經(jīng)過 softmax 得到概率,損失函數(shù)是交叉熵,優(yōu)化方法是 SGD 隨機(jī)梯度下降,最終在測試集上大概可以達(dá)到 0.91 的準(zhǔn)確率,不高,但至少跑通了。

          后面雖然也寫了 BatchNorm 層、DropOut 層,訓(xùn)練是沒問題的,這倆的前向和反向傳播都對,但 valid 和 test 階段,過擬合了。。。按照網(wǎng)上諸多說法嘗試,但都失敗了,遺留問題。

          后面還嘗試了 Grad-CAM 可視化神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)跟論文里的細(xì)節(jié)些許不一樣,例子如下,分類為 bird

          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 70
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  性,国产三级视频 | 蜜桃视频成人网站入口 | 秋霞福利 | 91精品一区二区 | 手机在线免费片片AAA |