PyTorch到底好用在哪裡?

之前非常熟悉Tensorflow,後來都說PyTorch簡單易上手,自己就去試了試。

PyTorch連最基本的maximum, minimum, tile等等這些numpy和tensorflow中最簡單的運算都沒有,用view來reshape還會報錯contiguous(雖然我知道怎麼解決),官方手冊也查不到相應說明,這個東西到底好用在哪裡?

還是說就是定義網路結構簡單?


先來回答一下你提的幾個問題:

Pytorch連最基本的maximum, minimum, tile等等這些numpy和tensorflow中最簡單的運算都沒有,用view來reshape還會報錯contiguous(雖然我知道怎麼解決),官方手冊也查不到相應說明,這個東西到底好用在哪裡?

你說的那幾個函數pytorch中都有(或者可以實現)

  • maximum: torch.max() 同時包含了numpy.max 和numpy.maximum的功能
  • minimum:torch.min()
  • np.tile(arr,(100,100)) 等價於 tensor.repeat(100,100)
  • contiguous的問題我經常聽別人提問,但我從未遇到過(我幾乎從未調用過`tensor.contiguous()`),大多數人也很少會把tensor弄成不連續。之所以tensor會不連續,是為了能夠共享內存,更高效的內存利用(其實只要PyTorch在設計的時候把所有的不連續操作都返回一個連續的tensor即可解決這個問題,但是不值得,大多數不連續的tensor都會進行一個reduce操作,然後就變成了連續的了)。

numpy那麼多函數,PyTorch不可能都支持,即使不支持,也可以在numpy中實現,然後轉成tensor,畢竟numpy和tensor之間的轉換極其高效快速(他們共享內存).


這個東西到底好用在哪裡?

還是說就是定義網路結構簡單?

PyTorch到底好在哪,其實我也只是有個朦朧的感覺,總覺的用的舒服自在,用其它框架的時候總是覺得這裡或者那裡彆扭。第一次用PyTorch幾乎是無痛上手,而且隨著使用的增加,更是越來越喜歡:

PyTorch不僅僅是定義網路結構簡單,而且還很直觀靈活。靜態圖的網路定義都是聲明式的,而動態圖可以隨意的調用函數(if,for,list什麼的隨便用),兩者的差距不是一點點。網路的定義在任何框架中都應該是屬於最基礎最簡單的一個內容,即使是介面繁多的tensorflow,通過不斷的查文檔,新手也能把模型搭起來或者是看懂別人的模型。這個PyTorch也不例外,它的優勢在於模型定義十分直觀易懂,很容易看懂看別人寫的代碼。可以看看pytorch/vision 裡面的幾個經典的網路定義,我覺得很難找到比它更簡潔易懂的模型定義了。

網路模型定義只是很基礎的一部分,更重要的是模型的使用。比如在使用預訓練模型finetue時,我們需要修改預訓練模型某些層,新增某些層,刪除某些層,新增的層希望給他較高的學習率,之前預訓練的層希望學習率設為0。scene-baseline 是我前幾天為AI challenger 場景分類寫的baseline,可以參考一下,只用了幾行代碼就實現了預訓練模型finetune(新增某些層,刪除某些層,修改某些層),以及為不同層設置不同學習率 scene-baseline-optimizer 。

再比如在儘可能不修改原來模型源代碼的情況下,獲取預訓練好模型的某些層的輸出(Fast Neural Style需要用到),或者是使用多個預訓練好的子模型,分別初始化一個複雜模型的某一部分,因為子模型的結構都是相似的,所以可以讓這些子模型共享某些層的參數(知乎看山杯我就用了這個策略。表述的可能很複雜,其實在模型的構建只用了幾行)

談太多框架的使用,可能比較枯燥,只有你自己用了才知道,PyTorch真的是越用越順手。

下面說幾點其它的看法,沒有什麼條理,不論證舉例,只說想法,只是個人看法,不必太認真

1.PyTorch比TF更符合Unix/Python哲學

Unix哲學:做一件事,並把它做好。(真的要在做實驗的時候考慮如何把模型部署到手機,利用TPU加速?)

