<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>

          深度學習項目代碼閱讀建議

          共 3008字,需瀏覽 7分鐘

           ·

          2020-12-23 01:47

          深度學習100問


          Author:louwill

          Machine Learning Lab

          ? ? ?

          ???? 猶豫很久要不要把讀代碼這個事情專門挑出來寫成一篇推文。畢竟讀代碼嘛,大家可能都會讀。而且筆者個人讀的和寫的代碼量也并不足以到指導大家讀代碼的程度。但筆者還是決定大膽地寫一點:就當是給自己設立今后讀代碼的標準,也將一些之前未能踐行的方法給寫下來供大家參考。不當之處,還請各位指教。

          ???? 搞深度學習的人,兩大必備日常除了讀論文之外就是讀代碼。讀論文筆者在第4問的時候講了閱讀路線,但如何讀用什么技巧讀每個人都有不同的見解,這里不多說。讀代碼跟讀論文、讀書多少有相似的地方,畢竟都是讀的性質。但話又說回來,讀代碼又跟讀paper讀書大有不同,代碼是一種將論文中的模型和算法進行實現的過程,是一種需要你思維時刻在線的過程。又因為我們讀的是深度學習項目代碼,不是像Linux內核代碼那樣的鴻篇巨制,所以在代碼性質上多少又有些不同。

          ???? 筆者這里說的一份深度學習項目代碼,小到幾百行的測試demo,大到成千萬行的開源項目,讀起來方法肯定各有不同。如下圖Mask R-CNN項目代碼和PyTorch源碼的對比:

          ???? 可以看到,Mask R-CNN作為一個經典的實例分割框架,其代碼量可以說是中規(guī)中矩,3k的代碼量在我們讀完論文后集中花幾天時間差不多可以過一遍。但PyTorch的源碼對大多數人而言就不那么友善了,750k的代碼量,而且底層的C++代碼占到整個項目中的一半之多,作為深度學習研究而言,堪稱巨無霸級別了。這樣的代碼量,就像初學者拿到一本PRML,往往投入巨大精力后不了了之。所以,對于這兩種類型的項目代碼,閱讀方法肯定會有所區(qū)別。

          ???? 因為我們讀代碼的目的、場景和對象不盡相同,下面筆者從三個方面來和大家探討如何閱讀一份深度學習項目代碼。

          ???? 首先讀代碼的一些通用方法。這一點而言不局限于深度學習項目代碼,任何項目、任何語言的代碼閱讀都適用。我們日常讀代碼無非是兩個工具,一是將代碼下載到本地,打開IDLE,在IDLE里安靜的閱讀:

          ???? 第二個就是直接在GitHub的web端直接閱讀,但GitHub沒有像編輯器那樣在左側設置閱讀目錄,每次進入一個代碼文件就必須退出來才能進入另一個文件,用戶體驗極差。當然了,這都不是事。chrome給我們提供了Octotree這樣的輔助閱讀插件,直接在chrome擴展程序里搜索安裝即可。

          ???? 安裝后我們就可以直接在web端就有IDLE讀代碼的體驗:

          ???? 可以看到在頁面左側有一個類似IDLE的目錄欄,大大方便了我們查看和閱讀項目代碼。這是通用方法中的工具層面,我們再來看一些基本的閱讀規(guī)矩。有了IDLE和Octotree工具,我們第一點一定是仔細看代碼目錄,對整個項目代碼結構和分布有一個整體的認識,對于深度學習而言通常目錄中各個模塊相對比較固定,比如是models目錄下放著模型搭建和訓練的代碼,conifg目錄下放著模型的一些配置文件,data目錄下放著項目所使用的數據信息等等。如下面語義分割項目的目錄結構:

          ???? 對深度學習項目代碼的結構熟絡之后,讀的多了自然就會輕車熟路起來,后面閱讀效率也就提高了。
          ?????
          ???? 通用方法的第二個是快速找到readme文檔。通常來說,根目錄下的readme文檔包含了這份代碼的使用方法,里面有可以讓你快速了解這個項目的關鍵信息。一般來說,開源項目的readme里作者都會寫明如何使用代碼和進行部署。下圖是DenseNet的readme文檔:

          ???? 對于大型項目,可能每一個子目錄下都有readme文檔,這都是我們需要仔細閱讀的部分,作者把關鍵信息都放里面了。所以不管這樣,第一時間讀找到readme進行閱讀是你了解該項目的必備步驟和通用方法。
          ????
          ???? 第三個通用方法就是具體如何讀的問題。就是我們得確定一個閱讀主線。這一點是針對于深度學習項目代碼的通用方法,對于一個深度學習項目,我們一般想要了解的最關鍵點無非就是數據、模型和如何訓練等幾個方面。如果你想快速看看這個開源項目的測試效果,直接讀readme看使用方法即可。如果這個項目作者提出了一個新的模型框架,比如說bert,你想了解它的模型框架細節(jié),直接定位到models目錄下的帶有model字眼的.py文件開始讀。或者是你想看這個項目是如何訓練的,都用了哪些訓練的tricks,它的參數初始化是如何做的,batchsize用的多大,訓練過程中學習率如何調整的等等,那么話不多說,直接定位到帶train的.py文件即可。如下圖faster-rcnn的3個訓練文件。

          ???? 根據目的不管是model還是train的主線,在閱讀過程中一定會涉及到其他分支,比如說數據和配置等其他分支線。在主線閱讀過程中不斷完善對分支的理解,久而久之,一個完整的項目就會被你消化了。

          ???? 以上說的是深度學習項目代碼閱讀的一些通用方法。下面再具體講兩個場景的代碼閱讀。畢竟大家做事講究目的性,往往帶有較強的目的性去做某事效率一般會特別高。

          ???? 第一個場景是在大家做研究做項目時遇到問題時。不知道這個問題如何解決,直接谷歌又找不到好合適的方法的時候。這時候我們可能會寄希望于在GitHub上搜羅一番。比如說我們想要知道對于極度數據不平衡時如何給損失函數加權重的方法,再比如對于多標簽問題進行模型預測時如何找到最佳分類閾值等等。這些問題都是我們在做實際項目時都可能會碰上的,在這種情況下若是能在GitHub上找到類似場景的處理方法,相信你會瞬間來了精神。

          ????下述基于keras的CNN多標簽分類項目對于多標簽分類閾值尋優(yōu)使用了matthews_corrcoef來確定最佳分類預測閾值。至于什么是matthews_corrcoef,這些都是你在解決問題過程中需要學習和吸收的地方。總之,帶有目的性的讀某個項目的代碼往往是只讀某個block甚至是某幾個關鍵行,數量不在多,在于能夠解決你的問題。


          ???? 第二個場景就是為了自我個人精進的讀代碼。所謂個人精進,就是有大量可支配的個人學習和研究時間,高度的自律性和超強的學習力的人進行能力躍遷的關鍵所在。筆者雖然平時偶爾會有去GitHub讀一些代碼,但說要達到個人精進的level,還遠遠不夠。比如說前面的PyTorch 750k的源碼,這么大的代碼量,閱讀策略一定是分治思想,分散包圍和各個擊破。把項目進行分解,設定閱讀計劃和目標,在超強的執(zhí)行力下還是有可能完成的。這不是普通人干的事,但我相信能在深度學習領域精進的人都不會是普通人。


          ???? 誠然,無論是讀教材、讀論文還是本篇所說的讀代碼,這些本身都是一個個人學習能力提升和知識汲取的過程。對于從事深度學習工作的我們而言,arxiv上的論文和GitHub上的代碼都無窮盡,關鍵在于保持學習的勁頭,做一名終身學習者。


          參考資料:

          https://zhuanlan.zhihu.com/p/26222486



          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  蜜臀AV在线免费在线播放 | 黄色毛片女人操逼 | jk自慰网站 | 看免费日逼| 国产精品一卡二卡在线观看 |