caffe,theano,torch,mxnet,tensorflow,哪款工具更適合閱讀源代碼學習?

最近想嘗試閱讀一些優秀的深度學習開源工具的源代碼,所以例舉出了幾款知名的框架,但不知哪個對於閱讀源代碼更加友好,請有經驗的工程師解答,最好提供一些閱讀經驗和方法以及工具,拋磚引玉,本人喜歡在IDE裡面debug一些example然後追蹤閱讀,也希望大牛們提出自己的一些閱讀方法。


對我來說PyTorch的源碼甚至比很多框架的文檔都簡單易讀易懂。

下面說說我是怎麼閱讀修改PyTorch的源碼的吧:

1. github fork + git clone(直接下載也行)

2. 用 vscode(或者sublime 或者 pycharm, 總之都差不多)

3. 參照 PyTorch官方的Contributing指南, 卸載已安裝的pytorch,並用開發者模式重新安裝

conda uninstall pytorch (如果不是用conda就跳過這一步)
pip uninstall torch
pip uninstall torch # run this command twice

python setup.py build develop #需要安裝cmake,numpy等依賴

這樣當你修改了源代碼(只限python源碼)之後直接運行程序,就能看出你的修改,不需要反覆重裝

This is especially useful if you are only changing Python files.

This mode will symlink the python files from the current local source tree into the python install.

Hence, if you modify a python file, you do not need to reinstall pytorch again and again.

4. 建議用IPython進行互動式學習測試,在啟動IPython後先輸入下面兩句命令, 這能夠使你修改了源代碼之後不需要重啟IPython,就能自動載入修改過後的函數和類。

%load_ext autoreload %autoreload 2

PyTorch很令人稱讚的一點就是它封裝和嵌套比較少,比較Pythonic(Flat is better than nested),大多數函數,類都能夠通過幾句代碼直接訪問到,從而能夠看到你修改源碼過後的效果。

------------------

下面是一些建議:

1. python項目的自動跳轉一般都不太好用,但是結合著vscode(或sublime)的Ctrl+P 可以go everywhere。 抑或者是ctrl+shift+F 可以全局搜索函數名,一般都能很快找到對應的函數和類。

2. PyTorch的代碼很簡潔,建議多改改源代碼做下實驗,比如在比較令人疑惑的代碼地方加入pdb.set_trace(),可以在該函數運行的時候進行互動式的列印,調試等,從而了解它的運行原理。

3. 幾個必讀的源碼文件

- torch/nn/modules/module.py 實現Module,必讀,你會驚嘆這麼多的功能原來實現的這麼簡潔易懂。而且這個類已經是基類了,並沒有繼承其他類。

- torch/autograd/variable.py 實現Variable的類定義,但其實主要功能的實現大都在torch/autograd/_functions文件夾下. 大多數函數前向傳播和反向傳播都寫的很優雅高效,可以學習一下。我也實現了兩個function,發起PR後被merge到master了。

-torch/optim 各種優化方法的實現,optimizer.py是基類,很值得一看,尤其是需要實現自己特有的優化方法時,這些代碼能夠為你提供很好的參考。

- torch/utils/data 數據載入的實現,尤其是dataloader,dataset的實現可以參考torchvision的ImageFolder的實現,也是很簡潔的(真是被github上開源代碼的數據處理嚇怕了,動不動就幾百行代碼,而且常常還比較慢)。

- 其它常用的網路層的實現,自己可以找感興趣的看,實現都很簡單,會學到不少東西。比如全連接層 torch/nn/modules/linear.py,RNN+LSTM+GRU: torch/nn/modules/rnn.py

- 涉及C的代碼, 如果感興趣,可以看看PyTorch作者adam當初為Torch寫的一篇指南 A quick tour of Torch internals,雖然我已經好久沒寫C/C++ ,但是感覺這些代碼都很好懂,基本上都能看出個大概。

當然,我說PyTorch代碼易讀,說PyTorch易用,都是相對而言。畢竟深度學習框架作為一個比較複雜的工程,理解掌握它還是需要不少的理論知識和編程知識。

最後,歡迎為PyTorch貢獻自己的代碼!!當你第一次在contributor一欄看見自己的名字時會有莫名的感動。


PyTorch

很難想像, 一個極簡且非常pythonic的模塊(pytorch/torch/nn/modules/module.py)就幾乎解決了整個framework的全部邏輯。這種從一開始就自上而下的設計原則會讓你再次感受:The Code of Beauty, The Beauty of Code.