Unix哲學:KISS(keep it simple, stupid)。github上TF有接近100萬行代碼,PyTorch只有它的十分之一多一點。TensorFlow創造了 圖、會話、命名空間、PlaceHolder 等一大堆全新的概念,簡直就是一門新的語言。TensorFlow是Make It Complicated ,TensorFlow+Keras是Make It Complicated And Hide It。而Keras的Hide it又違反了Python的哲學(扁平勝於嵌套 ),喪失了靈活性。而PyTorch就是tensor-autograd-nn 三級封裝~ 簡潔易懂

Python之禪:盡量找一種,最好是唯一一種直觀易懂的實現方案(猜猜TF中RNN有多少種實現,猜猜除了Keras、Sonnet、TFLearn、TensorLayer、Slim、PrettyLayer之外tensorflow還有多少個第三方API )。PyTorch的不同人寫的代碼都差不多,很容易看懂。

完整的Python之禪:

The Zen of Python, by Tim Peters

優美勝於醜陋

明了勝於晦澀

簡潔勝於複雜
複雜勝於凌亂

扁平勝於嵌套

間隔勝於緊湊

可讀性很重要

即便假借特例的實用性之名,也不可違背這些規則

不要包容所有錯誤,除非你確定需要這樣做

當存在多種可能,不要嘗試去猜測

而是盡量找一種,最好是唯一一種直觀易懂的實現方案

雖然這並不容易,因為你不是 Python 之父

做也許好過不做,但不假思索就動手還不如不做

如果你很難向人描述你的實現,那肯定不是一個好實現

命名空間是一種絕妙的理念,我們應當多加利用

如果你很難向人描述你的實現,那肯定不是一個好實現

2.快速

在大多數人寫的代碼中PyTorch都比TensorFlow快,並不是說TensorFlow慢,只是你要用TensorFlow寫出同等速度的代碼會稍微困難一些(單單是數據載入這一塊就會難倒許多人)

TensorFlow 60-80% slower than PyTorch on training Wide ResNet · Issue #9322 · tensorflow/tensorflow

pytorch 2.5x faster on VGG16 · Issue #7065 · tensorflow/tensorflow

3.強大的社區

facebook的FAIR強力支持,FAIR是全球TOP3的AI研究機構。PyTorch論壇,文檔,tutorial,一應俱全。FAIR的幾位工程師更是全職維護開發,github上PyTorch每天都有許多pull request和討論。

你很難聽到有誰說TF好用,最多是諸如谷歌支持,社區強大,文檔完善,功能齊全等等。但是PyTorch你只要深度用過一段時間,就會喜歡上它的。很多人自來水安利PyTorch,當然不是facebook給錢,或者是博得多少點擊量,真的是因為它太好用了。

其實關於TensorFlow還有一點讓我頗為不滿的是,現在媒體總是覺得谷歌的東西就是最好的,每回TensorFlow有什麼更新,都要搞個大新聞。而且,谷歌喜歡把一個項目的目標當成這個項目的特點來宣傳,但是TensorFlow的實際表現,配不上它的名氣。

4.簡潔易懂的代碼

一個框架你不懂源碼,你就不能完全掌握它的運行原理,像tensorflow的`sess.run`簡直就是個黑箱。而PyTorch幾乎是我用過框架中源碼最易懂的,任何一個操作,不論多麼高級複雜,都能輕鬆的找到它對應tensor操作(Caffe/tinydnn也挺簡潔的,但是我的C++比較渣)

nn.Module代碼是PyTorch中對所有模型對象的封裝,我覺得幾乎所有人都應該看看,深度學習框架的設計可以很簡單!現在Gluon,Sonnet,nnabla等框架也都開始模仿這個設計api~

5.快速實現

深度學習煉丹的過程中,我們肯定都有許多奇思妙想,但這些奇思妙想需要做實驗來驗證。如果實現比較困難費時,在不確定這個想法是否有效的情況下,我們很容易打退堂鼓。PyTorch可以解放你的想法,用tensor的思維思考代碼,一切操作皆tensor,一切tensor能做的,PyTorch都能做到,而且做的像操作tensor一樣。

