【AI理論】深度學習筆記 | 第20講:再談三大深度學習框架TensorFlow、Keras和PyTorch
1
概述
我們先來看一張柱狀圖,圖中顯示了2018年各主要深度學習框架的綜合得分排名情況:
數據來源:https://www.kaggle.com/discdiver/deep-learning-framework-power-scores-2018
可以看到:TensorFlow、Keras和PyTorch這三種框架分別位于排行榜前三位,其他小眾框架則影響力微弱,比如Theano雖然歷史悠久、但實在是太老了,開發團隊早已停止開發和維護了;MXNet雖然不錯,亞馬遜也在用,但相較于前三個確實小眾了很多;CNTK是微軟推出的深度學習計算框架,但一直一來所獲得的關注度也很有限;至于Caffe,由于其本身是由C++編寫,也提供了Python接口,但在最新的更新Caffe2中已經被整合進了PyTorch里面去了,所以直接用PyTorch替代即可。正是由于上述原因,筆者這里選擇TensorFlow、Keras和PyTorch作為本篇概述的主要內容。
對于初次踏入深度學習的人員而言,選擇哪一門計算框架是一個值得思考的問題,包括小編自己也有這樣的疑問。通過這大半年以來的學習經驗,小編想說的是,如果是一定要選出一個框架作為你的深度學習入門工具,建議是Keras,Keras具備搭建神經網絡各個零部件高度集成的API,對新手非常友好,基于Keras進行一次快速的深度學習試驗幾乎是分分鐘的事情。相對熟練之后我的建議是不要繼續停留在Keras的舒適區,你應該繼續學習其他計算框架,無論是流行度第一的TensorFlow還是異軍突起的PyTorch,你都得學,包括小編自己,現在也在跟著PyTorch的文檔在深入學習。假如你只學了TensorFlow,有一個你非常感興趣的深度學習項目,結果對方是用PyTorch寫的,如果你一點也不懂PyTorch,豈不是很尷尬,再說PyTorch在2018年下半年在一段時間內的熱度已經趕超TensorFlow了。
所以對于框架而言,筆者的建議在于:先選一門Keras作為入門,熟練之后直接學習TensorFlow和PyTorch,理論結合實踐,多動手,相信對于學習深度學習而言,工具不會是大問題。
下面我們就再次單獨來看一下TensorFlow、Keras和PyTorch這三大深度學習計算框架。
2
TensorFlow
作為Google開發維護的深度學習工具,TensorFlow應該是目前最為流行和使用率最高的深度學習計算框架了。它是用C ++ / Python編寫的,提供Python,R、Java,Go和JavaScript API。TensorFlow使用靜態計算圖,盡管最近發布的TensorFlow Fold庫也增加了對動態圖的支持。此外,從版本1.7開始,TensorFlow在動態執行方面采取了不同的步驟,并實現了可以立即評估Python代碼的急切執行,而無需構建圖形。
另外TensorFlow也有著非常好的社區環境支持,你可以輕易的從網上找到很多有關TensorFlow使用教程、視頻,在線課程和教程等等。除了純粹的計算功能外,TensorFlow還提供了TensorBoard這樣的性能監控工具,它可以顯示計算圖,繪制關于模型訓練或推理執行的量化指標,并基本上提供調試和微調深度神經網絡所需的各種信息。
TensorFlow雖然很棒,但對于初學者來說并不友好,初學者用TensorFlow來搭建神經網絡需要一個思維轉變,總體來說TensorFlow沒那么容易。
基于TensorFlow搭建神經網絡的簡單例子:
import numpy as np
import tensorflow as tf data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = tf.placeholder(tf.float32, shape=(data_size, input_size)) target = tf.placeholder(tf.float32, shape=(data_size, output_size)) h1_w1 = tf.Variable(tf.random_uniform((input_size, hidden1_output))) h2_w1 = tf.Variable(tf.random_uniform((hidden1_output, output_size))) hidden1_out = tf.maximum(tf.matmul(data, h1_w1), 0) target_ = tf.matmul(hidden1_out, h2_w1) loss = tf.losses.mean_squared_error(target_, target) opt = tf.train.GradientDescentOptimizer(1e-3) upd = opt.minimize(loss)with tf.Session() as sess: ? ?sess.run(tf.global_variables_initializer()) ? ?feed = {data: np.random.randn(data_size, input_size), ? ? ? ? ? ?target: np.random.randn(data_size, output_size)}
for step in range(100): ? ? ? ?loss_val, _ = sess.run([loss, upd], feed_dict=feed)
3
Keras
再來看Keras。
Keras是一個高層神經網絡API,Keras由純Python編寫而成并基TensorFlow、Theano以及CNTK后端。所以我們也可以直接使用TensorFlow調用Keras。Keras 為支持快速實驗而生,能夠把你的想法迅速轉換為結果,Keras的主要優點如下:
簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
支持CNN和RNN,或二者的結合
無縫CPU和GPU切換
Keras非常易于學習和使用。無論是初學者還是不打算進行復雜研究的高級深度學習研究員,筆者都建議你使用Keras。Keras的設計原則:
用戶友好:用戶的使用體驗始終是我們考慮的首要和中心內容。Keras遵循減少認知困難的最佳實踐:Keras提供一致而簡潔的API, 能夠極大減少一般應用下用戶的工作量,同時,Keras提供清晰和具有實踐意義的bug反饋。
模塊性:模型可理解為一個層的序列或數據的運算圖,完全可配置的模塊可以用最少的代價自由組合在一起。具體而言,網絡層、損失函數、優化器、初始化策略、激活函數、正則化方法都是獨立的模塊,你可以使用它們來構建自己的模型。
易擴展性:添加新模塊超級容易,只需要仿照現有的模塊編寫新的類或函數即可。創建新模塊的便利性使得Keras更適合于先進的研究工作。
與Python協作:Keras沒有單獨的模型配置文件類型(作為對比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,并提供了擴展的便利性。
將前面TensorFlow的例子再用Keras寫一遍如下:
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = np.random.randn(data_size, input_size) target = np.random.randn(data_size, output_size) model = Sequential() model.add(Dense(hidden1_output, ? ? ? ? ? ? ? ?input_shape=(input_size,), activation=tf.nn.relu)) model.add(Dense(output_size)) model.compile(loss='mean_squared_error', ? ? ? ? ? ? ?optimizer=SGD(lr=1e-3)) model.fit(data, target, epochs=100, batch_size=data_size)
4
PyTorch
最后是PyTorch。
PyTorch是一款可以媲美于 TensorFlow 優秀的深度學習計算框架,但又相比于 TensorFlow 在語法上更具備靈活性。PyTorch原生于一款小眾語言lua,而后基于python 版本后具備了強大的生命力。作為一款基于 python 的深度學習計算庫,PyTorch提供了高于 numpy 的強大的張量計算能力和兼具靈活度和速度的深度學習研究功能。
PyTorch已經于今年10月份發布了1.0版本,標識著PyTorch正式走向了穩定可用階段。在最新的 ICLR 2019 提交論文中,提及TensorFlow的論文數量從228升到了266,而提及PyTorch的論文數量從 2018 年的 87 激增到了252。這也從側面說明PyTorch影響力今非昔比。
基于PyTorch搭建神經網絡示例:
import torch
import torch.nn as nn
import torch.nn.functional as fun data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = torch.randn(data_size, input_size) target = torch.randn(data_size, output_size) model = nn.Sequential( ? ?nn.Linear(input_size, hidden1_output), ? ?nn.ReLU(), ? ?nn.Linear(hidden1_output, output_size) ) opt = torch.optim.SGD(model.parameters(), lr=1e-3)
for step in range(100): ? ?target_ = model(data) ? ?loss = fun.mse_loss(target_, target) ? ?loss.backward() ? ?opt.step() ? ?opt.zero_grad()
最后的結論就是:對于TensorFlow、Keras和PyTorch這三種深度學習計算框架,大家最好都要學習!
轉自:https://mp.weixin.qq.com/s/ul4deOMigf11LttiYk1A3Q
EI 人工智能 深度學習 AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。