色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 怎樣看pytorch源碼最有效?

          怎樣看pytorch源碼最有效?

          發(fā)布人:計(jì)算機(jī)視覺工坊 時(shí)間:2021-06-09 來源:工程師 發(fā)布文章

          現(xiàn)在深度學(xué)習(xí)項(xiàng)目代碼量越來越大,并且單個(gè)文件的量也非常的大。筆者總結(jié)了一些專家的經(jīng)驗(yàn)并結(jié)合自己看的一些項(xiàng)目,打算總結(jié)一下如何探索和深入一個(gè)深度學(xué)習(xí)項(xiàng)目庫。

          1. 基礎(chǔ)知識(shí)

          首先,需要保證有一定的深度學(xué)習(xí)基礎(chǔ)知識(shí),吳恩達(dá)的深度學(xué)習(xí)課還有斯坦福大學(xué)的CS231n都是不錯(cuò)的入門教程,只需要有大學(xué)數(shù)學(xué)的基礎(chǔ)就可以看懂。

          然后,需要對(duì)Linux系統(tǒng)使用有一定的了解,一般選擇Ubuntu系統(tǒng)作為主力系統(tǒng),了解一下基礎(chǔ)的系統(tǒng)命令就可以了,比如rm,ls,cd,cat,vim,sudo,find,df,top等,在B站上搜索一下Linux的視頻,很快就可以入門。之后遇到新的命令只需要查詢API即可。

          其次,還需要保證對(duì)python語言和深度學(xué)習(xí)框架的了解,python上手是很快的,可以看一下菜鳥教程或者莫煩python教程,上首頁很快。深度學(xué)習(xí)框架方面可以買一些書籍,邊看邊敲,找一個(gè)小項(xiàng)目敲一敲,了解一下大部分API就已經(jīng)達(dá)到上手水平了。深度學(xué)習(xí)框架一般選tensorflow、pytorch,因?yàn)榇蟛糠猪?xiàng)目大多是基于這兩個(gè)框架的。他們官方網(wǎng)站的教程也是非常不錯(cuò)的參考,可以看看官方提供的教程,跑一下github上提供的demo。

          最后,營(yíng)造科研的環(huán)境,可以關(guān)注一些領(lǐng)域相關(guān)的大牛、公眾號(hào),也可以加入一些交流群,多和群友交流,盡可能提升領(lǐng)域的常識(shí)。不要亂問問題,一定要有自己的思考和想法,然后再到群里問問題和交流。

          2. 項(xiàng)目分析閱讀

          從Github上拿到一個(gè)項(xiàng)目,可以按照以下的步驟進(jìn)行分析和閱讀。

          項(xiàng)目背景調(diào)研:

          項(xiàng)目是否是對(duì)應(yīng)一篇論文?如果對(duì)應(yīng)論文,可以先閱讀一下Paper,對(duì)背景和項(xiàng)目的細(xì)節(jié)有一個(gè)大概的了解。

          項(xiàng)目是否有說明文檔?一般比較大型的項(xiàng)目,比如pytorch,nni,mmdetection等較多人維護(hù)的項(xiàng)目是會(huì)在readthedoc上提供說明書,建議優(yōu)先閱讀說明。

          項(xiàng)目是否有README?README文件通常包含了項(xiàng)目創(chuàng)建者想要告訴你的信息,對(duì)于一些專業(yè)的項(xiàng)目庫而言,閱讀README文件絕對(duì)對(duì)你理解整個(gè)項(xiàng)目代碼有幫助。

          什么都沒有??極少數(shù)會(huì)遇到這種情況,但如果遇到的話,就進(jìn)行下一個(gè)階段吧。

          通過文件命名分析:

          數(shù)據(jù)處理、數(shù)據(jù)加載部分,通常命名可能有xxx_dataloader.py等

          網(wǎng)絡(luò)模型構(gòu)建部分,通常命名可能為 resnet20.py model.py等

          訓(xùn)練部分腳本,通常命名可能為train.py等

          測(cè)試部分腳本,通常命名可能為test.py eval.py 等

          工具庫,通常命名為utils文件夾。

          根據(jù)文件夾、文件的命名,判斷其可能的功能。一般在深度學(xué)習(xí)項(xiàng)目中,通常有幾部分組成:

          舉個(gè)例子,以once for all項(xiàng)目為例:

          .

          ├── build.sh # 環(huán)境構(gòu)建
          ├── eval_ofa_net.py
          ├── eval_specialized_net.py # 驗(yàn)證專用網(wǎng)絡(luò)
          ├── figures
          │   ├── cnn_imagenet_new.png
          │   ├── diverse_hardware.png
          │   ├── imagenet_80_acc.png
          │   ├── ofa-tutorial.jpg
          │   ├── overview.png
          │   └── video_figure.png
          ├── LICENSE
          ├── ofa 
          │   ├── imagenet_classification 
          │   │   ├── data_providers # 數(shù)據(jù)加載
          │   │   ├── elastic_nn # 算法核心模塊
          │   │   ├── __init__.py
          │   │   ├── networks # 網(wǎng)絡(luò)構(gòu)建
          │   │   └── run_manager # 訓(xùn)練代碼核心邏輯
          │   ├── __init__.py
          │   ├── model_zoo.py # 模型庫
          │   ├── nas # nas相關(guān)工具
          │   │   ├── accuracy_predictor
          │   │   ├── efficiency_predictor
          │   │   ├── __init__.py
          │   │   └── search_algorithm
          │   ├── tutorial # 教程
          │   │   ├── accuracy_predictor.py
          │   │   ├── evolution_finder.py
          │   │   ├── flops_table.py
          │   │   ├── imagenet_eval_helper.py
          │   │   ├── __init__.py
          │   │   └── latency_table.py
          │   └── utils # 工具庫
          │       ├── common_tools.py
          │       ├── flops_counter.py
          │       ├── __init__.py
          │       ├── layers.py
          │       ├── my_dataloader
          │       ├── my_modules.py
          │       ├── pytorch_modules.py
          │       └── pytorch_utils.py
          ├── README.md # 項(xiàng)目介紹,初次接觸需要閱讀
          ├── requirements.txt # 環(huán)境文件
          ├── setup.py # pip構(gòu)建環(huán)境所需文件
          ├── train_ofa_net.py # 訓(xùn)練腳本
          └── tutorial # 教程
              ├── local_lut.npy
              ├── ofa.ipynb
              ├── ofa_resnet50_example.ipynb
              └── README.md

          找到程序運(yùn)行入口:

          第一類bug,環(huán)境不兼容導(dǎo)致的bug,嚴(yán)格按照作者提供的運(yùn)行環(huán)境,并對(duì)照環(huán)境的版本信息,對(duì)齊本地環(huán)境和作者要求的環(huán)境。

          第二類bug,深度學(xué)習(xí)框架帶來的bug,這部分bug可以在bing上進(jìn)行搜索,查看解決方案。

          第三類bug,項(xiàng)目本身相關(guān)的bug,這類bug最好是在github的issue區(qū)域進(jìn)行查找,如果無法解決可以在issue部分詳細(xì)描述自己的問題,等待項(xiàng)目庫作者的解答。

          通過上一步的分析,找到了項(xiàng)目的介紹的話,在自己機(jī)器上完成環(huán)境配置。

          一般可以找到項(xiàng)目運(yùn)行的主入口,比如train.py,試著運(yùn)行項(xiàng)目。

          遇見bug怎么辦?

          運(yùn)行順利的話,代表可以進(jìn)行debug操作,對(duì)文件某些細(xì)節(jié)不確定的話,可以通過debug的方式查看變量詳細(xì)內(nèi)容。

          用IDE打開項(xiàng)目:

          閱讀入口文件的邏輯,查看調(diào)用到了哪些包。

          通過IDE的功能跳轉(zhuǎn)到對(duì)應(yīng)類或者函數(shù)進(jìn)行繼續(xù)閱讀,配合代碼注釋進(jìn)行分析。

          分析過程可能會(huì)需要軟件工程的知識(shí),比如畫一個(gè)類圖來表述項(xiàng)目的關(guān)系。

          一開始可以泛讀,大概了解整體流程,做一些代碼注釋。而后可以精讀,找到文章的核心,反復(fù)理解核心實(shí)現(xiàn),抽絲剝繭,一定可以對(duì)這個(gè)項(xiàng)目有進(jìn)一步的理解。

          筆者是vscode黨,推薦使用vscode+scp+mobaxterm+遠(yuǎn)程服務(wù)器的方式進(jìn)行運(yùn)行。

          打開項(xiàng)目以后,從運(yùn)行入口(通常是train.py)開始閱讀:

          實(shí)在讀不懂怎么辦?

          在Github的issue上進(jìn)行提問。

          如果有項(xiàng)目作者的聯(lián)系方式,可以聯(lián)系作者,發(fā)郵件提問。

          看看有沒有其他人寫過相關(guān)的博客。

          3. 參考

          https://www.zhihu.com/question/26480537

          https://www.zhihu.com/question/29416073/answer/44301979

          https://github.com/phodal/articles/issues/14               

          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
          分頻器相關(guān)文章:分頻器原理


          關(guān)鍵詞: AI

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