用TensorFlow 我能找到很多別人的代碼

用PyTorch 我能輕鬆實現自己的想法

而且github上很多tensorflow的代碼也不能跑了不是嗎?畢竟TF常年一步一大更新,不怎麼考慮向後兼容。隨著同學的更新TF,我眼睜睜看的我的TF代碼從運行正常,到警告,到報錯

PyTorch實現的項目在github上也有很多,不是嗎?基本上所有的研究方向都能找到質量很高的PyTorch開源方案。

6.關於PyTorch的幾個誤解

PyTorch社區不強大 ?:看上文

PyTorch 文檔不齊全?:我覺得PyTorch的文檔幾乎是所有框架中最好的,這些文檔都是作者在設計的時候就寫好的,不是別人看著代碼,憑藉著自己理解寫的。 而且PyTorch文檔中的給出了很多示例,在IPython下可以直接拷貝運行,做實驗測試。

PyTorch中沒有TensorBoard? lanpa/tensorboard-pytorch 不僅功能強大(支持Tensorboard幾乎所有的操作,連計算圖都支持,只是顯示效果不好),而且介面簡單(比tf的tensorboard api易用)。而且除了Tensorboard還有Visdom可以用~

PyTorch動態圖性能比較差?見上文,同等水平的人用PyTorch寫出來的代碼普遍要比TensorFlow快。當然我認為極限情況下TensorFlow會比PyTorch快,詳情可以看TensorFlow官方的benchmark,只是寫的代碼很複雜,普通用戶寫不出來。

總感覺表述有點匱乏,表達也不是很流暢,還有很多沒表達出來的。可以看看其他人是怎麼說的:

深度學習入門該用PyTorch還是Keras?熱門公開課換框架背後的學問

PyTorch和TensorFlow哪個更好?看一線開發者怎麼說 - 51CTO.COM

2017年1月18日Facebook發行的PyTorch相比TensorFlow、MXNet有何優勢?

屬於動態圖的未來:橫向對比PyTorch與Keras

PyTorch和TensorFlow到底哪個更好?看看一線開發者怎麼說 (帖子是3月份初發的,這時候PyTorch才發布一個多月,但幾乎所有用過的人已經都在誇讚)


有些回答里有幾個地方我看不下去,我來來說幾句

PyTorch的autograd庫和nn.Module本身是基於Chainer的API設計,autograd最早是Chainer的fork

PyTorch連最基本的maximum, minimum, tile等等這些numpy

Chainer+CuPy是你需要的最好解決方案,Cupy的設計本身的起點就是對numpy的高度兼容為基礎設計。而且Chainer比PyTorch用起來更加傻瓜,另外Chainer代碼肯定比PyTorch更容易看懂。。。作為一個幾乎全部python寫的架構,你只要看python就夠了。Chainer用起來只會更傻瓜而不會更難。

一些題外,

Chainer作為最早的動態圖框架,因為沒有大佬撐腰,而Preferred Networks本身只是一家沒幾個人的日本IoT創業公司,除了日本以外的市場的推廣比較失敗。。。

後來Fork了Chainer的PyTorch因為有大佬撐腰,瞬間成為了主流,我覺得有些Chainer應有的credit我還是要提一下。。。

本月初Twitter上有些大佬們關於Deep Learning框架的討論

Chollet是Keras的作者

agibsonccc是DeepLearning4j的作者(有意思的是Skymind的日本office在大手町ビル,和PreferredNetworks一棟樓)

利益相關:

之前在日本交換時,在Preferred Networks打工過幾個月,我應該是他們招的第一個中國人。。。

我自己在去之前只知道有這麼一個框架,日本人都在用。然後在那幹活時才發現Chainer異常好用(之前一直用TF。。。)

順帶說一句

https://github.com/lanpa/tensorboard-pytorch/tree/master/examples/chainer

tensorboard-pytorch也支持Chainer。。。


How to debug in Pytorch? For tensorflow coders. You are welcome!

著名AI領域pytorch腦殘粉用戶

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

說一個感觸最深的地方

之前keras告訴我的lstm是這樣的

