原作者:David 9
原文發於作者個人部落格,點選檢視原文,掘金已獲得轉載授權。再次感謝作者。
一年一度的PyCon大會上週在俄亥俄
舉行,youtube上早早放出了talk列表。雖然PyCon聚焦Python語言本身,但是關於資料科學和AI的talk也不在少數。
David 9感興趣talk之一就是來自PyLadies的Stephanie Kim關於PyTorch介紹:
太多小夥伴問David 9 哪個深度學習框架好?用TensorFlow還是PyTorch好 ?
現在是時候結合這個talk給大家講清楚了。
首先,框架各有自己的優勢,關鍵是你專案需要和個人喜好:
如果你的專案和RNN強相關,並且希望寫RNN模型的時候更輕鬆敏捷,或者,你是從事科學研究的人員,那麼PyTorch更適合你; 如果你專案定位是一個穩定產品(TensorFlow Serving),或者你注重高效訓練,並且想把模型移植到輕量級移動端(TensorFlow Lite), 那麼選擇Tensorflow更合適。
如果以上沒有一個是“剛需”,那麼如果你的性格和Facebook的“Move fast and break things”很像,你喜歡隨意搞壞東西, 隨意地除錯程式碼,那麼你最好選PyTorch,因為PyTorch就是Facebook打造的。
並且,在深度學習界,Tensorflow就像C語言,PyTorch就像Python,如果你和David 9一樣喜歡隨心所欲的體驗,PyTorch更適合你。
在文件幫助上,PyTorch和TensorFlow一樣有豐富的社群支援。和TensorFlow一樣,PyTorch的計算單位也是一個Tensor(張量),其內部也有一個計算圖(graph),只是它的變數有自動求梯度的功能():
最值得注意的是,Tensorflow的計算圖Graph是靜態的,而PyTorch的Graph是動態的:
如上圖,你每寫一行程式碼,都會在PyTorch的Graph上加一個實實在在的變數,並且可以馬上進行計算:
上面定義的兩個PyTorch的Tensor瞬間就可以計算出結果 z = [5,7,9].
而在TF中可不是這樣的,我們以前講過Tensorflow是要資料流過Graph時在有實際計算的,如你只是定義Graph,TF是不會進行計算的:
TF中構建的流圖只是一個內部佔位的Tensor,需要後期編譯Graph後,用TF session進行計算(當然靜態圖也是有優勢的,它可以專門優化一些程式碼和裝置):
PyTorch中Debug也非常直接,可以在任意位置插入pdb斷點:
對於GPU的支援,PyTorch也很隨意,可以在任意變數指定是否用GPU計算:
PyTorch的Dynamic Graph(動態圖)還有一個優勢是可以Dynamic Batching(動態大小地輸入Batch)。也許在視覺領域我們每次Input的一個batch都是一個size的,而在RNN和NLP自然語言領域完全不是那麼回事,我們經常每次輸入一個句子(sentence)的單詞長度是不同的,下面就是一個單詞樹的例子:
單詞樹的大小每次都是不一樣的(也就是每次batch size是不一樣的),但是PyTorch內部的動態圖允許我們跑模型的時候,每次的輸入層都不一樣。這個idea本身似乎是來自Tensorflow Fold這個專案。而在PyTorch中動態Dynamic Batching顯得更成功。
參考文獻:
- www.reddit.com/r/Python/co…
- www.youtube.com/watch?v=LEk…
- PyTorch — Dynamic Batching
- www.slideshare.net/lymanblueLi…
- discuss.pytorch.org/t/about-the…
本文采用署名 – 非商業性使用 – 禁止演繹 3.0 中國大陸許可協議進行許可。著作權屬於“David 9的部落格”原創,如需轉載,請聯絡微信: david9ml,或郵箱:yanchao727@gmail.com
或直接掃二維碼: