本書共有4部分,分9章。第壹部分對TensorFlow的歷史脈絡(luò)進行了簡要的梳理,介紹在安裝TensorFlow時應(yīng)當(dāng)考慮的因素,并給出了詳細(xì)的TensorFlow安裝指南;第二部分深入介紹TensorFlowAPI的基礎(chǔ)知識;第三部分關(guān)注一種更為復(fù)雜的深度學(xué)習(xí)模型,首先對模型進行描述,然后介紹如何用可視化的數(shù)據(jù)流圖表示所要創(chuàng)建的模型,以及如何利用TensorFlow有效地構(gòu)建這些模型;本書的后一部分探討TensorFlowAPI中新推出的特性,內(nèi)容包括如何準(zhǔn)備用于部署的模型、一些有用的編程模式,以及其他精選主題。
The Translator's Words
譯 者 序
我們正處在一個激動人心的時代,深度學(xué)習(xí)作為近年來最具突破性的技術(shù)之一,極大地推動了人工智能領(lǐng)域的研究進程,并迅速滲透各行各業(yè),同時帶動了一大批如家庭服務(wù)機器人、自動駕駛這樣的新興產(chǎn)業(yè)。不夸張地說,深度學(xué)習(xí)技術(shù)正在深刻地影響著人們的工作、生活和思維方式。
為了幫助人們更高效地從事深度學(xué)習(xí)研究和應(yīng)用,并積極分享其研究成果,優(yōu)秀的開源深度學(xué)習(xí)框架如雨后春筍般不斷涌現(xiàn)。作為深度學(xué)習(xí)領(lǐng)域巨擘之一的Google也在2015年11月將自己的第二代分布式機器學(xué)習(xí)系統(tǒng)TensorFlow開源。雖然發(fā)布時間較晚,但憑借Google在業(yè)內(nèi)廣泛而巨大的影響力以及頂尖的人工智能研究水平,其代碼的簡潔性、部署的便利性,以及在學(xué)術(shù)研究和產(chǎn)品研發(fā)兩端取得的良好平衡,在極短的時間內(nèi)便從眾多優(yōu)秀的深度學(xué)習(xí)框架中脫穎而出,獲得了廣大開發(fā)者的強烈關(guān)注。自公開發(fā)布以來,TensorFlow始終保持著兼收并蓄的態(tài)勢,不斷地從其他優(yōu)秀開源框架中汲取優(yōu)秀特性,在廣大研究和開發(fā)人員的強力推動下,不斷快速迭代并大幅提升代碼的效率,平均每周的代碼更新量都超過了萬行,所形成的社區(qū)開創(chuàng)了空前的活躍度。完全可以預(yù)見,TensorFlow將長期位列一流開源框架的行列。
雖然TensorFlow的優(yōu)點數(shù)不勝數(shù),但其“不足”也較為突出,那就是其接口過于復(fù)雜,對初學(xué)者的編程技能和知識水平要求偏高,學(xué)習(xí)曲線過陡。本書的問世在一定程度上緩解了這個矛盾。本書的幾位作者都來自Google的研發(fā)一線,他們用自己的寶貴經(jīng)驗,結(jié)合眾多高質(zhì)量的代碼,生動講解了TensorFlow的底層原理,并從實戰(zhàn)角度介紹了如何將兩種常見模型——深度卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)應(yīng)用到圖像理解和自然語言處理的典型任務(wù)中。難能可貴的是,他們還介紹了在模型部署和編程中可用的諸多實用技巧?傊緯浅_m合TensorFlow的入門學(xué)習(xí)。
需要說明的是,這并不是一本機器學(xué)習(xí)理論或深度學(xué)習(xí)的入門讀物,閱讀本書需要讀者對經(jīng)典機器學(xué)習(xí)理論和算法、深度卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)的基本原理有初步的了解,并對Python編程和常用的Python庫(如NumPy和matplotlib)較為熟悉。另外,本書的代碼是基于TensorFlow 0.8版的,譯者對0.9版所做的接口變動以“譯者注”的形式做了部分說明,并對原書中的一些錯誤進行了訂正。盡管TensorFlow 1.0版已經(jīng)正式發(fā)布,接口升級相比以往任何一版都要更多,但筆者認(rèn)為讀者朋友大可不必過于擔(dān)憂。只要清楚地掌握了TensorFlow的基本原理和Python編程,并勤于借助互聯(lián)網(wǎng),相信接口問題都可迎刃而解。同時,為方便廣大讀者的學(xué)習(xí),原書作者和譯者也會抽時間對本書中的實例代碼按照TensorFlow最新版本進行升級,請大家關(guān)注原出版社和機械工業(yè)出版社相關(guān)主題的后續(xù)圖書。
感謝機械工業(yè)出版社張夢玲編輯在本書翻譯過程中給予的諸多幫助,也感謝家人對我無微不至的關(guān)心。
深入理解深度學(xué)習(xí),從了解優(yōu)秀的開源框架開始,愿讀者朋友們的TensorFlow學(xué)習(xí)之旅一帆風(fēng)順!
段菲
2017年3月3日
PREFACE
前 言
歡迎
自2015年11月TensorFlow第一個開源版本發(fā)布以來,它便迅速躋身于最激動人心的機器學(xué)習(xí)庫的行列,并在科研、產(chǎn)品和教育等領(lǐng)域正在得到日益廣泛的應(yīng)用。這個庫也在不斷地得到改進、充實和優(yōu)化。與此同時,TensorFlow社區(qū)正以驚人的速度發(fā)展壯大。無論你是新手還是有經(jīng)驗的用戶,筆者都希望通過本書幫助你提升使用TensorFlow的能力,使你自如地充分利用這個功能強大的開源庫。
本書的內(nèi)容編排
第一部分:開啟TensorFlow之旅
本書第一部分將幫助讀者做好使用TensorFlow的準(zhǔn)備。第1章為引言,對TensorFlow的歷史脈絡(luò)進行了簡要的梳理,并對TensorFlow的設(shè)計模式以及選擇TensorFlow作為深度學(xué)習(xí)庫的優(yōu)勢和面臨的挑戰(zhàn)進行了討論。
引言之后的第2章將介紹安裝TensorFlow時應(yīng)當(dāng)考慮的因素,并給出了詳細(xì)的TensorFlow安裝指南,即如何從二進制安裝包安裝和從源碼構(gòu)建TensorFlow。
第二部分:TensorFlow與機器學(xué)習(xí)基礎(chǔ)
從第3章開始,進入本書第二部分。在TensorFlow安裝完畢后,第3章將深入介紹TensorFlow API的基礎(chǔ)知識,而不會涉及過多的機器學(xué)習(xí)概念。這樣做是為了將“學(xué)習(xí)TensorFlow”和“學(xué)習(xí)如何利用TensorFlow從事機器學(xué)習(xí)相關(guān)工作”區(qū)分開來。第3章將對TensorFlow API中許多重要的部分進行深入剖析。此外,還將演示如何用可視化的數(shù)據(jù)流圖表示模型,并將其轉(zhuǎn)化為TensorFlow代碼,以及如何利用TensorBoard驗證數(shù)據(jù)流圖是否被正確建模。
介紹完TensorFlow API的核心概念之后,便進入第4章。這一章將利用TensorFlow實現(xiàn)一些簡單的機器學(xué)習(xí)模型,如線性回歸、對數(shù)幾率回歸(logistic regression)和聚類模型。
第三部分:用TensorFlow實現(xiàn)更高級的深度模型
第三部分由兩章構(gòu)成,每章都只關(guān)注一種更為復(fù)雜的深度學(xué)習(xí)模型。每章首先對模型進行描述,然后介紹如何用可視化的數(shù)據(jù)流圖表示所要創(chuàng)建的模型。這兩章還將討論為什么要以特定方式構(gòu)建這些模型,并對所涉及的數(shù)學(xué)難點進行講解,之后再介紹如何利用TensorFlow有效地構(gòu)建這些模型。
所要研究的第一個模型是卷積神經(jīng)網(wǎng)絡(luò)(CNN),對應(yīng)于第5章。該章會介紹如何使用圖像數(shù)據(jù)訓(xùn)練TensorFlow模型,并對卷積的數(shù)學(xué)原理和使用目的展開討論,同時還將介紹如何將圖像裸數(shù)據(jù)轉(zhuǎn)化為一種與TensorFlow兼容的格式,以及如何對最終的輸出進行測試。
第6章將探討如何使用TensorFlow正確地構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)模型。通過各種自然語言處理(NLP)任務(wù),讀者將了解如何利用長短時記憶網(wǎng)絡(luò)(LSTM)以及如何將預(yù)訓(xùn)練的詞向量包含到模型中。
第四部分:其他提示、技術(shù)與特性
本書最后一部分將探討TensorFlow API中最新推出的特性,內(nèi)容包括如何準(zhǔn)備用于部署的模型、一些有用的編程模式,以及其他精選主題。
其他機器學(xué)習(xí)庫
TensorFlow并非唯一可用的開源機器學(xué)習(xí)庫。下面列出一份可用于深度學(xué)習(xí)的簡短開源庫清單:
Caffe專注于卷積神經(jīng)網(wǎng)絡(luò)和圖像處理,使用C++語言編寫。
Chainer是另一個靈活的機器學(xué)習(xí)Python庫,支持單機多GPU運算。
CNTK是微軟公司發(fā)布的首個開源機器學(xué)習(xí)庫,它擁有自己的模型定義語言,支持聲明式的分布式模型構(gòu)建。
Deeplearning4j是一個專門針對神經(jīng)網(wǎng)絡(luò)的Java庫,它易于與Spark、Hadoop和其他基于Java的分布式軟件集成,具有良好的可伸縮性。
Nervana Neon是一個高效的Python機器學(xué)習(xí)庫,支持單機多GPU運算。
Theano是一個極為靈活的Python機器學(xué)習(xí)庫,因其出眾的用戶友好性以及可以用異常簡單的方式定義復(fù)雜模型等特點,在科研領(lǐng)域深受歡迎。TensorFlow的API與Theano API最為相似。
Torch是一個專注于GPU實現(xiàn)的機器學(xué)習(xí)庫,它是用Lua語言編寫的,并由來自若干家大公司的研究團隊提供支持。
限于篇幅,本書不打算對上述這些庫的優(yōu)缺點展開深入討論,但如果有時間,非常值得深入展開。TensorFlow的作者在進行框架設(shè)計時,便是從當(dāng)中的幾個庫汲取了靈感。
先修知識
雖然本書主要關(guān)注TensorFlow API,但筆者希望讀者已經(jīng)熟悉大量數(shù)學(xué)和編程概念,包括:
微積分(一元和多元)
矩陣代數(shù)(尤其是矩陣乘法)
基本的編程原理
機器學(xué)習(xí)的基本概念
此外,讀者若能夠掌握下列知識,則將從本書中獲得更大的收獲:
擁有Python編程及模塊組織的經(jīng)驗
擁有NumPy庫的使用經(jīng)驗
擁有matplotlib庫的使用經(jīng)驗
掌握機器學(xué)習(xí)中更高級的概念,尤其是前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)
在適宜的時候,筆者會通過一些提示信息幫助讀者重新熟悉那些為充分理解相關(guān)數(shù)學(xué)和Python概念所必需的概念。
預(yù)期的收獲
通過閱讀本書,讀者將掌握以下內(nèi)容:
TensorFlow的核心API
TensorFlow的工作流:數(shù)據(jù)流圖的定義和數(shù)據(jù)流圖的執(zhí)行
如何在各種設(shè)備上安裝TensorFlow
組織代碼和項目的最佳實踐
如何用TensorFlow創(chuàng)建核心機器學(xué)習(xí)模型
如何用TensorFlow實現(xiàn)RNN和CNN
如何用TensorFlow Serving部署代碼
利用TensorBoard分析模型的基礎(chǔ)知識
在學(xué)習(xí)完本書之后,如果讀者想對TensorFlow獲得更多了解,可參考下列資源:
TensorFlow官網(wǎng) 其中包含最新的文檔、API和入門材料。
TensorFlow Github代碼庫 在此,可對TensorFlow的開源實現(xiàn)做出貢獻,并直接對源代碼進行審查。
官方發(fā)布的用TensorFlow實現(xiàn)的機器學(xué)習(xí)模型 可原封不動地使用這些模型,也可稍加調(diào)整以適合自己的設(shè)計目的。
谷歌研究院的博客(Google Research Blog) 提供了來自谷歌的有關(guān)TensorFlow的應(yīng)用和更新的最新消息。
Kaggle 獲取公開數(shù)據(jù)集并與其他從事數(shù)據(jù)分析工作的人開展競賽的絕佳網(wǎng)站。
Data.gov 美國政府的門戶網(wǎng)站,從中可找到全美國的公開數(shù)據(jù)集。
至此,“動員演講”已經(jīng)結(jié)束,現(xiàn)在讓我們開啟本書的學(xué)習(xí)之旅吧!
CONTENTS
目錄
譯者序
前言
第一部分 開啟TensorFlow之旅
第1章 引言2
1.1 無處不在的數(shù)據(jù)2
1.2 深度學(xué)習(xí)2
1.3 TensorFlow:一個現(xiàn)代的機器學(xué)習(xí)庫3
1.4 TensorFlow:技術(shù)概要3
1.5 何為TensorFlow4
1.5.1 解讀來自官網(wǎng)的單句描述4
1.5.2 單句描述未體現(xiàn)的內(nèi)容6
1.6 何時使用TensorFlow7
1.7 TensorFlow的優(yōu)勢8
1.8 使用TensorFlow所面臨的挑戰(zhàn)9
1.9 高歌猛進9
第2章 安裝TensorFlow10
2.1 選擇安裝環(huán)境10
2.2 Jupyter Notebook與matplotlib12
2.3 創(chuàng)建Virtualenv環(huán)境12
2.4 TensorFlow的簡易安裝13
2.5 源碼構(gòu)建及安裝實例:在64位Ubuntu Linux上安裝GPU版TensorFlow14
2.5.1 安裝依賴庫14
2.5.2 安裝Bazel15
2.5.3 安裝CUDA軟件(僅限NVIDIA GPU)16
2.5.4 從源碼構(gòu)建和安裝TensorFlow18
2.6 安裝Jupyter Notebook20
2.7 安裝matplotlib20
2.8 測試TensorFlow、Jupyter Notebook及matplotlib21
2.9 本章小結(jié)23
第二部分 TensorFlow與機器學(xué)習(xí)基礎(chǔ)
第3章 TensorFlow基礎(chǔ)26
3.1 數(shù)據(jù)流圖簡介26
3.1.1 數(shù)據(jù)流圖基礎(chǔ)26
3.1.2 節(jié)點的依賴關(guān)系29
3.2 在TensorFlow中定義數(shù)據(jù)流圖33
3.2.1 構(gòu)建第一個TensorFlow數(shù)據(jù)流圖33
3.2.2 張量思維39
3.2.3 張量的形狀43
3.2.4 TensorFlow的Operation44
3.2.5 TensorFlow的Graph對象46
3.2.6 TensorFlow Session48
3.2.7 利用占位節(jié)點添加輸入52
3.2.8 Variable對象53
3.3 通過名稱作用域組織數(shù)據(jù)流圖56
3.4 練習(xí):綜合運用各種組件61
3.4.1 構(gòu)建數(shù)據(jù)流圖63
3.4.2 運行數(shù)據(jù)流圖66
3.5 本章小結(jié)71
第4章 機器學(xué)習(xí)基礎(chǔ)72
4.1 有監(jiān)督學(xué)習(xí)簡介72
4.2 保存訓(xùn)練檢查點74
4.3 線性回歸76
4.4 對數(shù)幾率回歸78
4.5 softmax分類83
4.6 多層神經(jīng)網(wǎng)絡(luò)85
4.7 梯度下降法與誤差反向傳播算法88
第三部分 用TensorFlow實現(xiàn)更高級的深度模型
第5章 目標(biāo)識別與分類96
5.1 卷積神經(jīng)網(wǎng)絡(luò)97
5.2 卷積100
5.2.1 輸入和卷積核100
5.2.2 跨度102
5.2.3 邊界填充104
5.2.4 數(shù)據(jù)格式104
5.2.5 深入探討卷積核105
5.3 常見層107
5.3.1 卷積層108
5.3.2 激活函數(shù)108
5.3.3 池化層111
5.3.4 歸一化113
5.3.5 高級層114
5.4 圖像與TensorFlow116
5.4.1 加載圖像116
5.4.2 圖像格式117
5.4.3 圖像操作121
5.4.4 顏色127
5.5 CNN的實現(xiàn)129
5.5.1 Stanford Dogs數(shù)據(jù)集129
5.5.2 將圖像轉(zhuǎn)為TFRecord文件130
5.5.3 加載圖像133
5.5.4 模型134
5.5.5 訓(xùn)練136
5.5.6 用TensorBoard調(diào)試濾波器137
5.6 本章小結(jié)139
第6章 循環(huán)神經(jīng)網(wǎng)絡(luò)與自然語言處理140
6.1 循環(huán)神經(jīng)網(wǎng)絡(luò)簡介140
6.1.1 時序的世界140
6.1.2 近似任意程序141
6.1.3 隨時間反向傳播142
6.1.4 序列的編碼和解碼143
6.1.5 實現(xiàn)第一個循環(huán)神經(jīng)網(wǎng)絡(luò)145
6.1.6 梯度消失與梯度爆炸145
6.1.7 長短時記憶網(wǎng)絡(luò)147
6.1.8 RNN結(jié)構(gòu)的變種148
6.2 詞向量嵌入149
6.2.1 準(zhǔn)備維基百科語料庫151
6.2.2 模型結(jié)構(gòu)155
6.2.3 噪聲對比分類器156
6.2.4 訓(xùn)練模型156
6.3 序列分類157
6.3.1 Imdb影評數(shù)據(jù)集158
6.3.2 使用詞向量嵌入159
6.3.3 序列標(biāo)注模型159
6.3.4 來自最后相關(guān)活性值的softmax層161
6.3.5 梯度裁剪162
6.3.6 訓(xùn)練模型163
6.4 序列標(biāo)注164
6.4.1 OCR數(shù)據(jù)集164
6.4.2 時間步之間共享的soft-max層166
6.4.3 訓(xùn)練模型169
6.4.4 雙向RNN171
6.5 預(yù)測編碼174
6.5.1 字符級語言建模174
6.5.2 ArXiv摘要API175
6.5.3 數(shù)據(jù)預(yù)處理177
6.5.4 預(yù)測編碼模型178
6.5.5 訓(xùn)練模型182
6.5.6 生成相似序列185
6.6 本章小結(jié)188
第四部分 其他提示、技術(shù)與特性
第7章 產(chǎn)品環(huán)境中模型的部署190
7.1 搭建TensorFlow服務(wù)開發(fā)環(huán)境190
7.1.1 Docker鏡像190
7.1.2 Bazel工作區(qū)191
7.2 導(dǎo)出訓(xùn)練好的模型192
7.3 定義服務(wù)器接口195
7.4 實現(xiàn)推斷服務(wù)器197
7.5 客戶端應(yīng)用201
7.6 產(chǎn)品準(zhǔn)備203
7.7 本章小結(jié)203
第8章 輔助函數(shù)、代碼結(jié)構(gòu)和類204
8.1 確保目錄結(jié)構(gòu)存在204
8.2 下載函數(shù)204
8.3 磁盤緩存修飾器205
8.4 屬性字典206
8.5 惰性屬性修飾器207
8.6 覆蓋數(shù)據(jù)流圖修飾器209
第9章 結(jié)語:其他資源212