深度學習100問-5:如何閱讀一份深度學習項目代碼?

深度學習100問

Author:louwill

Machine Learning Lab

猶豫很久要不要把讀代碼這個事情專門挑出來寫成一篇推文。畢竟讀代碼嘛,大家可能都會讀。而且筆者個人讀的和寫的代碼量也並不足以到指導大家讀代碼的程度。但筆者還是決定大膽地寫一點:就當是給自己設立今後讀代碼的標準,也將一些之前未能踐行的方法給寫下來供大家參考。不當之處,還請各位指教。
搞深度學習的人,兩大必備日常除了讀論文之外就是讀代碼。讀論文筆者在第4問的時候講了閱讀路線,但如何讀用什麼技巧讀每個人都有不同的見解,這裏不多說。讀代碼跟讀論文、讀書多少有相似的地方,畢竟都是讀的性質。但話又說回來,讀代碼又跟讀paper讀書大有不同,代碼是一種將論文中的模型和算法進行實現的過程,是一種需要你思維時刻在線的過程。又因爲我們讀的是深度學習項目代碼,不是像Linux內核代碼那樣的鴻篇鉅製,所以在代碼性質上多少又有些不同。
筆者這裏說的一份深度學習項目代碼,小到幾百行的測試demo,大到成千萬行的開源項目,讀起來方法肯定各有不同。如下圖Mask R-CNN項目代碼和PyTorch源碼的對比:
在這裏插入圖片描述
在這裏插入圖片描述
可以看到,Mask R-CNN作爲一個經典的實例分割框架,其代碼量可以說是中規中矩,3k的代碼量在我們讀完論文後集中花幾天時間差不多可以過一遍。但PyTorch的源碼對大多數人而言就不那麼友善了,750k的代碼量,而且底層的C++代碼佔到整個項目中的一半之多,作爲深度學習研究而言,堪稱巨無霸級別了。這樣的代碼量,就像初學者拿到一本PRML,往往投入巨大精力後不了了之。所以,對於這兩種類型的項目代碼,閱讀方法肯定會有所區別。
因爲我們讀代碼的目的、場景和對象不盡相同,下面筆者從三個方面來和大家探討如何閱讀一份深度學習項目代碼。
首先讀代碼的一些通用方法。這一點而言不侷限於深度學習項目代碼,任何項目、任何語言的代碼閱讀都適用。我們日常讀代碼無非是兩個工具,一是將代碼下載到本地,打開IDLE,在IDLE裏安靜的閱讀:

