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

          如何高效的閱讀一份深度學(xué)習(xí)項(xiàng)目代碼?

          共 2868字,需瀏覽 6分鐘

           ·

          2021-01-26 16:14

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

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

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

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

          因?yàn)槲覀冏x代碼的目的、場景和對象不盡相同,下面筆者從三個(gè)方面來和大家探討如何閱讀一份深度學(xué)習(xí)項(xiàng)目代碼。

          首先讀代碼的一些通用方法。這一點(diǎn)而言不局限于深度學(xué)習(xí)項(xiàng)目代碼,任何項(xiàng)目、任何語言的代碼閱讀都適用。我們?nèi)粘Wx代碼無非是兩個(gè)工具,一是將代碼下載到本地,打開IDLE,在IDLE里安靜的閱讀:

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

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

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

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

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

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

          以上說的是深度學(xué)習(xí)項(xiàng)目代碼閱讀的一些通用方法。下面再具體講兩個(gè)場景的代碼閱讀。畢竟大家做事講究目的性,往往帶有較強(qiáng)的目的性去做某事效率一般會(huì)特別高。

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

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


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


          誠然,無論是讀教材、讀論文還是本篇所說的讀代碼,這些本身都是一個(gè)個(gè)人學(xué)習(xí)能力提升和知識汲取的過程。對于從事深度學(xué)習(xí)工作的我們而言,arxiv上的論文和GitHub上的代碼都無窮盡,關(guān)鍵在于保持學(xué)習(xí)的勁頭,做一名終身學(xué)習(xí)者。
          參考資料:https://zhuanlan.zhihu.com/p/26222486

          瀏覽 91
          點(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>
                  九九视频免费 | 日韩无码性爱 | 美女骚逼 | 大香蕉鸥\美一区二区 | 77777在线视频 |