model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation="sigmoid"))

用了pytorch以後才真正的跟論文里的h和c對應上, 自主的決定何時計算圖detach, 何時重新初始化

rnn = nn.LSTM(10, 20, 2)
input = Variable(torch.randn(5, 3, 10))
h0 = Variable(torch.randn(2, 3, 20))
c0 = Variable(torch.randn(2, 3, 20))
output, hn = rnn(input, (h0, c0))

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

安利幾個我們的pytorch repo:

rl演算法集成,包括dqn, double-dqn, a3c, acer jingweiz/pytorch-rl

deepmind DNC和NTM 外部記憶結構 jingweiz/pytorch-dnc

value iteration network onlytailei/Value-Iteration-Networks-PyTorch

彩蛋時間 onlytailei/pytorch-trick-or-treat


工具好不好用,不僅在於工具,還在於你要解決的問題.

不過你既然認真的問了,那麼我就認真的答一下

:半年tensorflow使用經歷,一個月pytorch使用經歷

當然是從research的角度,去看一看pytorch的優越之處

1.autograd模塊.自動求導,現在的深度框架應該都是有的,但是將autograd獨立出來的好處就是讓使用者對於梯度的使用可以清晰化.

當有一天你想到了一個特別牛逼的梯度更新策略,你就可以1s中寫一個pytorch測試代碼做測試.而不是在tensorflow中尋找梯度api,而懷疑人生.

2.真的想貼一下我的這個回答

張濤:2017年1月18日Facebook發行的PyTorch相比TensorFlow、MXNet有何優勢?

觀點和上一個類似,奇思妙想易於實現就是pytoch在做research時最大的優勢

3.在pytorch將tensor轉成numpy是多麼的自然,而在tensorflow中又是多麼的彆扭.

例如突然有一天我想將圖中的中間節點拿出來,然後做個numpy運算,在繼續運行圖.就會發現pytorch是如此優雅.

research不就是這麼的充滿騷操作么,project就得中規中矩的tensorflow

最後,殺雞(research)焉用牛刀(tensorflow)


我只說一點,PyTorch這種動態圖框架在debug的時候超級超級超級方便!

因為基本上計算圖運行出錯的地方,就在圖定義的那行代碼上。

tensor shape和網路層的input shape不匹配?該用Long類型但是卻用了Float類型?

Don"t panic!直接在報錯的那行代碼前面熟練地插入一句:

import ipdb; ipdb.set_trace()

然後就愉快地斷點調試吧。

在這個問題上,我不是針對TensorFlow,我的意思是,所有靜態圖框架,都是


作為一個編程新手我來說一下我的體會。我的編程水平大概屬於知乎上任何一個混machine learning的人都比我強,正式學習TensorFlow和PyTorch是兩三個月之前。

一開始是用tf,因為似乎身邊所有人都是用tf,我也就隨大流。上來的感覺就是代碼寫著懵,文檔看著暈。代碼寫的暈是因為經常搞不清什麼時候用tf自己的函數什麼時候不用,有時候tensor dimension搞不清了想print一下,可是print起來特別累。tf的各種機制其實不難理解,但是用著有點懵,比如BatchNorm的時候要手動加moving average進去,這種事情用tf好久的人或者腦瓜聰明的人一下就能搞清楚,可是我當初剛開始用tf的時候完全不知道哪裡用錯了,只是知道BatchNorm不僅沒有加accuracy反而把我的accuracy拉垮了,一臉懵逼。

後來寫了一些東西之後算是入了個門,就想把代碼寫好看一點,把graph放進class里,用一下tensorboard,然後考慮不用placeholder而是用queue來load data,這個時候就是文檔看著暈了,一個函數tf自己用好幾個不同的實現,比如一個conv_layer就我知道的就有三四種實現(contrib.layers, layers, nn, slim),我想搞清楚到底應該用哪個,哪個更好用一點,可是project又趕時間,完全沒工夫研究一下,於是乎心裡彆扭。再說代碼readability的事情,把graph寫成class的形式雖然說是仁者見仁智者見智,自己開心就好的一個事情,可是我作為一個菜雞就想學一學大神是怎麼寫的,然而不同人有不同的寫法,我自己也分辨不出應該按照哪種寫(最後是看了CS224n作業的寫法)。