在這裏插入圖片描述
第二個就是直接在GitHub的web端直接閱讀,但GitHub沒有像編輯器那樣在左側設置閱讀目錄,每次進入一個代碼文件就必須退出來才能進入另一個文件,用戶體驗極差。當然了,這都不是事。chrome給我們提供了Octotree這樣的輔助閱讀插件,直接在chrome擴展程序裏搜索安裝即可。
在這裏插入圖片描述
安裝後我們就可以直接在web端就有IDLE讀代碼的體驗:
在這裏插入圖片描述
可以看到在頁面左側有一個類似IDLE的目錄欄,大大方便了我們查看和閱讀項目代碼。這是通用方法中的工具層面,我們再來看一些基本的閱讀規矩。有了IDLE和Octotree工具,我們第一點一定是仔細看代碼目錄,對整個項目代碼結構和分佈有一個整體的認識,對於深度學習而言通常目錄中各個模塊相對比較固定,比如是models目錄下放着模型搭建和訓練的代碼,conifg目錄下放着模型的一些配置文件,data目錄下放着項目所使用的數據信息等等。如下面語義分割項目的目錄結構:
在這裏插入圖片描述
對深度學習項目代碼的結構熟絡之後,讀的多了自然就會輕車熟路起來,後面閱讀效率也就提高了。
通用方法的第二個是快速找到readme文檔。通常來說,根目錄下的readme文檔包含了這份代碼的使用方法,裏面有可以讓你快速瞭解這個項目的關鍵信息。一般來說,開源項目的readme裏作者都會寫明如何使用代碼和進行部署。下圖是DenseNet的readme文檔:
在這裏插入圖片描述
對於大型項目,可能每一個子目錄下都有readme文檔,這都是我們需要仔細閱讀的部分,作者把關鍵信息都放裏面了。所以不管這樣,第一時間讀找到readme進行閱讀是你瞭解該項目的必備步驟和通用方法。
第三個通用方法就是具體如何讀的問題。就是我們得確定一個閱讀主線。這一點是針對於深度學習項目代碼的通用方法,對於一個深度學習項目,我們一般想要了解的最關鍵點無非就是數據、模型和如何訓練等幾個方面。如果你想快速看看這個開源項目的測試效果,直接讀readme看使用方法即可。如果這個項目作者提出了一個新的模型框架,比如說bert,你想了解它的模型框架細節,直接定位到models目錄下的帶有model字眼的.py文件開始讀。或者是你想看這個項目是如何訓練的,都用了哪些訓練的tricks,它的參數初始化是如何做的,batchsize用的多大,訓練過程中學習率如何調整的等等,那麼話不多說,直接定位到帶train的.py文件即可。如下圖faster-rcnn的3個訓練文件。
在這裏插入圖片描述
根據目的不管是model還是train的主線,在閱讀過程中一定會涉及到其他分支,比如說數據和配置等其他分支線。在主線閱讀過程中不斷完善對分支的理解,久而久之,一個完整的項目就會被你消化了。
以上說的是深度學習項目代碼閱讀的一些通用方法。下面再具體講兩個場景的代碼閱讀。畢竟大家做事講究目的性,往往帶有較強的目的性去做某事效率一般會特別高。
第一個場景是在大家做研究做項目時遇到問題時。不知道這個問題如何解決,直接谷歌又找不到好合適的方法的時候。這時候我們可能會寄希望於在GitHub上搜羅一番。比如說我們想要知道對於極度數據不平衡時如何給損失函數加權重的方法,再比如對於多標籤問題進行模型預測時如何找到最佳分類閾值等等。這些問題都是我們在做實際項目時都可能會碰上的,在這種情況下若是能在GitHub上找到類似場景的處理方法,相信你會瞬間來了精神。
下述基於keras的CNN多標籤分類項目對於多標籤分類閾值尋優使用了matthews_corrcoef來確定最佳分類預測閾值。至於什麼是matthews_corrcoef,這些都是你在解決問題過程中需要學習和吸收的地方。總之,帶有目的性的讀某個項目的代碼往往是隻讀某個block甚至是某幾個關鍵行,數量不在多,在於能夠解決你的問題。
在這裏插入圖片描述
第二個場景就是爲了自我個人精進的讀代碼。所謂個人精進,就是有大量可支配的個人學習和研究時間,高度的自律性和超強的學習力的人進行能力躍遷的關鍵所在。筆者雖然平時偶爾會有去GitHub讀一些代碼,但說要達到個人精進的level,還遠遠不夠。比如說前面的PyTorch 750k的源碼,這麼大的代碼量,閱讀策略一定是分治思想,分散包圍和各個擊破。把項目進行分解,設定閱讀計劃和目標,在超強的執行力下還是有可能完成的。這不是普通人乾的事,但我相信能在深度學習領域精進的人都不會是普通人。
在這裏插入圖片描述
誠然,無論是讀教材、讀論文還是本篇所說的讀代碼,這些本身都是一個個人學習能力提升和知識汲取的過程。對於從事深度學習工作的我們而言,arxiv上的論文和GitHub上的代碼都無窮盡,關鍵在於保持學習的勁頭,做一名終身學習者
————————————————
版權聲明:本文爲CSDN博主「louwill12」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_37737254/article/details/102920397

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章