Deep Learning 開發框架 Tensorflow vs Keras vs PyTorch 我應該學哪個?

Deep Learning 開發框架 Tensorflow vs Keras vs PyTorch 我應該學哪個?

簡答(2018-06-05)

  • 基礎或入門:Keras。用 Keras 感覺一下 Deep Learning 的威力,Keras 的好處就是對於現成的架構、資料集可以很簡單幾十行程式碼就能實現,不過因為Keras是高層的API,無法方便的對架構微調、實驗新的架構,要做這些事請考慮用Pytorch或Tensorflow
  • 研究與快速開發:Pytorch。
  • 向人群靠攏:Tensorflow。因為開發的比PyTorch早,很多專案都是用Tensorflow寫的。

PyTorch與Tensorflow的設計原則差異

PyTorch與Tensorflow的設計原則上,就差在PyTorch是「Define-by-Run」而Tensorflow是「Define-and-Run」。
兩者各是什麼意思,而實驗寫作起來又會有什麼差呢?要回答這個問題,我們直接以有DL界Hello World的MNIST為範例。
在看PyTorch MNIST時,你可以用一般解讀Python程式的順序:
Line 109: main()
Line 58:  def main():
Line 104: model = Net().to(device)  #定義模型,這時會呼叫class Net(nn.Module)的__init__函式,初始化網路架構
Line 104: train(args, model, device, train_loader, optimizer, epoch) #把模型丟進train函式裡
Line 27:  def train(args, model, device, train_loader, optimizer, epoch):
Line 32:  output = model(data) #實際把data輸入模型當中,這時會呼叫class Net(nn.Module)的forward函式,計算完網路forward後回傳softmax結果
看完這個流程,你或許會認為,這樣的流程不是理所當然嗎?
我們再來看Tensorflow MNIST的解讀方式
Line 126: def main(_):
Line 131~137: #定義網路架構,其中Line137會呼叫Line40的def deepnn(x)定義細部架構。定義完後就是「下好離手」,執行的時候不能再依執行的結果改變網路架構。
Line 157: #要把資料輸入網路前,必需先開一個 session,開session就像要開一個實驗場,才能對定義好的架構(graph)做實驗
Line 162165: #實際的訓練在此,每叫「run」一次,tensorflow就會把資料輸入進定義好的網路當中,這裡就是tensorflow與pytorch最大的差別,這時你不能用函式呼叫流程去理解 train_step.run ,因為這時你不會呼叫def deepnn(x),因此你在deepnn(x)裡面如果寫了print之類的程式碼,只有在定義網路時會印出來一次,run的時候完全不會印,因為run是執行定義好的那張computation graph,而不是deepnn函式。
Tensorflow的Computation graph設計是個兩面刃,在執行前先定義好計算圖,可以讓tensorflow在執行前最佳化計算,使訓練加快,但是缺點就是程式寫作不方便,無法如Python原本的語法一樣簡便

Comments

Popular posts from this blog

Ubuntu Chrome Remote Desktop Setting

Open3D: A Modern Library for 3D Data Processing