對我而言,tf由於版本、API和其他原因,同樣的一個東西可以有完全不同的寫法,作為一個新手,面對如此多選擇的時候,真不知道應該如何系統學習。不過也有好處啦,在tf中四處碰壁感覺學習到的知識多一點。來回切換著學習tf和pytorch感覺比只學一個能懂更多東西。

後來我就切換到了pytorch,pytorch寫出來的代碼天生就容易讀,連我都能寫出來不凌亂的代碼;而且if,for loop還有print都好用了,出錯之後也容易搞懂問題;一個layer也只對應一種函數,我也不用去糾結應該學習哪個。如此這般我可以花更多的時間搞懂pytorch的源代碼(文檔鏈接到的Python代碼,我的水平還讀不懂C的源代碼)和graph本身而不是實現,可以集中一些注意力。不過pytorch也有我個人認為不好的地方,畢竟還是0.2.0版本,代碼本身不完善,有些函數有小bug,還有一些我難以理解的問題,比如為什麼是seq_len x batch_size x features,batch_size不在第一位我特別不能理解,再比如有些問題不逛論壇只看文檔是搞不清楚為什麼的。

總而言之我覺得對於新手而言pytorch能讓人把注意力集中在問題本身而不是實現,並且代碼可讀性強一些。歡迎拍磚歡迎指教。


一直都用TensorFlow,最近需要將個網路改成動態的網路,很不方便。雖說有了TensorFlow Fold,但是那語法太詭異…所以一狠心學學pytorch吧,結果發現真是太好用了!

優點:

1,動態圖

2,Tensor Numpy互轉

3,pythonic

4,debug方便

5,可讀性強

6,上手快,適合research

7,也不算優點吧,何大神在Facebook,估計開源的代碼是pytorch實現的

當然缺點也是有的,不過我已經站到pytorch陣營了


千好萬好,上線不了。

我兩個都用,和公司業務相關用tf,自己玩兒就用pytorch,新手切忌花太多時間糾結工具,想想caffe,要弄點自己的東西,還要用c++寫layer。

最後就是學那個都一樣,看個人喜好,因為去了公司之後你沒法決定自己用那個工具。如果實在擔心工具過時之類的問題,就可以去搞mxnet,兩個的折中。


tensorflow的session設計簡直非人類,比如我要看一個tensor的value,首先得把其他相關placeholder放進去,然後調用Session運行出來。Pytorch只需一小步,.numpy就可以轉成numpy了,方便快捷,目測學術界都有種棄TF轉Pytorch的趨勢。不過Pytorch0.2.0有很多bug,我也是吃過不少虧…具體是什麼 bug,我就不說了…

=====

更新:pytorch 2.0有一個問題在於訓練RL http://www.zhihu.com/question/67209417

=====

更新:pytorch如果網路輸出變數做了修改的話,做back propagation的時候會報錯。比如說,我先定義一個模型

class Model(nn.Module):
whatever...
def forward(self,x):
outs = F.relu(self.conv1(x))
outs = outs.view(outs.size(0), -1)
outs = self.fc(outs)
outs[some_index] = self.softmax(outs[some_index])
return outs

然後把一個輸入傳進去,

model = Model(**args)
optimizer = optim.Adam(model.parameters(), lr=0.001)
outs = model(inputs)
loss = torch.sum((outs - target)**2)
optimizer.zero_grad()
loss.backward()
optimizer.step()

就會報錯說不能做inplace修改,原因在於原來的forward函數最後一步用了softmax函數做了inplace修改,work的方法是

outs[some_index] = self.softmax(outs[some_index].clone())


pytorch的官方定位就和tensorflow不是很一樣。

官方是怎麼說的呢

官方把pytorch第一個作用寫的是「numpy的GPU運算替代版本」

第二個作用才是利用autograd(自動求梯度)系統進行深度學習。

只要會Python,寫過Python程序,用過numpy,寫起來pytorch一切都非常的自然,而tensorflow完全像是個新語言,python只不過是個載體。

