深度学习入门笔记(十五):深度学习框架(TensorFlow和Pytorch之争)
歡迎關注WX公眾號:【程序員管小亮】
專欄——深度學習入門筆記
聲明
1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
文章目錄
- 歡迎關注WX公眾號:【程序員管小亮】
- 專欄——深度學習入門筆記
- 聲明
- 深度學習入門筆記(十五):深度學習框架
- 1、深度學習框架
- 2、關于TensorFlow和Pytorch
- 3、TensorFlow
- 推薦閱讀
- 參考文章
深度學習入門筆記(十五):深度學習框架
1、深度學習框架
自從學習了深度學習之后,你應該發現了需要學習的東西很多,并且差不多已經開始從零學習了使用 Python 和 NumPy 實現深度學習算法,這樣很好,因為理解這些深度學習算法實際上到底是在做什么。但你會發現,除非應用更復雜的模型,例如卷積神經網絡,或者循環神經網絡,或者開始應用很大的模型,否則它就越來越不實用了,至少對大多數人而言,從零開始全部靠自己實現并不現實,尤其是做項目或者做課題等等。
幸運的是,現在有很多非常好并且成熟的深度學習軟件框架,可以幫助實現這些模型。它可以做矩陣乘法,并且在建很大的應用時,通過一個數值線性代數庫,它會更高效地實現矩陣乘法,總之利用一些深度學習框架會更加實用,會使工作更加有效。
那么都有哪些框架呢?
現在有許多深度學習框架,能讓實現神經網絡變得更簡單。每個框架都針對某一用戶或開發群體的,因為這些框架往往在不斷進化,每個月都在進步,如果你想選擇一個適合自己的框架,這里有幾點意見:
- 首先,一個重要的標準就是便于編程,這既包括神經網絡的開發和迭代,還包括為產品進行配置,為了成千上百萬,甚至上億用戶的實際使用,這取決于你想要做什么。
- 第二個重要的標準是運行速度,特別是訓練大數據集時,一些框架能讓你更高效地運行和訓練神經網絡,這取決于你的數據集詳細情況。
- 還有一個標準,人們不常提到,但我覺得很重要,那就是這個框架是否真的開放,要是一個框架真的開放,它不僅需要開源,而且需要良好的管理。幸運的是,現在有兩大框架——TensorFlow 和 Pytorch,雖然未來它們有可能出于某種原因選擇停止開源,即便現在這個軟件是以開源的形式發布的。但至少在短期內,應該是沒有大問題的;
- 最后一點,取決于你對語言的偏好,看你更喜歡 Python,Java 還是 C++ 或者其它什么(雖然現在大多數基于 python),也取決于你在開發的應用,是計算機視覺,還是自然語言處理或者線上廣告,等等。
2、關于TensorFlow和Pytorch
首先可以確定的是,TensorFlow 在大多數工業領域仍然處于領先地位,PyTorch 更被學術界鐘愛,但 PyTorch 正在取得進展并逐漸縮小和 TensorFlow 的差距。
數據科學家 Jeff Hale 從在線職位數量、頂會論文中的出現次數、在線搜索結果、開發者使用情況四個方面對兩個框架的現狀進行了調研,第一份調研結果發布于 2018 年 9 月。當時的 TensorFlow 是當時的絕對冠軍,無論是在 GitHub 活躍度、谷歌搜索量、Medium 文章數、亞馬遜書籍和 arXiv 論文等維度上所占的比重都是最大的。此外,TensorFlow 還擁有最多的開發者用戶,相關的網上職位描述也是最多的。
可以看到在當時,相比之下,PyTorch 只能排到第三,得分比當時的第二名 Keras 還要矮上一截,TensorFlow 在絕大多數指標中都是絕對冠軍。
而到了2019 年 4 月,Jeff Hale 發布了第二份調查結果。這次只過去 6 個月,結果發現,TensorFlow 雖然仍然是當時需求量最大、增長最快的框架,但 PyTorch 的起勢很足,增速已經超過了原來的第二名 Keras,。
而在谷歌搜索相對數量方面,TensorFlow 已經出現了負增長。
轉眼到了 2020 年,PyTorch 已經更新到了 1.4,增加了不少新特性,與業界開始結合,在谷歌云 TPU 上運行起來也更加容易。此外,PyTorch 的社區也在不斷擴大,比如最近的 OpenAI。TensorFlow 2.0 也引入了不少新的改進,使得 API 更加精簡,對大腦更加友好。此外,TensorFlow 緊密集成了 Keras 作為其前端和高級 API。果然我早就猜到 Keras 的結局,還想吐槽一句,TensorFlow 這個文檔問題還是。。。。爛的一塌糊涂。目前看來 PyTorch 在頂會論文中出現的次數最多,在 2019 NeurIPS 會議論文中,PyTorch 出現 166 次,TensorFlow 出現 74 次,這中差距不言而喻。
作為一個 TensorFlow 忠實用戶,希望 TensorFlow 2.0 能挽回挽回頹勢吧!!!
3、TensorFlow
在講 TensorFlow 程序的基本結構之前,先提一個啟發性的問題,假設有一個損失函數 JJJ 需要最小化,Jw=w2?10w+25Jw= w^{2}-10w+25Jw=w2?10w+25,也許你已經注意到該函數其實就是 (w?5)2{(w -5)}^{2}(w?5)2,所以使它最小的 www 值是5,但假設現在不知道這點,只有這個函數,那么如何怎樣用 TensorFlow 將其最小化?
Jupyter notebook 入門我們前面講過了,運行 Python。
import numpy as np #導入TensorFlow import tensorflow as tf #接下來,讓我們定義參數w, #在TensorFlow中,你要用tf.Variable()來定義參數 w = tf.Variable(0,dtype = tf.float32) #然后我們定義損失函數: cost = tf.add(tf.add(w**2,tf.multiply(- 10.,w)),25) #然后我們再寫優化器: train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) #讓我們用0.01的學習率,目標是最小化損失。 #最后下面的幾行是慣用表達式: init = tf.global_variables_initializer() #這樣就開啟了一個TensorFlow session。 session = tf.Session() #來初始化全局變量。 session.run(init) #然后讓TensorFlow評估一個變量,我們要用到: session.run(w) #開始訓練并輸出結果: print(session.run(w))如果運行這個程序,它評估 www 等于0,因為什么都還沒運行,哈哈。
#現在讓我們輸入: session.run(train) #接下來在運行了一步梯度下降法后,讓我們評估一下w的值,再print: print(session.run(w)) #在一步梯度下降法之后,w現在是0.1。
現在運行梯度下降1000次迭代:
這是運行了梯度下降的1000次迭代,最后 www 變成了4.99999,你應該記得上面說過 (w?5)2{(w -5)}^{2}(w?5)2 最小化時 www 的最優值是5,這個結果已經很接近了是不是。
希望這個小程序能讓你對 TensorFlow 程序的大致結構有了了解,如果你還是想快速學習一門編程語言,有一個方法推薦給你,就是去看看別人的代碼,多看多記,就知道哪些代碼是固定套路了。
這里有個地方要注意,www 是想要優化的參數,因此稱為變量,而在定義一個損失函數時,用到了 add 和 multiply 之類的函數,那么 TensorFlow 是如何對 add 和 mutiply,還有其它函數求導的呢?都看不到,這就是為什么只需基本實現前向傳播,框架自己就能弄明白如何做反向傳播和梯度計算,因為它已經內置在 add,multiply 和平方函數中,減少了操作的成本。
對了,要是覺得這種寫法不好看的話,TensorFlow 還重載了一般的加減運算等等,結果還是同樣的。
這個例子是將 www 的一個固定函數最小化了,如果想要最小化的函數是訓練集函數又如何呢?不管你有什么訓練數據 xxx,當訓練神經網絡時,訓練數據 xxx 會改變,那么如何把訓練數據加入 TensorFlow 程序呢?
還是要定義 xxx,把它想做扮演訓練數據的角色,當然事實上訓練數據有 xxx 和 yyy,但這個例子中只有 xxx,把 xxx 定義為:
x = tf.placeholder(tf.float32,[3,1])
讓它成為 [3,1][3,1][3,1] 數組,然后向量化,把 costcostcost 這個二次方程的三項前有固定的系數變成數據,即:
cost = x[0][0]*w**2 +x[1][0]*w + x[2][0]
現在 xxx 變成了控制這個二次函數系數的數據,這個 placeholder 函數告訴 TensorFlow,稍后會為 xxx 提供數值。
然后再定義一個數組
coefficient = np.array([[1.],[-10.],[25.]])
這就是要接入 xxx 的數據。
最后需要用某種方式把這個系數數組接入變量 xxx,即:
feed_dict = {x:coefficients}
好了,重新運行它,希望沒有語法錯誤,不然還得 debug:
現在如果想改變這個二次函數的系數:
coefficient = np.array([[1.],[-10.],[25.]])
改為:
coefficient = np.array([[1.],[-20.],[100.]])
現在這個函數就變成了(w?10)2{(w -10)}^{2}(w?10)2,如果重新運行,(w?10)2{(w -10)}^{2}(w?10)2 最小化的 www 值應該是10。
很好,在梯度下降1000次迭代之后,得到接近10的 www。
希望這讓你了解了 TensorFlow 能做什么,個人覺得它最強大的就是只需說明如何計算損失函數,它就能求導,而且用一兩行代碼就能運用梯度優化器,Adam 優化器或者其他優化器。
還有最后一點想提一下的是,這三行(藍色大括號部分)在 TensorFlow 里是符合表達習慣的,有些程序員會用這種形式來替代,作用基本上是一樣的!!!但這個 with 結構也會在很多 TensorFlow 程序中用到,它的意思基本上和左邊的相同,但是 Python 中的 with 命令更方便清理,以防在執行這個內循環時出現錯誤或例外。
那么這個代碼到底做了什么呢?
我們看這個等式:
cost =x[0][0]*w**2 +x[1][0]*w + x[2][0]#(w-5)**2
TensorFlow 程序的核心是計算損失函數,然后 TensorFlow 自動計算出導數,以及如何最小化損失,因此這個等式或者這行代碼所做的就是讓 TensorFlow 建立 計算圖,計算圖 所做的就是取 x[0][0]x[0][0]x[0][0],取 www,然后將它平方,然后 x[0][0]x[0][0]x[0][0] 和 w2w^{2}w2 相乘,就得到了 x[0][0]?w2x[0][0]*w^{2}x[0][0]?w2,以此類推,最終整個建立起來計算 cost=[0][0]?w??2+x[1][0]?w+x[2][0]cost = [0][0]*w**2 + x[1][0]*w + x[2][0]cost=[0][0]?w??2+x[1][0]?w+x[2][0],最后得到了損失函數。
TensorFlow 的優點在于,通過用這個計算損失,計算圖基本實現前向傳播,TensorFlow 已經內置了所有必要的反向函數,回憶一下訓練深度神經網絡時的一組前向函數和一組反向函數,而像 TensorFlow 之類的編程框架已經內置了必要的反向函數,這也是為什么通過內置函數來計算前向函數,它也能自動用反向函數來實現反向傳播,這就是為什么不需要明確實現反向傳播,這是編程框架能幫你變得高效的原因之一。
在編程框架中,你可以用一行代碼做很多事情,例如,不想用梯度下降法,而是想用 Adam 優化器,只要改變這行代碼,就能很快換掉它,換成更好的優化算法。所有現代深度學習編程框架都支持這樣的功能,讓你很容易就能編寫復雜的神經網絡,這樣在嘗試不同組合時,能極大地降低操作成本!!!
簡單的學習到這里就結束了,如果想繼續學習更多的,可以選擇一本書籍或者是一個系列專欄進行學習,然后快速進行使用,以免忘記,祝你成功!
推薦閱讀
- 深度學習入門筆記(一):深度學習引言
- 深度學習入門筆記(二):神經網絡基礎
- 深度學習入門筆記(三):求導和計算圖
- 深度學習入門筆記(四):向量化
- 深度學習入門筆記(五):神經網絡的編程基礎
- 深度學習入門筆記(六):淺層神經網絡
- 深度學習入門筆記(七):深層神經網絡
- 深度學習入門筆記(八):深層網絡的原理
- 深度學習入門筆記(九):深度學習數據處理
- 深度學習入門筆記(十):正則化
- 深度學習入門筆記(十一):權重初始化
- 深度學習入門筆記(十二):深度學習數據讀取
- 深度學習入門筆記(十三):批歸一化(Batch Normalization)
- 深度學習入門筆記(十四):Softmax
- 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
- 深度學習入門筆記(十六):計算機視覺之邊緣檢測
- 深度學習入門筆記(十七):深度學習的極限在哪?
- 深度學習入門筆記(十八):卷積神經網絡(一)
- 深度學習入門筆記(十九):卷積神經網絡(二)
- 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)
參考文章
- 吳恩達——《神經網絡和深度學習》視頻課程
- https://towardsdatascience.com/is-pytorch-catching-tensorflow-ca88f9128304
總結
以上是生活随笔為你收集整理的深度学习入门笔记(十五):深度学习框架(TensorFlow和Pytorch之争)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL server数据库实验(三)数据
- 下一篇: 信用卡分销系统源码、分销系统定制贴牌、信