作為一個torch/mxnet/tensorflow/caffe都有不少於10k行代碼經驗的人,我推薦torch(或者pytorch,兩者底層kernel一樣)。

  1. mxnet的分散式部分很贊,但那更多是關於在延遲和速度上的權衡(而且很多注釋沒有及時更新)。
  2. Caffe代碼是否簡單,取決於你對現代c++的特性是否熟悉。如果你連模板的申明和定義如何分開都不清楚,還是不要碰caffe的c++源碼為妙。
  3. tensorflow贊在文檔齊全,社區強大。作為工具使用很好,但若要讀源碼學習,tf的工程基因導致源碼比較「重」,並不是學習的最好選擇。
  4. torch的底層是由【純c】寫成的,只有在gpu部分用到了c++的模板特性。像我這種不擅長c++的人,也能順利看懂底層實現。另一好處則是,torch的模板是通過luarocks來管理的,不像其他框架集成在一塊。學習時可以針對某一模塊單獨研究,而不需在整個項目里跳來跳去。

我是從 torch/nntorch/nn 開始看的,裡面涵蓋了Neural Network大部分常見layer和loss的實現,每個文件長度都在幾百行左右。


pytorch

1, way fewer files than other framework.

2, more advanced design ( dynamic graph)

3, more pythonic


利益相關,mxnet幕後黑手之一。

caffee無疑是代碼最簡單的,因為他的抽象是layer級的。

其他幾個都有自動求導,提供的都是op級別的操作。個人建議看mxnet。因為mxnet一開始就是協作開發的,所以模塊分的比較清楚,面向contributor的文檔也多一些(反而給應用開發者的文檔爛一些@_@)


如果只是為了讀懂流程,建議從darknet(一個純c小眾庫)入手,windows下可以用vs debug,每個步驟都能debug看到參數更新、值的變化。


方法不錯!

caffe和mxnet


基本原則,哪個用得多就看哪個!

TensorFlow是目前社區活躍度和成熟度較高的框架,很有前景,推薦一下。


代碼看過一點,建議看torch。

略過lua代碼直接看torch的純c實現THNN。

代碼寫的模塊很清晰,每個module一個文件,同時利用c的宏設計的特別巧妙。每個module對應的前向運算,後向傳播都寫的很清楚。理解起來比較容易。


當然是tensorflow,前提是能看英語文檔,配套的資料和文本簡直不要太豐富。


建議看tinydnn這種小巧一點的框架。

上來就看tensorflow這種,過不了幾天就不會再看了。


推薦BVLC/caffe windows版本, 在visual studio 中調試和學習。


要看你學習源碼的目的了!如果是想學習如何設計深度學習框架,那估計都得看一下。如果是想修改源碼完成工作,caffe最好改了,各種層隨你整。

caffe源碼怎麼讀?

打開Windows版,用visual studio載入進去,生成UML,一個個點開看看就會了。


只讀過TensorFlow。剛開始一頭霧水,花式wrapper一層套一層直接被搞吐血,熟悉之後就不覺得什麼了,結構也還蠻清晰的。不過TensorFlow確實顯得太「重」了,代碼比較冗長,各種亂七八糟的macro和helper比較多,讀起來可能有些眼暈……

據組裡面的師兄說,Caffe的代碼寫得還是挺不錯的,不過我自己沒讀過,不太確定。但是Caffe現在已經不那麼流行了,如果想趕潮流的話可能不太合適。

另外TensorFlow和MXNet都已經是Yann LeCun口中所說的 yesterday deep learning framework 了,而PyTorch屬於 future deep learning framework,所以如果信的話,讀一讀PyTorch吧……


看完caffe代碼,正在看tensorflow代碼。可能看熟的關係,感覺還是caffe寫的清晰很多,tensorflow的寫的太長了,設計得太複雜。


如果讀c++版本的,就選caffe1,如果python版本,選擇pytorch。caffe2、tensorflow、mxnet層次粒度更細,抽象層更多,沒有caffe1直觀。


其實我感覺題主如果對MATLAB有所了解的話,matconvnet這個工具包也是一個很不錯的選擇

MATLAB總體來說很方便,而且有評估(evaluate)一段代碼的功能,也就是執行選中的代碼,反正我感覺這個功能相當方便,附上該工具包的主頁

matconvent


只看過caffe


怎麼沒有人提chainer?強烈推薦


個人正在看mxnet,剛開始準備看tf,看了一眼tf後,果斷轉向mxnet了,不管怎麼樣,先深入了解一個的設計思想,應該能觸類旁通


推薦閱讀:

如何評價李開復新書《人工智慧》?
回歸(regression)問題是否比分類(classification)問題更難用神經網路模型學好?
組合數學入門,求書籍推薦?
深度學習會不會淘汰掉其他所有機器學習演算法?
如何評價吳恩達-斯坦福-2017年秋最新機器學習視頻課程?

TAG:機器學習 | 深度學習DeepLearning | Caffe深度學習框架 | TensorFlow | Torch深度學習框架 |