個人使用起來的感覺就是,

pytorch里可以為所欲為,debug比tensorflow自然多了,tensorflow個人覺得出了問題debug還不如人肉看一遍代碼查一遍超參數來的快。

而且pytorch一切都很符合人類思維,數據獲取,模型建立,訓練,測試。

tensorflow反正新手會懵逼一段時間。

pytorch的新手文檔特別友好,tensorflow的則有點迷,實在不懂example里各種引用套引用套引用幹什麼,是想讓人看懂還是不想讓人看懂?

個人喜歡pytorch。


TF Debug真的挺費時間的。

另外,感覺學TF不像是學工具,到像是一門語言。尤其是對非科班計算機出生的人來說。

最後,我還是選擇TF


兩種框架都使用過,說點體會,歡迎拍磚。

tf經過了這兩年的發展,已經逐漸壯大成了一個體系龐雜的框架。我在tf剛一出來就學習了如何使用tf,見證了整個tf版本的劇烈變化。tf在功能的完備性上應該說很高了,幾乎完備到類似於一種全新的編程語言。而且可以分散式部署,比較適用於生產環境的工業級應用。

但是tf不是沒有缺點,也許可能是因為G家名聲太大,使得他的很多瑕疵都被掩蓋了。首先,這種違反直覺的編程模式就是一個bug,你無法隨心所欲地像之前寫python一樣寫tf。此外,隨著tf的版本變遷,API也在不斷變化,整個工程的模塊關係也在劇烈變化,一套tf程序換了版本就完全跑不起來了。最後是龐雜而又過於底層的介面設計,使得初學者很難下手。

pytorch是從torch遷移而來的,它非常適合於研究任務或者小型的部署任務。對於研究者或者學術而言,做出原型才是王道。pytorch幾乎和python是一脈相承的,可以各種使用python的原生代碼,寫起來如沐春風,簡潔明快。動態建圖使得你可以按照很常規的思路去實現自己定製的神經網路,完全不用動腦子去考慮如何遷移到靜態圖構建這種爛事兒上。另外動態建圖帶來的好處是大大降低了調試的難度,相比於tf,你可以在任何地方監控變數的變化,而不用去開什麼session。

作為學生黨,pytorch還是不錯的選擇,當然了TensorFlow作為現在的王者,也是不能偏廢的,好在還有tflearn、tensorlayer和大名鼎鼎的keras這種懶人神器幫我們屏蔽掉tf的一些煩人的特性。


PyTorch中所有的神經網路都來自於autograd

autograd 包提供Tensor所有操作的自動求導方法。

這是一個運行時定義的框架,這意味著你的反向傳播是根據你代碼運行的方式來定義的,因此每一輪迭代都可以各不相同。

以這些例子來講,讓我們用更簡單的術語來看看這些特性。

autograd.Variable 這是這個包中最核心的類。 它包裝了一個Tensor,並且幾乎支持所有的定義在其上的操作。一旦完成了你的運算,你可以調用 .backward()來自動計算出所有的梯度。

你可以通過屬性 .data 來訪問原始的tensor,而關於這一Variable的梯度則集中於 .grad 屬性中。

還有一個在自動求導中非常重要的類 Function。

Variable 和 Function 二者相互聯繫並且構建了一個描述整個運算過程的無環圖。每個Variable擁有一個 .creator 屬性,其引用了一個創建Variable的 Function。(除了用戶創建的Variable其 creator 部分是 None)。

如果你想要進行求導計算,你可以在Variable上調用.backward()。 如果Variable是一個標量(例如它包含一個單元素數據),你無需對backward()指定任何參數,然而如果它有更多的元素,你需要指定一個和tensor的形狀想匹配的grad_output參數。


  • 多GPU訓練易於實現,能和mxnet媲美
  • 文檔、代碼簡潔易懂

缺點是好像有時候會出現死鎖的bug,以及早期版本,在訓練到幾十個epoch之後,仍然可能會莫名其妙地出現一些NaN的錯誤。

利申:mxnet重度用戶。


