譯者序
前言
序
實踐練習
1.TensorFlow基礎
2.TensorFlow中實現線性回歸
3.TensorFlow中實現聚類
4.TensorFlow中單層神經網絡
5.TensorFlow中多層神經網絡
6.并發
結束
致謝
關于作者,BSC,UPC,GEMLeB
參考
關于本書
譯者序
? ? ? 本人對一直對高性能網絡服務器,分布式存儲比較感興趣,在BAT時也一直從事架構開發,并沒有做過機器學習相關工作,平時喜歡閱讀分析開源代碼,到目前為止已分析完約8套開源代碼; 這次趁著Google開源TensorFlow,想往深度學習方向嘗試一下,先學習分析下TensorFlow的使用與源碼,在查閱資料時,發現本書對工程師背景的人非常有幫助,完全考慮了工程師的思維方式,因為原書作者也是工程師背景,但原書有西班牙語與英文版,不方便擴散閱讀,為了使有更多工程師背景的同學看到此書,故努力翻譯成中文版,因本人英文水平有限,翻譯有錯的地方,歡迎批評指正~~~
? ? ?后面會在微信公眾號中推送后續的翻譯章節,與TensorFlow的第一次接觸系列已整理成pdf,關注公眾號后回復:tensorflow即可下載~~公眾號:源碼之心
前言
? ? ? 受益于計算,海量數據存儲,互聯網技術等關鍵技術的快速發展,機器學習領域同樣得到了巨大發展。自動學習直接或間接地影響了很多人日常生活中的各種活動與方面。比如在我們手機上進行語音識別,圖像分類或檢測垃圾郵件,這在十幾年以前聽上去只能出現在科幻中。在股票交易模型或藥物模型中使用機器學習已經巨大影響了我們的社會。另外,在不久的將來,無人駕駛,無人機與各種類型的機器人都將深遠的影響我們的社會。
? ? ? 作為機器學習一個子類的深度學習,自2006年重現后,已經毫無疑問成為一個爆炸式增長的領域。其實,在硅谷的很多創業公司都在從事這個方向,像Google,Facebook,微軟,IBM這樣的大公司也擁有開發與研究小組。深度學習甚至已經在大學與研究領域外引起了廣泛興趣,很多專業雜志(如Wired),甚至一般雜志(如New?York Times, Bloomberg or BBC)都開始發表該領域的相關文章。
? ? ? 這一趨勢已經吸引很多學生,創業者和投資者加入深度學習。由于吸引了很多人的興趣,一些工具庫也已經以開源的形式開放出來,作為Caffe庫的主要推廣者,該庫由我們2012年在Berkeley讀博士期間開發,我可以說這本書中介紹的由Google設計研發的TensorFlow,我從2013年就開始研究,將會成為研究者與SME公司用來研發深度學習與機器學習的主要工具之一。大量工程師與頂級科學家加入該項目會成為其強有力的保證,最終會推動開源。
? ? ? 我希望這本入門書能幫助有興趣加入這個領域的讀者,衷心感謝本書原作者在努力傳播本技術,也很榮幸能認識他。原作者在TensorFlow開源2個月后及時地寫了本書(第一版為西班牙語)。充滿生命力的巴塞羅那及它想在參與這場技術變革,該技術必將深遠影響我們的各種生活領域。
序
? ? ? 本書的目的是給想擴展機器學習知識的工程師們傳播該思想。我相信任何一個有工程背景的人,都將會發現深度學習的應用與一般的機器學習都會對他們的工作非常有價值。
? ? ? 基于我的背景,讀者可能好奇我為何要挑戰寫關于這項新的深度學習技術。我研究的重點逐漸從超級計算架構與大數據負載運行時可執行中間件過渡到基于海量數據的機器學習平臺。
? ? ? 準確的來說,作為一個工程師,而不是數據科學家,我認為我可以通過這本書做出貢獻,而且它會對很多初學的工程師非常有幫助,接下來他們會自己選擇如何進一步學習。
? ? ? 希望這本書可以為我所熱愛的教育事業添加一些價值。我認為知識是自由的,并且可以被所有人接觸。基于這個原因,這本書的內容會完全免費地放在網上(原書名:first contact with tensorflow),如果讀者覺的本書內容有用,并認可作者的付出,有一個按鈕可進行捐贈,另外,如果讀者想獲得紙質版本,可在Amazon上購買。
? ? ?西班牙版本的本書依然可用。其實,本書翻譯自西班牙語版本,該書完成于去年1月并在GEMLeB會議上發表。
? ? ?感謝閱讀本書!這是對我寫作本書的肯定。認識我的人都知道,我熱衷于傳播技術,它驅使我保持學習。
實踐練習
? ? ? 深度學習的一個通用應用是模式識別。就像你在剛開始學編程的時候從“Hello word”開始,在深度學習中,從識別手寫數字建模開始。接下來分析的第一個神經網絡模型,就會涉及到叫作TensorFlow的新機器學習技術。
? ? ? 當然,我不想寫一本關于機器學習或深度學習的學術書籍,我只希望TensorFlow這個新的機器學習庫能盡快的進入大眾視野。我也會向我的數據科學家同事們說聲抱歉,因為我會向普通讀者傳播該領域的知識。
? ? ? 讀者會發現一些在我課程里經常使用的組織結構,這是想讓你在學習的時候多動手。我們將這叫做“從實踐中學習”,從在UPC作教授的多年經驗來看,這個方法對工程師學習一個新領域十分有用。
? ? ? 因為這個原因,本書從實踐出發,而且我已經盡量減少理論部分。不過在學習算法過程中有必要的地方,還是保留了一些數學理論推導。
? ? ? 假設讀者已經對機器學習有了一定的理解,我會使用一些流行的算法逐步指導讀者作用TensorFlow進行訓練。
? ? ? 第一章中,首先介紹下TensorFlow將會扮演重要角色的機器學習場景,再借機會介紹TensorFlow程序的基本結構及簡明闡述其在內部保持的數據結構。
? ? ? 第二章中,通過一個線性回歸的例子,我會闡述一些基本代碼,同時說明在學習過程中如何調用各種重要組件,比如cost function或梯度下降優化算法。
? ? ? 第三章中,詳細介紹了聚類算法,會詳細分析TensorFlow的基本數據結構—tensor,TensorFlow庫提供了不同的創建與管理tensor的類與函數。
? ? ? 第四章中,詳細分析如何構建單層神經網絡來識別手寫數字。通過這個例子,我們可以梳理前幾章闡述的各種觀念以及創建模型與測試模型的整個過程。
? ? ? 第五章中基于前一章中介紹的神經網絡概念,介紹如何構建一個多層神經網絡來獲得更精確的識別手寫數字。在這會詳細介紹眾所周知的卷積神經網絡。
? ? ? 第六章中,我們會分析一個具體的例子—利用GPU強大的計算能力,也許并不是所有的讀者都會感興趣。正如在第一章中介紹的,GPU在訓練神經網絡過程中發揮了重要作用。
? ? ? 本書的結束語中總結了一些結論。再次說明,本書中的代碼都可以通過Github上獲得。
一.TensorFlow基礎
? ? ? 本章中,簡要說明TensorFlow代碼與編程模型。通過閱讀本章,希望讀者有能力在自己的電腦上安裝TensorFlow庫。
開源庫
? ? ? 機器學習已經在學術圈研究了幾十年,但只是在最近幾年公司才參與其中。這得益于已經擁有的大規模數據以及空前的計算能力變的可用。在這種情況下,Alphabet旗下的Google毫無疑問成為了在產品中使用機器學習的最大公司之一。
? ? ? ?去年十月,在Google的季度會議上,可以看到其在銷售額與利潤上的顯著增長,CEO SundarPichai明確表明,機器學習是我們重新思考我們所做所有事的核心與創新方式。
? ? ? 準確的來說,我們處在一個變革的紀元,Google并是唯一一個大角色。其它科技公司如微軟,Facebook,Amazon,Apple及其它很多大公司都已經在該領域投入大量研發。
? ? ? 幾個月前,Google基于Apache2.0協議開源了TensorFlow,開發者與研究者可以在他們的工程與產品中通過該庫使用機器學習算法。與此同時,Google內部也在不同的商業產品如Gmail,Google Photos,搜索,語音識別中使用TensorFlow。
? ? ? TensorFlow最初由Google大腦小組研發,其目的是集中于機器學習與神經網絡研究,但該系統同樣也適用于更廣泛的機器學習問題。
? ? ? 因為我是一個工程師,同時本書也面向工程師,本書會詳細分析機器學習算法是如何用數據流圖描述的。TensorFlow可以被看作一個使用數據流圖進行數值計算的庫。圖中的節點代表數學操作,圖中連結各頂點的邊代表多維數組,也叫tensors。
? ? ? TensorFlow包含了構建數據流圖與計算數據流圖的基本步驟,數據流圖代表了稍后需要數值計算的符號操作。這使得TensorFlow可以充分利用各平臺上的CPU與GPU,包括Linux 64位所有平臺如Mac?OSX及移動平臺如Android與iOS。
? ? ? TensorFlow的另外一個優勢是它擁有一個虛擬的TensorBoard模塊,該模塊可以監控與顯示算法如何運行。可以測量與顯示算法的運行情況對于創建一個更好的模型十分有幫助。我有一種推測現在很多模型都在通過有點盲目的方式來調優,如不停嘗試與試錯,這明顯浪費了很多資源,尤其是時間。
TensorFlow Serving
? ? ? 最近Google發布了TensorFlowServing,幫助開發者把他們TensorFlow訓練的模型(甚至可以擴展到其它類型的模型)部署到生產環境中。TensorFlow Serving是一個基于Apache 2.0協議的C++開源系統,目前可通過github獲得。
? ? ? TensorFlow與TensorFlow Serving的區別是什么呢?通過TensorFlow,開發者可以很容易的建立機器學習算法并通過一定格式的數據輸入進行訓練模型。TensorFlow Serving專注于使得這些模型在生產環境中使用。設計目的是開發者通過TensroFlow訓練模型,使用TensorFlow?Serving的API響應客戶端的外部請求。這使得開發者可以基于隨著時間變化的真實數據對不同模型進行實驗,原地得到一個穩定的架構與API。
? ? ?經典的pipeline過程是訓練數據輸入到學習器中,輸出一個模型,此模型經過驗證后可以部署到TensorFlow serving系統。隨著新數據的產生或改進模型,經常要迭代我們的模型。實際上,在google發表的相關論方中也提到,它們內部會有很多pipelines同時運行,新數據到來后會產生新版本的模型。
? ? 開發者在前端通過grpc與TensorFlow Serving進行通信,grpc是一個高性能,google開源的RPC框架。
? ? 如果讀者對TensorFlow Serving感興趣,建議你閱讀Serving architecture overview小節,接下來安裝你的環境,開始基礎練習。
TensorFlow安裝
? ? ? 從現在開始,建議讀者開始在你的電腦上進行動手練習,TensorFlow有Python API(也有C/C++版本),它需要提前安裝Python2.7。
? ? ? 一般而言,當你使用Python時,你應該安裝虛擬環境virtualenv。Virtualenv是一個可以使一臺機算機上不同部分的Python依賴保持獨立。如果我們使用virtualenv安裝TensorFlow時,不會覆蓋其它工程中TensorFlow中需要的Python庫版本。
? ? ?首先,需要提前先安裝pip與virtualenv,如下面的命令所示,
# Ubuntu/Linux64-bit
$ sudo apt-getinstall python-pip python-dev python-virtualenv
# Mac OS X
$ sudoeasy_install pip
$ sudo pipinstall --upgrade virtualenv
environment
virtualenv的目錄:~/tensorflow:
$ virtualenv --system-site-packages~/tensorflow
接下來是激活virtualenv,命令如下:
$ source~/tensorflow/bin/activate #with bash
$ source~/tensorflow/bin/activate.csh #with csh
(tensorflow)$
? ? ?從現在開始,我們使用的虛擬環境的名字會出現在每一個命令行的開頭,一旦激活了virtualenv,可以在虛擬環境里直接通過pip安裝TensorFlow,
# Ubuntu/Linux64-bit, CPU only:
(tensorflow)$sudo pip install --upgradehttps://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# Mac OS X, CPUonly:
(tensorflow)$sudo easy_install --upgrade six
(tensorflow)$sudo pip install --upgradehttps://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl
? ? ?建議讀者訪問官方文檔主頁,安裝最新穩定版本的TensorFlow。
? ? ?如果你的平臺上有GPU,安裝的版本會稍有不同。同樣建議讀者訪問官方文檔,查看你的GPU是否滿足支持TensorFlow。如果需要TensorFlow支持GPU,需要安裝額外的開發包,所有需要的信息都能在TensorFlow的下載與安裝頁面了解到。如想了解更多使用GPU的信息,建議閱讀第六章。
? ? ?最后,使用完畢后,應該使用如下命令停止虛擬環境:
(tensorflow)$deactivate
由于本書的寫作目的所限制,建議讀者訪問之前提到的官方文檔主頁,了解其它安裝TensorFlow的方式。
TensorFlow中的第一段代碼
? ? ?正如開篇所說的,我們將通過少量理論與大量練習來學習TensorFlow。
? ? ?從現在開始,讀者可以使用任何文檔編輯器來寫Python代碼并保存為以.py結尾的文件。通過類似如下命令來運行代碼:python test.py
? ? 為了先對TensorFlow的代碼風格有第一認識,建議先寫一個簡單的乘法代碼示例,詳細如下:
import tensorflow as tf
a =tf.placeholder("float")
b =tf.placeholder("float")
y = tf.mul(a,b)
sess = tf.Session()
printsess.run(y, feed_dict={a: 3, b: 3})
? ? ? 此代碼中,在導入Python模塊tensorFlow后,我們定義兩個符號變量placeholder,隨后在代碼執行的時候可以操作這兩個變量。然后,我們將這兩個變量作為參數傳給我們調用的乘法函數,tf.mul是眾多數學運算中的一個,TensorFlow提供這些函數來操作tensors。在這里,tensors可以看作是動態大小,多維的元素數組。
主要的數學運算操作如下表所示:
Operation ? ??Description
tf.add ? ? ? ?sum
tf.sub ? ? ? ?substraction
tf.mul ? ? ? ?multiplication
tf.div ? ? ? ??division
tf.mod ? ? ? module
tf.abs ? ? ? ??return the absolute value
tf.neg ? ? ? ??return negative value
tf.sign ? ? ? ?return the sign
tf.inv ? ? ? ? ?returns the inverse
tf.square ? ?calculates the square
tf.round ? ? ?returns the nearest integer
tf.sqrt ? ? ? ??calculates the square root
tf.pow ? ? ? ? calculates the power
tf.exp ? ? ? ? ?calculates the exponential
tf.log ? ? ? ? ??calculates the logarithm
tf.maximum ??returns the maximum
tf.minimum ? ?returns the minimum
tf.cos ? ? ? ? ? ??calculates the cosine
tf.sin ? ? ? ? ? ? ?calculates the sine
TensorFlow也為程序員提供了一系統操作矩陣的函數,其中一些如下所述:
Operation ? ? ?Description
tf.diag ? ? ? ??returns a diagonal tensor with a given? diagonal values
tf.transpose ? ? ?returns the transposes of the argument
tf.matmul ? ? ? ? ?returns a tensor product of multiplying two? tensors listed as arguments
tf.matrix_determinant ? ? ?returns the determinant of the square matrix? specified as an argument
tf.matrix_inverse ? ? ? ? ? ??returns the inverse of the square matrix? specified as an argument
? ? ? 接下來最重要的一步就是創建一個session,用來計算生成的符號表達式。實際上,到現在為止TensorFlow代碼并沒有被執行。需要再次強調,TensorFlow既是一個表示機器學習算法的接口,又是運行機器學習算法的實現,該示例就是一個很好的例子。
? ? ? 通過Session()接口創建一個session后,只有調用run()方法后才開始真正的被執行。在這個代碼示例中,變量的值通過feed_dict參數傳給run()。相關代碼解析表達式并顯示乘法結果為9再退出。
? ? ? 通過這個示例,我想闡明的是,正常使用TensorFlow編程的步驟為:首先定義實現整個問題,其次,創建一個session來運行相關計算。
? ? ? 也許有時候我們希望更加靈活地構建代碼,如在圖中插入一個操作或只運行圖的子圖,當我們在使用Python的交互式環境IPython時就會發生這種情況。為了解決這個問題,TensorFlow提供了tf.InteractiveSession()類。
? ? ? 這種編程模型的設計初衷超過了本書的討論范圍。為繼續閱讀下一章,讀者只需要知道所有信息都保存在圖結構的內部,這些信息包含了所有運算操作與數據。
? ? ? 圖用來描述數學計算。圖中的結點實現了具體數學運算操作,同時它們也代表了數據流入,結果輸出,讀寫持久化變量的點。圖中的邊代表了結點間的相互關系及結點的輸入與輸出,同時,邊也包含了tensors,也就是TensorFlow中的基本數據結構。
? ? ? 圖中隱含的信息使得TensorFlow可以推斷出事務之間的依賴及異步的調度運算操作到各設備。當這些運算操作所依賴的輸入都已經就緒后,就可以并發運行這些運算。并發可以使得我們縮短對一些計算密集型算法的運算時間,同時TensorFlow中也提供一些復雜運算的高效實現對縮短計算時間也會有幫助。另外,大部分的這些操作都有相關的kernels,kernels是對具體設備的操作實現,如GPU設備。下表總結了一些重要的操作/kernels:
Operations groups ? ? ? ? ??Operations
Maths ? ? ? ? ? ? ? ? ?Add, Sub, Mul, Div, Exp, Log, Greater, Less,? Equal
Array ? ? ? ? ? ? ? ? ??Concat, Slice, Split, Constant, Rank, Shape,? Shuffle
Matrix ? ? ? ? ? ? ? ? MatMul, MatrixInverse, MatrixDeterminant
Neuronal Network ? ? ? ?SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool
Checkpointing ? ? ? ? ? ??Save, Restore
Queues and syncronizations ? ? ? ? ?Enqueue, Dequeue, MutexAcquire, MutexRelease
Flow control ? ? ? ? ? ?Merge, Switch, Enter, Leave, NextIteration
顯示Tensorboard面板
? ? ? 為了使得算法更加容易理解,TensorFlow中的可視化工具包含了一些debug函數與優化程序,該可視化工具叫Tensorboard。Tensorboard中可察看不同類型的統計與圖中任一部分的計算細節。
? ? ? Tensorboard模塊中顯示的數據來源于TensorFlow的執行過程,計算過程中的狀態信息被抽取保存到trace files中。在TensorFlow的官方文檔中,可以看到更加詳細的該Python API的實現細節。
? ? ? 啟動Tensorboard服務十分簡單,直接在命令行中執行相關命令,并傳遞文件名為參數,命令如下:
(tensorflow)$ tensorboard --logdir= trace file;
? ? ? 你可以在瀏覽器中訪問本地6006端口來查看Tensorboad信息,如http://localhost:6006/
? ? ? 對Tensorboard的研究同樣超出了本書的討論范圍。關于Tensorboard如何實現的詳細細節,讀者可查閱Tensorflow文檔中的Tensorboard圖形可視化小節。