我本來很想使用pytorch,但是遇到了一些不知該如何處理的障礙,最終選擇了tensorflow。希望有人能解答我對pytorch的一些疑惑:

1、我經常需要使用c++實現一些自定義的op,在pytorch中這似乎不是很方便。雖然pytorch提供了c ffi擴展的方式,但那個介面太簡單,完全不能在大項目里使用。而tf就提供了把包含自定義op的動態庫導入到tf中的功能(自定義op可以作為獨立的外部模塊來開發),用起來比較方便。另外pytorch的底層c代碼框架(各種THxx)看起來比較複雜,各種宏亂飛,不知如何使用,而tf的底層架構看上去就清晰易用一些。

2、pytorch的op必須是無內部狀態的,只有Module可以是有狀態的,當我需要把c/c++編寫的數據結構作為layer的內部狀態時,不知如何簡單實現,因為Module只能用Python寫。把所有的c/c++數據結構包裝成python對象並提供python操作介面太麻煩。

3、pytorch的模型如何在生產環境中部署?如果使用onnx,是不是意味著所有的c/c++編寫的自定義op都需要同時開發和維護對應pytorch/caffe2的兩個版本?太不現實了。其實我不介意在生產環境中運行python(畢竟python只是用來調度op的),但pytorch也沒有提供介面在c/c++項目中調取pytorch的模型。


寫for循環時好用一些,TF寫個for循環甚至不能(1.5版貌似好些了),TF也沒有那麼難用,只想說由此感覺jeff dean也沒有那麼神~


作為一個負責人的研究者,我要說的是,chainer更簡潔易懂好用。


還在糾結選PyTorch or TensorFlow?

PyTorch不熟悉,但應該是做學術、發paper的首選(?)這就是它的好。

TensorFlow更在意大規模機器學習問題,瞄準的是產品應用。通過TF的高級API(Dataset、Estimator、Serving等)能夠看出其意在為用戶(公司)提供完善的大數據+機器學習處理流程和產品上線、模型迭代功能。


1.相對於tf圖操作 pytorch更加符合編程思維

2.好debug, 感覺數據時刻都操控在你手裡。


tf是一個更適合工業界把演算法落地到線上環境的工具,可以將模型訓練,在線預測,部署到嵌入式設備(手機等)做成完整的工具鏈,也是為了這種特性,才會做成靜態圖+session驅動的開發模式,靜態圖驅動的特性導致所有的Python控制邏輯都不能用必須使用tf提供的介面,這是tf在構造模型難用的根本原因。

在工業界除了需要在離線場景下把模型訓練得到可用的指標之外,還需要把模型應用到線上環境中,基於Python驅動的圖是不可能滿足線上的性能要求的,所以Pytorch的模型是沒有辦法直接應用於線上的,而tf的驅動邏輯是靜態的,訓練和預測用的同一套靜態圖,所以tfserving可以直接載入tf模型提供在線預測的rpc介面達到相對比較高的性能。

還有一些分散式方面的不同就不說了

最後結論是如果需要research發paper,或者跑模型的原型看看效果,建議使用pytorch

如果想要做一個需要在線預測且有latency需求的,建議使用tensorflow

ps. tf基於Python驅動的方式也在路上了,未來也可以像pytorch一樣開發模型,並且可以導出上線了


毫無疑問Tensorflow是經歷過大規模工程項目的考驗的,但是在科研發paper這方面還是Pytorch更合適一點:上手快,能迅速實現idea驗證想法,模型過程的可控性可見性都比TF要好,當然Pytorch如果能有TensorBoard這種可視化工具就更好啦,食不厭精膾不厭細,糖當然還是甜的好


推薦閱讀:

2017年1月18日Facebook發行的PyTorch相比TensorFlow、MXNet有何優勢?
如何理解一維卷積神經網路的輸入?
學習機器學習過程中都走過哪些彎路,怎樣避免走彎路?
有沒有可能做出在歐陸風雲里和頂尖人類玩家同等水準的AI?
做出「狼人殺」的 AI 有哪些難點?

TAG:深度學習DeepLearning | TensorFlow | PyTorch |