TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南_第1頁
TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南_第2頁
TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南_第3頁
TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南_第4頁
TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南_第5頁
已閱讀5頁,還剩346頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

TensorFlow機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南(第2版)目錄TOC\h\h第1章TensorFlow基礎(chǔ)\h1.1簡介\h1.2TensorFlow如何工作\h1.2.1開始\h1.2.2動(dòng)手做\h1.2.3工作原理\h1.2.4參考\h1.3聲明變量和張量\h1.3.1開始\h1.3.2動(dòng)手做\h1.3.3工作原理\h1.3.4延伸學(xué)習(xí)\h1.4使用占位符和變量\h1.4.1開始\h1.4.2動(dòng)手做\h1.4.3工作原理\h1.4.4延伸學(xué)習(xí)\h1.5操作(計(jì)算)矩陣\h1.5.1開始\h1.5.2動(dòng)手做\h1.5.3工作原理\h1.6聲明操作\h1.6.1開始\h1.6.2動(dòng)手做\h1.6.3工作原理\h1.6.4延伸學(xué)習(xí)\h1.7實(shí)現(xiàn)激勵(lì)函數(shù)\h1.7.1開始\h1.7.2動(dòng)手做\h1.7.3工作原理\h1.7.4延伸學(xué)習(xí)\h1.8讀取數(shù)據(jù)源\h1.8.1開始\h1.8.2動(dòng)手做\h1.8.3工作原理\h1.8.4參考\h1.9其他資源\h1.9.1開始\h1.9.2動(dòng)手做\h第2章TensorFlow進(jìn)階\h2.1簡介\h2.2計(jì)算圖中的操作\h2.2.1開始\h2.2.2動(dòng)手做\h2.2.3工作原理\h2.3TensorFlow的嵌入Layer\h2.3.1開始\h2.3.2動(dòng)手做\h2.3.3工作原理\h2.3.4延伸學(xué)習(xí)\h2.4TensorFlow的多層Layer\h2.4.1開始\h2.4.2動(dòng)手做\h2.4.3工作原理\h2.5TensorFlow實(shí)現(xiàn)損失函數(shù)\h2.5.1開始\h2.5.2動(dòng)手做\h2.5.3工作原理\h2.5.4延伸學(xué)習(xí)\h2.6TensorFlow實(shí)現(xiàn)反向傳播\h2.6.1開始\h2.6.2動(dòng)手做\h2.6.3工作原理\h2.6.4延伸學(xué)習(xí)\h2.6.5參考\h2.7TensorFlow實(shí)現(xiàn)批量訓(xùn)練和隨機(jī)訓(xùn)練\h2.7.1開始\h2.7.2動(dòng)手做\h2.7.3工作原理\h2.7.4延伸學(xué)習(xí)\h2.8TensorFlow實(shí)現(xiàn)創(chuàng)建分類器\h2.8.1開始\h2.8.2動(dòng)手做\h2.8.3工作原理\h2.8.4延伸學(xué)習(xí)\h2.8.5參考\h2.9TensorFlow實(shí)現(xiàn)模型評(píng)估\h2.9.1開始\h2.9.2動(dòng)手做\h2.9.3工作原理\h第3章基于TensorFlow的線性回歸\h3.1簡介\h3.2用TensorFlow求逆矩陣\h3.2.1開始\h3.2.2動(dòng)手做\h3.2.3工作原理\h3.3用TensorFlow實(shí)現(xiàn)矩陣分解\h3.3.1開始\h3.3.2動(dòng)手做\h3.3.3工作原理\h3.4用TensorFlow實(shí)現(xiàn)線性回歸算法\h3.4.1開始\h3.4.2動(dòng)手做\h3.4.3工作原理\h3.5理解線性回歸中的損失函數(shù)\h3.5.1開始\h3.5.2動(dòng)手做\h3.5.3工作原理\h3.5.4延伸學(xué)習(xí)\h3.6用TensorFlow實(shí)現(xiàn)戴明回歸算法\h3.6.1開始\h3.6.2動(dòng)手做\h3.6.3工作原理\h3.7用TensorFlow實(shí)現(xiàn)lasso回歸和嶺回歸算法\h3.7.1開始\h3.7.2動(dòng)手做\h3.7.3工作原理\h3.7.4延伸學(xué)習(xí)\h3.8用TensorFlow實(shí)現(xiàn)彈性網(wǎng)絡(luò)回歸算法\h3.8.1開始\h3.8.2動(dòng)手做\h3.8.3工作原理\h3.9用TensorFlow實(shí)現(xiàn)邏輯回歸算法\h3.9.1開始\h3.9.2動(dòng)手做\h3.9.3工作原理\h第4章基于TensorFlow的支持向量機(jī)\h4.1簡介\h4.2線性支持向量機(jī)的使用\h4.2.1開始\h4.2.2動(dòng)手做\h4.2.3工作原理\h4.3弱化為線性回歸\h4.3.1開始\h4.3.2動(dòng)手做\h4.3.3工作原理\h4.4TensorFlow上核函數(shù)的使用\h4.4.1開始\h4.4.2動(dòng)手做\h4.4.3工作原理\h4.4.4延伸學(xué)習(xí)\h4.5用TensorFlow實(shí)現(xiàn)非線性支持向量機(jī)\h4.5.1開始\h4.5.2動(dòng)手做\h4.5.3工作原理\h4.6用TensorFlow實(shí)現(xiàn)多類支持向量機(jī)\h4.6.1開始\h4.6.2動(dòng)手做\h4.6.3工作原理\h第5章最近鄰域法\h5.1簡介\h5.2最近鄰域法的使用\h5.2.1開始\h5.2.2動(dòng)手做\h5.2.3工作原理\h5.2.4延伸學(xué)習(xí)\h5.3如何度量文本距離\h5.3.1開始\h5.3.2動(dòng)手做\h5.3.3工作原理\h5.3.4延伸學(xué)習(xí)\h5.4用TensorFlow實(shí)現(xiàn)混合距離計(jì)算\h5.4.1開始\h5.4.2動(dòng)手做\h5.4.3工作原理\h5.4.4延伸學(xué)習(xí)\h5.5用TensorFlow實(shí)現(xiàn)地址匹配\h5.5.1開始\h5.5.2動(dòng)手做\h5.5.3工作原理\h5.6用TensorFlow實(shí)現(xiàn)圖像識(shí)別\h5.6.1開始\h5.6.2動(dòng)手做\h5.6.3工作原理\h5.6.4延伸學(xué)習(xí)\h第6章神經(jīng)網(wǎng)絡(luò)算法\h6.1簡介\h6.2用TensorFlow實(shí)現(xiàn)門函數(shù)\h6.2.1開始\h6.2.2動(dòng)手做\h6.2.3工作原理\h6.3使用門函數(shù)和激勵(lì)函數(shù)\h6.3.1開始\h6.3.2動(dòng)手做\h6.3.3工作原理\h6.3.4延伸學(xué)習(xí)\h6.4用TensorFlow實(shí)現(xiàn)單層神經(jīng)網(wǎng)絡(luò)\h6.4.1開始\h6.4.2動(dòng)手做\h6.4.3工作原理\h6.4.4延伸學(xué)習(xí)\h6.5用TensorFlow實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)常見層\h6.5.1開始\h6.5.2動(dòng)手做\h6.5.3工作原理\h6.6用TensorFlow實(shí)現(xiàn)多層神經(jīng)網(wǎng)絡(luò)\h6.6.1開始\h6.6.2動(dòng)手做\h6.6.3工作原理\h6.7線性預(yù)測(cè)模型的優(yōu)化\h6.7.1開始\h6.7.2動(dòng)手做\h6.7.3工作原理\h6.8用TensorFlow基于神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)井字棋\h6.8.1開始\h6.8.2動(dòng)手做\h6.8.3工作原理\h第7章自然語言處理\h7.1簡介\h7.2詞袋的使用\h7.2.1開始\h7.2.2動(dòng)手做\h7.2.3工作原理\h7.2.4延伸學(xué)習(xí)\h7.3用TensorFlow實(shí)現(xiàn)TF-IDF算法\h7.3.1開始\h7.3.2動(dòng)手做\h7.3.3工作原理\h7.3.4延伸學(xué)習(xí)\h7.4用TensorFlow實(shí)現(xiàn)skip-gram模型\h7.4.1開始\h7.4.2動(dòng)手做\h7.4.3工作原理\h7.4.4延伸學(xué)習(xí)\h7.5用TensorFlow實(shí)現(xiàn)CBOW詞嵌入模型\h7.5.1開始\h7.5.2動(dòng)手做\h7.5.3工作原理\h7.5.4延伸學(xué)習(xí)\h7.6使用TensorFlow的Word2Vec預(yù)測(cè)\h7.6.1開始\h7.6.2動(dòng)手做\h7.6.3工作原理\h7.6.4延伸學(xué)習(xí)\h7.7用TensorFlow實(shí)現(xiàn)基于Doc2Vec的情感分析\h7.7.1開始\h7.7.2動(dòng)手做\h7.7.3工作原理\h第8章卷積神經(jīng)網(wǎng)絡(luò)\h8.1簡介\h8.2用TensorFlow實(shí)現(xiàn)簡單的CNN\h8.2.1開始\h8.2.2動(dòng)手做\h8.2.3工作原理\h8.2.4延伸學(xué)習(xí)\h8.2.5參考\h8.3用TensorFlow實(shí)現(xiàn)進(jìn)階的CNN\h8.3.1開始\h8.3.2動(dòng)手做\h8.3.3工作原理\h8.3.4參考\h8.4再訓(xùn)練已有的CNN模型\h8.4.1開始\h8.4.2動(dòng)手做\h8.4.3工作原理\h8.4.4參考\h8.5用TensorFlow實(shí)現(xiàn)圖像風(fēng)格遷移\h8.5.1開始\h8.5.2動(dòng)手做\h8.5.3工作原理\h8.5.4參考\h8.6用TensorFlow實(shí)現(xiàn)DeepDream\h8.6.1開始\h8.6.2動(dòng)手做\h8.6.3延伸學(xué)習(xí)\h8.6.4參考\h第9章循環(huán)神經(jīng)網(wǎng)絡(luò)\h9.1簡介\h9.2用TensorFlow實(shí)現(xiàn)RNN模型進(jìn)行垃圾郵件預(yù)測(cè)\h9.2.1開始\h9.2.2動(dòng)手做\h9.2.3工作原理\h9.2.4延伸學(xué)習(xí)\h9.3用TensorFlow實(shí)現(xiàn)LSTM模型\h9.3.1開始\h9.3.2動(dòng)手做\h9.3.3工作原理\h9.3.4延伸學(xué)習(xí)\h9.4TensorFlow堆疊多層LSTM\h9.4.1開始\h9.4.2動(dòng)手做\h9.4.3工作原理\h9.5用TensorFlow實(shí)現(xiàn)Seq2Seq翻譯模型\h9.5.1開始\h9.5.2動(dòng)手做\h9.5.3工作原理\h9.5.4延伸學(xué)習(xí)\h9.6TensorFlow訓(xùn)練孿生RNN度量相似度\h9.6.1開始\h9.6.2動(dòng)手做\h9.6.3延伸學(xué)習(xí)\h第10章TensorFlow產(chǎn)品化\h10.1簡介\h10.2TensorFlow的單元測(cè)試\h10.2.1開始\h10.2.2工作原理\h10.3TensorFlow的多設(shè)備使用\h10.3.1開始\h10.3.2動(dòng)手做\h10.3.3工作原理\h10.3.4延伸學(xué)習(xí)\h10.4分布式TensorFlow實(shí)踐\h10.4.1開始\h10.4.2動(dòng)手做\h10.4.3工作原理\h10.5TensorFlow產(chǎn)品化開發(fā)提示\h10.5.1開始\h10.5.2動(dòng)手做\h10.5.3工作原理\h10.6TensorFlow產(chǎn)品化的實(shí)例\h10.6.1開始\h10.6.2動(dòng)手做\h10.6.3工作原理\h10.7TensorFlow服務(wù)部署\h10.7.1開始\h10.7.2動(dòng)手做\h10.7.3工作原理\h10.7.4延伸學(xué)習(xí)\h第11章TensorFlow的進(jìn)階應(yīng)用\h11.1簡介\h11.2TensorFlow可視化:Tensorboard\h11.2.1開始\h11.2.2動(dòng)手做\h11.2.3延伸學(xué)習(xí)\h11.3用TensorFlow實(shí)現(xiàn)遺傳算法\h11.3.1開始\h11.3.2動(dòng)手做\h11.3.3工作原理\h11.3.4延伸學(xué)習(xí)\h11.4用TensorFlow實(shí)現(xiàn)k-means聚類算法\h11.4.1開始\h11.4.2動(dòng)手做\h11.4.3延伸學(xué)習(xí)\h11.5用TensorFlow求解常微分方程組\h11.5.1開始\h11.5.2動(dòng)手做\h11.5.3工作原理\h11.5.4參考\h11.6用TensorFlow實(shí)現(xiàn)隨機(jī)森林算法\h11.6.1開始\h11.6.2動(dòng)手做\h11.6.3工作原理\h11.6.4參考\h11.7將Keras作為TensorFlowAPI使用\h11.7.1開始\h11.7.2動(dòng)手做\h11.7.3工作原理\h11.7.4參考第1章TensorFlow基礎(chǔ)本章將介紹TensorFlow的基本概念,幫助讀者去理解TensorFlow是如何工作的,以及它如何訪問數(shù)據(jù)集和其他資源。學(xué)完本章可以掌握以下知識(shí)點(diǎn):·TensorFlow如何工作·聲明變量和張量·使用占位符和變量·操作(計(jì)算)矩陣·聲明操作·實(shí)現(xiàn)激勵(lì)函數(shù)·讀取數(shù)據(jù)源·其他資源1.1簡介Google的TensorFlow引擎提供了一種解決機(jī)器學(xué)習(xí)問題的高效方法。機(jī)器學(xué)習(xí)在各行各業(yè)應(yīng)用廣泛,特別是計(jì)算機(jī)視覺、語音識(shí)別、語言翻譯和健康醫(yī)療等領(lǐng)域。本書將詳細(xì)介紹TensorFlow操作的基本步驟以及代碼。這些基礎(chǔ)知識(shí)對(duì)理解本書后續(xù)章節(jié)非常有用。1.2TensorFlow如何工作首先,TensorFlow的計(jì)算看起來并不是很復(fù)雜,因?yàn)門ensorFlow的計(jì)算過程和算法開發(fā)相當(dāng)容易。這章將引導(dǎo)讀者理解TensorFlow算法的偽代碼。1.2.1開始截至目前,TensorFlow支持Linux、macOS和Windows操作系統(tǒng)。本書的代碼都是在Linux操作系統(tǒng)上實(shí)現(xiàn)和運(yùn)行的,不過運(yùn)行在其他操作系統(tǒng)上也沒問題。本書的代碼可以在GitHub(\h/nfmcclure/tensorflow_cookbook)或Packt代碼庫(\h/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)獲取。雖然TensorFlow是用C++編寫,但是全書只介紹TensorFlow的Python使用方式。本書將使用Python3.6+(\h)和TensorFlow1.10.0+(\h)。盡管TensorFlow能在CPU上運(yùn)行,但大部分算法在GPU上會(huì)運(yùn)行得更快,它支持英偉達(dá)顯卡(NvidiaComputeCapabilityv4.0+,推薦v5.1)。TensorFlow上常用的GPU是英偉達(dá)特斯拉(NvidiaTesla)和英偉達(dá)帕斯卡(NvidiaPascal),至少需要4GB的視頻RAM。為了在GPU上運(yùn)行,需要下載NvidiaCudaToolkit及其v5.x+(\h/cuda-downloads)。本書還依賴Python的包:Scipy、Numpy和Scikit-Learn,這些包均包含在Anaconda中(\hhttps://www.continuum.io/downloads)。1.2.2動(dòng)手做這里是TensorFlow算法的一般流程,本書提煉出的綱領(lǐng)如下:1.導(dǎo)入/生成樣本數(shù)據(jù)集:所有的機(jī)器學(xué)習(xí)算法都依賴樣本數(shù)據(jù)集,本書的數(shù)據(jù)集既有生成的樣本數(shù)據(jù)集,也有外部公開的樣本數(shù)據(jù)集。有時(shí),生成的數(shù)據(jù)集會(huì)更容易符合預(yù)期結(jié)果,但是本書大部分都是訪問外部公開的樣本數(shù)據(jù)集,具體細(xì)節(jié)見1.8節(jié)。2.轉(zhuǎn)換和歸一化數(shù)據(jù):一般來講,輸入樣本數(shù)據(jù)集并不符合TensorFlow期望的形狀,所以需要轉(zhuǎn)換數(shù)據(jù)格式以滿足TensorFlow。當(dāng)數(shù)據(jù)集的維度或者類型不符合所用機(jī)器學(xué)習(xí)算法的要求時(shí),需要在使用前進(jìn)行數(shù)據(jù)轉(zhuǎn)換。大部分機(jī)器學(xué)習(xí)算法期待的輸入樣本數(shù)據(jù)是歸一化的數(shù)據(jù)。TensorFlow具有內(nèi)建函數(shù)來歸一化數(shù)據(jù),如下:3.劃分樣本數(shù)據(jù)集為訓(xùn)練樣本集、測(cè)試樣本集和驗(yàn)證樣本集:一般要求機(jī)器學(xué)習(xí)算法的訓(xùn)練樣本集和測(cè)試樣本集是不同的數(shù)據(jù)集。另外,許多機(jī)器學(xué)習(xí)算法要求超參數(shù)調(diào)優(yōu),所以需要驗(yàn)證樣本集來決定最優(yōu)的超參數(shù)。4.設(shè)置機(jī)器學(xué)習(xí)參數(shù)(超參數(shù)):機(jī)器學(xué)習(xí)經(jīng)常要有一系列的常量參數(shù)。例如,迭代次數(shù)、學(xué)習(xí)率或者其他固定參數(shù)。約定俗成的習(xí)慣是一次性初始化所有的機(jī)器學(xué)習(xí)參數(shù),從而提高程序的可讀性,讀者經(jīng)??吹降男问饺缦拢?.初始化變量和占位符:在求解最優(yōu)化過程中(最小化損失函數(shù)),TensorFlow通過占位符傳入數(shù)據(jù),并調(diào)整變量(權(quán)重/偏差)。TensorFlow指定數(shù)據(jù)大小和數(shù)據(jù)類型來初始化變量和占位符。本書大部分使用float32數(shù)據(jù)類型,TensorFlow也支持float64和float16。注意,使用的數(shù)據(jù)類型字節(jié)數(shù)越多結(jié)果越精確,同時(shí)運(yùn)行速度越慢。使用方式如下:6.定義模型結(jié)構(gòu):在獲取樣本數(shù)據(jù)集、初始化變量和占位符后,開始定義機(jī)器學(xué)習(xí)模型。TensorFlow通過選擇操作、變量和占位符的值來構(gòu)建計(jì)算圖,詳細(xì)講解見2.2節(jié)。這里給出簡單的線性模型y=mx+b:7.聲明損失函數(shù):定義完模型后,需要聲明損失函數(shù)來評(píng)估輸出結(jié)果。損失函數(shù)能說明預(yù)測(cè)值與實(shí)際值的差距,損失函數(shù)的種類將在第2章詳細(xì)展示,這里給出n個(gè)樣本的均方誤差(loss=(1/n)Σ(y實(shí)際-y預(yù)測(cè))2):8.初始化模型和訓(xùn)練模型:TensorFlow創(chuàng)建計(jì)算圖實(shí)例,通過占位符傳入數(shù)據(jù),維護(hù)變量的狀態(tài)信息。下面是初始化計(jì)算圖的一種方式:也可以用如下的方式初始化計(jì)算圖:9.評(píng)估機(jī)器學(xué)習(xí)模型:一旦構(gòu)建計(jì)算圖,并訓(xùn)練機(jī)器學(xué)習(xí)模型后,需要尋找某種標(biāo)準(zhǔn)來評(píng)估機(jī)器學(xué)習(xí)模型對(duì)新樣本數(shù)據(jù)集的效果。通過對(duì)訓(xùn)練樣本集和測(cè)試樣本集的評(píng)估,可以確定機(jī)器學(xué)習(xí)模型是過擬合還是欠擬合。這些將在后續(xù)章節(jié)來解決。10.調(diào)優(yōu)超參數(shù):大部分情況下,機(jī)器學(xué)習(xí)者需要基于模型效果來回調(diào)整一些超參數(shù)。通過調(diào)整不同的超參數(shù)來重復(fù)訓(xùn)練模型,并用驗(yàn)證樣本集來評(píng)估機(jī)器學(xué)習(xí)模型。11.發(fā)布/預(yù)測(cè)結(jié)果:所有機(jī)器學(xué)習(xí)模型一旦訓(xùn)練好,最后都用來預(yù)測(cè)新的、未知的數(shù)據(jù)。1.2.3工作原理使用TensorFlow時(shí),必須準(zhǔn)備樣本數(shù)據(jù)集、變量、占位符和機(jī)器學(xué)習(xí)模型,然后進(jìn)行模型訓(xùn)練,改變變量狀態(tài)來提高預(yù)測(cè)結(jié)果。TensorFlow通過計(jì)算圖實(shí)現(xiàn)上述過程。這些計(jì)算圖是有向無環(huán)圖,并且支持并行計(jì)算。接著TensorFlow創(chuàng)建損失函數(shù),通過調(diào)整計(jì)算圖中的變量來最小化損失函數(shù)。TensorFlow維護(hù)模型的計(jì)算狀態(tài),每步迭代自動(dòng)計(jì)算梯度。1.2.4參考·\h/api_docs/python/·\h/tutorials/·\h/jtoy/awesome-tensorflow1.3聲明變量和張量TensorFlow的主要數(shù)據(jù)結(jié)構(gòu)是張量,它用張量來操作計(jì)算圖。在TensorFlow里可以把變量或者占位符聲明為張量。首先,需要知道如何創(chuàng)建張量。張量是一個(gè)廣義的向量或矩陣的數(shù)學(xué)術(shù)語。對(duì)于一維向量和二維矩陣的情況,張量是n維的(其中n可以是1、2甚至更大)。1.3.1開始創(chuàng)建一個(gè)張量,聲明其為一個(gè)變量。TensorFlow在計(jì)算圖中可以創(chuàng)建多個(gè)圖結(jié)構(gòu)。這里需要指出,在TensorFlow中創(chuàng)建一個(gè)張量,并不會(huì)立即在計(jì)算圖中增加什么。只有運(yùn)行一個(gè)操作來初始化變量之后,TensorFlow才會(huì)把此張量增加到計(jì)算圖。更多信息請(qǐng)見下一節(jié)對(duì)變量和占位符的討論。1.3.2動(dòng)手做這里將介紹在TensorFlow中創(chuàng)建張量的主要方法:1.固定張量:·創(chuàng)建指定維度的零張量。方式如下:·創(chuàng)建指定維度的全1張量。方式如下:·創(chuàng)建指定維度的常數(shù)填充的張量。方式如下:·用已知常數(shù)張量創(chuàng)建一個(gè)張量。方式如下:tf.constant()函數(shù)也能廣播一個(gè)值為數(shù)組,然后模擬tf.fill()函數(shù)的功能,具體寫法為:tf.constant(42,[row_dim,col_dim])。2.相似形狀的張量:·新建一個(gè)與給定的tensor類型大小一致的tensor,其所有元素為0或者1,使用方式如下:因?yàn)檫@些張量依賴前面的張量,所以初始化時(shí)需要按序進(jìn)行。如果打算一次性初始化所有張量,那么程序?qū)?huì)報(bào)錯(cuò)。3.序列張量:TensorFlow可以創(chuàng)建指定間隔的張量。下面函數(shù)的輸出跟numpy包中的range()函數(shù)和linspace()函數(shù)的輸出相似:返回的張量是[0.0,0.5,1.0]序列。注意,上面的函數(shù)結(jié)果中最后一個(gè)值是stop值。另外一個(gè)rang()函數(shù)的使用方式如下:返回的張量是[6,9,12]。注意,這個(gè)函數(shù)結(jié)果不包括limit值。4.隨機(jī)張量:·下面的tf.random_uniform()函數(shù)生成均勻分布的隨機(jī)數(shù):注意,這個(gè)隨機(jī)均勻分布從minval(包含minval值)開始到maxval(不包含maxval值)結(jié)束,即(minval<=x<maxval)?!f.random_normal()函數(shù)生成正態(tài)分布的隨機(jī)數(shù):·tf.truncated_normal()函數(shù)生成帶有指定邊界的正態(tài)分布的隨機(jī)數(shù),其正態(tài)分布的隨機(jī)數(shù)位于指定均值(期望)到兩個(gè)標(biāo)準(zhǔn)差之間的區(qū)間:·張量/數(shù)組的隨機(jī)化。tf.random_shuffle()和tf,random_crop()可以實(shí)現(xiàn)此功能:·張量的隨機(jī)剪裁。tf.random_crop()可以實(shí)現(xiàn)對(duì)張量指定大小的隨機(jī)剪裁。在本書的后面部分,會(huì)對(duì)具有3通道顏色的圖像(height,width,3)進(jìn)行隨機(jī)剪裁。為了固定剪裁結(jié)果的一個(gè)維度,需要在相應(yīng)的維度上賦其最大值:1.3.3工作原理一旦創(chuàng)建好張量,就可以通過tf.Variable()函數(shù)封裝張量來作為變量,更多細(xì)節(jié)見下節(jié),使用方式如下:1.3.4延伸學(xué)習(xí)創(chuàng)建張量并不一定得用TensorFlow內(nèi)建函數(shù),可以使用tf.convert_to_tensor()函數(shù)將任意numpy數(shù)組轉(zhuǎn)換為Python列表,或者將常量轉(zhuǎn)換為一個(gè)張量。注意,tf.convert_to_tensor()函數(shù)也可以接受張量作為輸入。1.4使用占位符和變量使用TensorFlow計(jì)算圖的關(guān)鍵工具是占位符和變量,也請(qǐng)讀者務(wù)必理解兩者的區(qū)別,以及什么地方該用誰。1.4.1開始使用數(shù)據(jù)的關(guān)鍵點(diǎn)之一是搞清楚它是占位符還是變量。變量是TensorFlow機(jī)器學(xué)習(xí)算法的參數(shù),TensorFlow維護(hù)(調(diào)整)這些變量的狀態(tài)來優(yōu)化機(jī)器學(xué)習(xí)算法。占位符是TensorFlow對(duì)象,用于表示輸入輸出數(shù)據(jù)的格式,允許傳入指定類型和形狀的數(shù)據(jù),并依賴計(jì)算圖的計(jì)算結(jié)果,比如,期望的計(jì)算結(jié)果。1.4.2動(dòng)手做在TensorFlow中,tf.Variable()函數(shù)創(chuàng)建變量,過程是輸入一個(gè)張量,返回一個(gè)變量。聲明變量后需要初始化變量,所謂初始化就是將變量與計(jì)算圖相關(guān)聯(lián)。下面是創(chuàng)建變量并初始化的例子:占位符僅僅聲明數(shù)據(jù)位置,用于傳入數(shù)據(jù)到計(jì)算圖。占位符通過會(huì)話中的feed_dict參數(shù)獲取數(shù)據(jù)。在計(jì)算圖中使用占位符時(shí),必須在其上執(zhí)行至少一個(gè)操作。在TensorFlow中,初始化計(jì)算圖,聲明一個(gè)占位符x,定義y為x的identity操作。identity操作返回占位符傳入的數(shù)據(jù)本身。結(jié)果圖將在下節(jié)展示,代碼如下:需要注意的是TensorFlow不會(huì)返回一個(gè)自關(guān)聯(lián)的占位符,也就是說如果運(yùn)行sess.run(x,feed_dict={x:x_vales})將會(huì)報(bào)錯(cuò)。1.4.3工作原理以零張量初始化變量,其計(jì)算圖如圖1-1所示。圖1-1變量在圖1-1中可以看出,計(jì)算圖僅僅有一個(gè)變量,全部初始化為0。圖中灰色部分詳細(xì)地展示計(jì)算圖操作以及相關(guān)的常量。右上角的小圖展示的是主計(jì)算圖。關(guān)于在TensorFlow中創(chuàng)建和可視化計(jì)算圖的部分見第10章。相似地,一個(gè)占位符傳入numpy數(shù)組的計(jì)算圖展示如圖1-2所示。圖1-2占位符初始化的計(jì)算圖1.4.4延伸學(xué)習(xí)在計(jì)算圖運(yùn)行的過程中,需要告訴TensorFlow初始化所創(chuàng)建的變量的時(shí)機(jī)。TensorFlow的每個(gè)變量都有initializer方法,但最常用的方式是輔助函數(shù)global_variables_initializer()。此函數(shù)會(huì)一次性初始化所創(chuàng)建的所有變量,使用方式如下:但是,如果是基于已經(jīng)初始化的變量進(jìn)行初始化,則必須按序進(jìn)行初始化,方式如下:1.5操作(計(jì)算)矩陣?yán)斫釺ensorFlow如何操作矩陣,對(duì)于理解計(jì)算圖中數(shù)據(jù)的流動(dòng)來說非常重要。在機(jī)器學(xué)習(xí)領(lǐng)域,矩陣是非常重要的概念(在數(shù)學(xué)中也同樣重要)。大多數(shù)的機(jī)器學(xué)習(xí)算法均是基于矩陣的運(yùn)算。鑒于本書沒有涵蓋矩陣運(yùn)算和線性代數(shù)內(nèi)容,所以建議讀者能自學(xué)線性代數(shù),以方便本書內(nèi)容的理解。1.5.1開始許多機(jī)器學(xué)習(xí)算法依賴矩陣操作。在TensorFlow中,矩陣計(jì)算是相當(dāng)容易的。在下面的所有例子里,我們首先創(chuàng)建一個(gè)圖會(huì)話,代碼如下:1.5.2動(dòng)手做1.創(chuàng)建矩陣:可以使用numpy數(shù)組(或者嵌套列表)創(chuàng)建二維矩陣,也可以使用創(chuàng)建張量的函數(shù)(比如,zeros()、ones()、truncated_normal()等)并為其指定一個(gè)二維形狀來創(chuàng)建矩陣。TensorFlow還可以使用diag()函數(shù)從一個(gè)一維數(shù)組(或者列表)來創(chuàng)建對(duì)角矩陣,代碼如下:注意,如果再次運(yùn)行sess.run(C),TensorFlow會(huì)重新初始化隨機(jī)變量,并得到不同的隨機(jī)數(shù)。2.矩陣的加法、減法和乘法:矩陣乘法函數(shù)matmul()可以通過參數(shù)指定在矩陣乘法操作前是否進(jìn)行矩陣轉(zhuǎn)置或是否每個(gè)矩陣都是稀疏的。注意,矩陣除法設(shè)有明確定義。雖然許多人把矩陣除法定義為乘上它的例數(shù),但它與實(shí)數(shù)除法有本質(zhì)的不同。3.矩陣轉(zhuǎn)置,示例如下:再次強(qiáng)調(diào),重新初始化將會(huì)得到不同的值。4.對(duì)于矩陣行列式,使用方式如下:5.矩陣的逆矩陣:TensorFlow中的矩陣求逆方法是Cholesky矩陣分解法(又稱為平方根法),矩陣需要為對(duì)稱正定矩陣或者可進(jìn)行LU分解。6.矩陣分解:·Cholesky矩陣分解法,使用方式如下:7.矩陣的特征值和特征向量,使用方式如下:注意,self_adjoint_eig()函數(shù)的輸出結(jié)果中,第一行為特征值,剩下的向量是對(duì)應(yīng)的向量。在數(shù)學(xué)中,這種方法也稱為矩陣的特征分解。1.5.3工作原理TensorFlow提供數(shù)值計(jì)算工具,并把這些計(jì)算添加到計(jì)算圖中。這些部分對(duì)于簡單的矩陣計(jì)算來說看似有些復(fù)雜,TensorFlow增加這些矩陣操作到計(jì)算圖進(jìn)行張量計(jì)算?,F(xiàn)在看起來這些介紹有些啰嗦,但是這有助于理解后續(xù)章節(jié)的內(nèi)容。1.6聲明操作現(xiàn)在開始學(xué)習(xí)TensorFlow計(jì)算圖的其他操作。1.6.1開始除了標(biāo)準(zhǔn)數(shù)值計(jì)算外,TensorFlow提供很多其他的操作。在使用之前,按照慣例創(chuàng)建一個(gè)計(jì)算圖會(huì)話,代碼如下:1.6.2動(dòng)手做TensorFlow張量的基本操作有add()、sub()、mul()和div()。注意,除特別說明外,這節(jié)所有的操作都是對(duì)張量的每個(gè)元素進(jìn)行操作:1.TensorFlow提供div()函數(shù)的多種變種形式和相關(guān)的函數(shù)。2.值得注意的,div()函數(shù)返回值的數(shù)據(jù)類型與輸入數(shù)據(jù)類型一致。這意味著,在Python2中,整數(shù)除法的實(shí)際返回是商的向下取整,即不大于商的最大整數(shù);而Python3版本中,TensorFlow提供truediv()函數(shù),其會(huì)在除法操作前強(qiáng)制轉(zhuǎn)換整數(shù)為浮點(diǎn)數(shù),所以最終的除法結(jié)果是浮點(diǎn)數(shù),代碼如下:3.如果要對(duì)浮點(diǎn)數(shù)進(jìn)行整數(shù)除法,可以使用floordiv()函數(shù)。注意,此函數(shù)也返回浮點(diǎn)數(shù)結(jié)果,但是其會(huì)向下舍去小數(shù)位到最近的整數(shù)。示例如下:4.另外一個(gè)重要的函數(shù)是mod()(取模)。此函數(shù)返回除法的余數(shù)。示例如下:5.通過cross()函數(shù)計(jì)算兩個(gè)張量的叉積。記住,叉積函數(shù)只為三維向量定義,所以cross()函數(shù)以兩個(gè)三維張量作為輸入,示例如下:6.下面給出數(shù)學(xué)函數(shù)的列表:7.特殊數(shù)學(xué)函數(shù):有些用在機(jī)器學(xué)習(xí)中的特殊數(shù)學(xué)函數(shù)值得一提,TensorFlow也有對(duì)應(yīng)的內(nèi)建函數(shù)。除特別說明外,這些函數(shù)操作的也是張量的每個(gè)元素。1.6.3工作原理知道在計(jì)算圖中應(yīng)用什么函數(shù)合適是重要的。大部分情況下,我們關(guān)心預(yù)處理函數(shù),但也通過組合預(yù)處理函數(shù)生成許多自定義函數(shù),示例如下:1.6.4延伸學(xué)習(xí)如果希望在計(jì)算圖中增加其他操作(未在上述函數(shù)列表中列出的操作),必須創(chuàng)建自定義函數(shù)。下面創(chuàng)建一個(gè)自定義二次多項(xiàng)式函數(shù)3x2-x+10:1.7實(shí)現(xiàn)激勵(lì)函數(shù)1.7.1開始激勵(lì)函數(shù)是使用所有神經(jīng)網(wǎng)絡(luò)算法的必備“神器”。激勵(lì)函數(shù)的目的是為了調(diào)節(jié)權(quán)重和偏差。在TensorFlow中,激勵(lì)函數(shù)是作用在張量上的非線性操作。激勵(lì)函數(shù)的使用方法和前面的數(shù)學(xué)操作相似。激勵(lì)函數(shù)的功能有很多,但其主要是為計(jì)算圖歸一化返回結(jié)果而引進(jìn)的非線性部分。創(chuàng)建一個(gè)TensorFlow計(jì)算圖:1.7.2動(dòng)手做TensorFlow的激勵(lì)函數(shù)位于神經(jīng)網(wǎng)絡(luò)(neuralnetwork,nn)庫。除了使用TensorFlow內(nèi)建激勵(lì)函數(shù)外,我們也可以使用TensorFlow操作設(shè)計(jì)自定義激勵(lì)函數(shù)。導(dǎo)入預(yù)定義激勵(lì)函數(shù)(importtensorflow.nnasnn),或者在函數(shù)中顯式調(diào)用.nn。這里,選擇每個(gè)函數(shù)顯式調(diào)用的方法。1.ReLU(RectifierLinearUnit,整流線性單元)激勵(lì)函數(shù)是神經(jīng)網(wǎng)絡(luò)最常用的非線性函數(shù)。其函數(shù)為max(0,x),連續(xù)但不平滑。示例如下:2.有時(shí)為了抵消ReLU激勵(lì)函數(shù)的線性增長部分,會(huì)在min()函數(shù)中嵌入max(0,x),其在TensorFlow中的實(shí)現(xiàn)稱作ReLU6,表示為min(max(0,x),6)。這是hard-sigmoid函數(shù)的變種,計(jì)算運(yùn)行速度快,解決梯度消失(無限趨近于0),這些將在第8章和第9章中詳細(xì)闡述,使用方式如下:3.sigmoid函數(shù)是最常用的連續(xù)、平滑的激勵(lì)函數(shù)。它也被稱作邏輯函數(shù)(Logistic函數(shù)),表示為1/(1+exp(-x))。sigmoid函數(shù)由于在機(jī)器學(xué)習(xí)訓(xùn)練過程中反向傳播項(xiàng)趨近于0,因此不怎么使用。使用方式如下:注意,有些激勵(lì)函數(shù)不以0為中心,比如,sigmoid函數(shù)。在大部分計(jì)算圖算法中要求優(yōu)先使用均值為0的樣本數(shù)據(jù)集。4.另外一種激勵(lì)函數(shù)是雙曲正切函數(shù)(tanh)。雙曲正切函數(shù)與sigmoid函數(shù)相似,但有一點(diǎn)不同:雙曲正切函數(shù)取值范圍為0到1;sigmoid函數(shù)取值范圍為-1到1。雙曲正切函數(shù)是雙曲正弦與雙曲余弦的比值,另外一種寫法是((exp(x)-exp(-x))/(exp(x)+exp(-x))。使用方式如下:5.softsign函數(shù)也是一種激勵(lì)函數(shù),表達(dá)式為:x/(abs(x)+1)。softsign函數(shù)是符號(hào)函數(shù)的連續(xù)(但不平滑)估計(jì),使用方式如下:6.softplus激勵(lì)函數(shù)是ReLU激勵(lì)函數(shù)的平滑版,表達(dá)式為:log(exp(x)+1)。使用方式如下:注意,當(dāng)輸入增加時(shí),softplus激勵(lì)函數(shù)趨近于無限大,softsign函數(shù)趨近于1;當(dāng)輸入減小時(shí),softplus激勵(lì)函數(shù)趨近于0,softsign函數(shù)趨近于-1。7.ELU(ExponentialLinearUnit,指數(shù)線性單元)激勵(lì)函數(shù)與softplus激勵(lì)函數(shù)相似,不同點(diǎn)在于:當(dāng)輸入無限小時(shí),ELU激勵(lì)函數(shù)趨近于-1,而softplus激勵(lì)函數(shù)趨近于0。其表達(dá)式為(exp(x)+1)ifx<0elsex,使用方式如下:1.7.3工作原理上面這些激勵(lì)函數(shù)是神經(jīng)網(wǎng)絡(luò)或其他計(jì)算圖引入的非線性部分,并需要知道在什么位置使用激勵(lì)函數(shù)。如果激勵(lì)函數(shù)的取值范圍在0和1之間,比如sigmoid激勵(lì)函數(shù),那計(jì)算圖輸出結(jié)果也只能在0到1之間取值。如果激勵(lì)函數(shù)隱藏在節(jié)點(diǎn)之間,就要意識(shí)到激勵(lì)函數(shù)作用于傳入的張量的影響。如果張量要縮放為均值為0,就需要使用激勵(lì)函數(shù)以使得盡可能多的變量在0附近。這暗示我們選用雙曲正切(tanh)函數(shù)或者softsign函數(shù),如果張量要縮放為正數(shù),那么應(yīng)當(dāng)選用保留變量在正數(shù)范圍內(nèi)的激勵(lì)函數(shù)。1.7.4延伸學(xué)習(xí)圖1-3和圖1-4展示了不同的激勵(lì)函數(shù),從中可以看到的激勵(lì)函數(shù)有ReLU、ReLU6、softplus、ELU、sigmoid、softsign和tanh。在圖1-3中,我們可以看到四種激勵(lì)函數(shù):ReLU、ReLU6、softplus和ELU。這些激勵(lì)函數(shù)輸入值小于0時(shí)輸出值逐漸變平,輸入值大于0時(shí)輸出值線性增長(除了ReLU6函數(shù)有最大值6)。圖1-4展示的是sigmoid、tanh和softsign激勵(lì)函數(shù)。這些激勵(lì)函數(shù)都是平滑的,具有S型,注意有兩個(gè)激勵(lì)函數(shù)有水平漸近線。圖1-3ReLU、ReLU6、softplus和ELU激勵(lì)函數(shù)圖1-4sigmoid、softsign和tanh激勵(lì)函數(shù)1.8讀取數(shù)據(jù)源本書中使用樣本數(shù)據(jù)集訓(xùn)練機(jī)器學(xué)習(xí)算法模型,本節(jié)簡要介紹如何通過TensorFlow和Python訪問各種數(shù)據(jù)源。一些數(shù)據(jù)源依賴于外部網(wǎng)站的維護(hù),以便你可以訪問數(shù)據(jù)。如果這些網(wǎng)站更改或刪除此數(shù)據(jù),則可能需要更新本節(jié)中的以下某些代碼。你可以在作者的GitHub頁面上找到更新的代碼:\h/nfmcclure/tensorflow_cookbook。1.8.1開始在TensorFlow中,有些數(shù)據(jù)集使用Python內(nèi)建庫,有的需要編寫Python腳本下載,還有些得手動(dòng)從網(wǎng)上下載。所有這些數(shù)據(jù)集都需要聯(lián)網(wǎng)才能獲取到。1.8.2動(dòng)手做1.鳶尾花卉數(shù)據(jù)(Irisdata)。此樣本數(shù)據(jù)是機(jī)器學(xué)習(xí)和統(tǒng)計(jì)分析最經(jīng)典的數(shù)據(jù)集,包含山鳶尾、變色鳶尾和維吉尼亞鳶尾各自的花萼和花瓣的長度和寬度。總共有150個(gè)數(shù)據(jù)樣本,每類有50個(gè)樣本。用Python加載樣本數(shù)據(jù)集時(shí),可以使用ScikitLearn的數(shù)據(jù)集函數(shù),使用方式如下:2.出生體重?cái)?shù)據(jù)(Birthweightdata)。該數(shù)據(jù)來自1986年斯普林菲爾德的Baystate醫(yī)療中心,此樣本數(shù)據(jù)集是嬰兒出生體重以及母親和家庭歷史人口統(tǒng)計(jì)學(xué)、醫(yī)學(xué)指標(biāo),有189個(gè)樣本集,包含11個(gè)特征變量。使用Python訪問數(shù)據(jù)的方式如下:3.波士頓房價(jià)數(shù)據(jù)(BostonHousingdata)。此樣本數(shù)據(jù)集保存在卡內(nèi)基梅隆大學(xué)機(jī)器學(xué)習(xí)倉庫,總共有506個(gè)房價(jià)樣本,包含14個(gè)特征變量。使用Python獲取數(shù)據(jù)的方式如下(通過keras庫):4.MNIST手寫體字庫:MNIST手寫體字庫是NIST手寫體字庫的子樣本數(shù)據(jù)集,可以網(wǎng)址\h/exdb/mnist/下載。包含70000張數(shù)字0到9的圖片,其中60000張標(biāo)注為訓(xùn)練樣本數(shù)據(jù)集,10000張為測(cè)試樣本數(shù)據(jù)集。TensorFlow提供內(nèi)建函數(shù)來訪問它,MNIST手寫體字庫常用來進(jìn)行圖像識(shí)別訓(xùn)練。在機(jī)器學(xué)習(xí)中,提供驗(yàn)證樣本數(shù)據(jù)集來預(yù)防過擬合是非常重要的,TensorFlow從訓(xùn)練樣本數(shù)據(jù)集中留出5000張圖片作為驗(yàn)證樣本數(shù)據(jù)集。這里展示使用Python訪問數(shù)據(jù)的方式:5.垃圾郵件文本數(shù)據(jù)(Spam-hamtextdata)。通過以下方式訪問垃圾郵件文本數(shù)據(jù):6.影評(píng)樣本數(shù)據(jù)。此樣本數(shù)據(jù)集是電影觀看者的影評(píng),分為好評(píng)和差評(píng),可以在網(wǎng)站\h/people/pabo/movie-review-data/下載。這里用Python進(jìn)行數(shù)據(jù)處理,使用方式如下:7.CIFAR-10圖像數(shù)據(jù)。此圖像數(shù)據(jù)集是CIFAR機(jī)構(gòu)發(fā)布的8000萬張彩色圖片(已縮放為32×32像素)的子集,總共分10類(包括飛機(jī)、汽車、鳥等),60000張圖片。50000張圖片訓(xùn)練數(shù)據(jù)集,10000張測(cè)試數(shù)據(jù)集。由于這個(gè)圖像數(shù)據(jù)集數(shù)據(jù)量大,并在本書中以多種方式使用,后面到具體用時(shí)再細(xì)講,訪問網(wǎng)址為:\h/~kriz/cifar.html。8.莎士比亞著作文本數(shù)據(jù)(Shakespearetextdata)。此文本數(shù)據(jù)集是古登堡數(shù)字電子書計(jì)劃提供的免費(fèi)電子書籍,其中編譯了莎士比亞的所有著作。用Python訪問文本文件的方式如下:9.英德句子翻譯數(shù)據(jù)。此數(shù)據(jù)集由Tatoeba(在線翻譯數(shù)據(jù)庫)發(fā)布,ManyT(\h)整理并提供下載。這里提供英德語句互譯的文本文件(可以通過改變URL使用你需要的任何語言的文本文件),使用方式如下:1.8.3工作原理如果需要使用這里介紹的數(shù)據(jù)集,建議讀者采用如前所述的數(shù)據(jù)下載和預(yù)處理方式。1.8.4參考1.9其他資源這里提供一些關(guān)于TensorFlow使用和學(xué)習(xí)的鏈接、文檔資料和用例。1.9.1開始當(dāng)開始學(xué)習(xí)使用TensorFlow時(shí),需要知道在哪里能找到幫助。本節(jié)提供了一個(gè)可以幫助讀者使用TensorFlow以及糾錯(cuò)的目錄。1.9.2動(dòng)手做TensorFlow資源列表如下:1.本書代碼可在GitHub(\h/nfmcclure/tensorflow_cookbook)或Packt代碼庫(\h/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)獲取。2.TensorFlow官方PythonAPI文檔地址為\h/api_docs/python。其中包括TensorFlow所有函數(shù)、對(duì)象和方法的文檔和例子。3.TensorFlow官方教程相當(dāng)詳細(xì),訪問網(wǎng)址為\h/tutorials/index.html。包括圖像識(shí)別模型、Word2Vec、RNN模型和sequence-to-sequence模型,也有些偏微分方程的例子。后續(xù)還會(huì)不斷增加更多實(shí)例。4.TensorFlow官方GitHub倉庫網(wǎng)址為\h/tensorflow/tensorflow。你可以查看源代碼,甚至包含fork或者clone最新代碼。也可以看到最近的issue。5.TensorFlow在Dockerhub上維護(hù)的公開Docker鏡像,網(wǎng)址為\h/r/tensorflow/tensorflow/。6.StackOverflow上有TensorFlow標(biāo)簽的知識(shí)問答。隨著TensorFlow日益流行,這個(gè)標(biāo)簽下的問答在不斷增長,訪問網(wǎng)址為\h/questions/tagged/TensorFlow。7.TensorFlow非常靈活,應(yīng)用場(chǎng)景廣,最常用的是深度學(xué)習(xí)。為了理解深度學(xué)習(xí)的基礎(chǔ),數(shù)學(xué)知識(shí)和深度學(xué)習(xí)開發(fā),Google在在線課程Udacity上開課,網(wǎng)址為\h/course/deep-learning--ud730。8.TensorFlow也提供一個(gè)網(wǎng)站,讓你可以可視化地查看隨著參數(shù)和樣本數(shù)據(jù)集的變化對(duì)訓(xùn)練神經(jīng)網(wǎng)絡(luò)的影響,網(wǎng)址為\h。9.深度學(xué)習(xí)開山祖師爺GeoffreyHinton在Coursera上開課教授“機(jī)器學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)”,網(wǎng)址為\h/learn/neural-networks。10.斯坦福大學(xué)提供在線課程“圖像識(shí)別中卷積神經(jīng)網(wǎng)絡(luò)”及其詳細(xì)的課件,網(wǎng)址為\h/。第2章TensorFlow進(jìn)階本章將介紹如何使用TensorFlow的關(guān)鍵組件,并串聯(lián)起來創(chuàng)建一個(gè)簡單的分類器,評(píng)估輸出結(jié)果。閱讀本章你會(huì)學(xué)到以下知識(shí)點(diǎn):·計(jì)算圖中的操作·TensorFlow的嵌入Layer·TensorFlow的多層Layer·TensorFlow實(shí)現(xiàn)損失函數(shù)·TensorFlow實(shí)現(xiàn)反向傳播·TensorFlow實(shí)現(xiàn)隨機(jī)訓(xùn)練和批量訓(xùn)練·TensorFlow實(shí)現(xiàn)創(chuàng)建分類器·TensorFlow實(shí)現(xiàn)模型評(píng)估2.1簡介現(xiàn)在我們已經(jīng)學(xué)習(xí)完TensorFlow如何創(chuàng)建張量,使用變量和占位符;下面將把這些對(duì)象組成一個(gè)計(jì)算圖?;诖?,創(chuàng)建一個(gè)簡單的分類器,并看下性能如何。本書的所有源代碼可以在GitHub(\h/nfmcclure/tensorflow_cookbook)下載。2.2計(jì)算圖中的操作現(xiàn)在可以把這些對(duì)象表示成計(jì)算圖,下面介紹計(jì)算圖中作用于對(duì)象的操作。2.2.1開始導(dǎo)入TensorFlow,創(chuàng)建一個(gè)會(huì)話,開始一個(gè)計(jì)算圖:2.2.2動(dòng)手做在這個(gè)例子中,我們將結(jié)合前面所學(xué)的知識(shí),傳入一個(gè)列表到計(jì)算圖中的操作,并打印返回值:1.首先,聲明張量和占位符。這里,創(chuàng)建一個(gè)numpy數(shù)組,傳入計(jì)算圖操作:上述代碼的輸出如下所示:2.2.3工作原理首先,創(chuàng)建數(shù)據(jù)集和計(jì)算圖操作,然后傳入數(shù)據(jù)、打印返回值。下面展示計(jì)算圖(見圖2-1):圖2-1圖中展示了占位符x_data、乘法常量傳入乘法操作2.3TensorFlow的嵌入Layer在本節(jié),我們將學(xué)習(xí)如何在同一個(gè)計(jì)算圖中進(jìn)行多個(gè)乘法操作。2.3.1開始下面我們將用兩個(gè)矩陣乘以占位符,然后做加法。傳入兩個(gè)矩陣(三維numpy數(shù)組):2.3.2動(dòng)手做知道數(shù)據(jù)在傳入后是如何改變形狀的也是非常重要的。我們將傳入兩個(gè)形狀為3×5的numpy數(shù)組,然后每個(gè)矩陣乘以常量矩陣(形狀為5×1),將返回一個(gè)形狀為3×1的矩陣。緊接著再乘以1×1的矩陣,返回的結(jié)果矩陣仍然為3×1。最后,加上一個(gè)3×1的矩陣,示例如下:1.首先,創(chuàng)建數(shù)據(jù)和占位符:2.接著,創(chuàng)建矩陣乘法和加法中要用到的常量矩陣:3.現(xiàn)在聲明操作,表示成計(jì)算圖:4.最后,通過計(jì)算圖傳入數(shù)據(jù):2.3.3工作原理上面創(chuàng)建的計(jì)算圖可以用Tensorboard可視化。Tensorboard是TensorFlow的功能,允許用戶在圖中可視化計(jì)算圖和值。這些功能是原生的,不像其他機(jī)器學(xué)習(xí)框架。如果想知道這是如何做到的,可參見第11章。圖2-2是分層的計(jì)算圖。圖2-2在圖中可以看到向上傳播的計(jì)算圖的數(shù)據(jù)大小2.3.4延伸學(xué)習(xí)在我們通過計(jì)算圖運(yùn)行數(shù)據(jù)之前要提前估計(jì)好聲明數(shù)據(jù)的形狀以及預(yù)估操作返回值的形狀。由于預(yù)先不知道,或者維度在變化,情況也可能發(fā)生變化。為了實(shí)現(xiàn)目標(biāo),我們指明變化的維度,或者事先不知道的維度設(shè)為None。例如,占位符列數(shù)未知,使用方式如下:上面雖然允許打破矩陣乘法規(guī)則,但仍然需要遵守——乘以常量矩陣返回值有一致的行數(shù)。在計(jì)算圖中,也可以傳入動(dòng)態(tài)的x_data,或者更改形狀的x_data,具體細(xì)節(jié)將在多批量傳入數(shù)據(jù)時(shí)講解。盡管可以使用None調(diào)節(jié)變量在某個(gè)維度上的大小,但是建議讀者盡量能夠明確變量的形狀,并在代碼中明確。None維度主要應(yīng)用在限制訓(xùn)練或者測(cè)試時(shí)的數(shù)據(jù)批量大?。匆淮斡?jì)算時(shí)多少個(gè)數(shù)據(jù)點(diǎn)參與運(yùn)算)方面。2.4TensorFlow的多層Layer目前,我們已經(jīng)學(xué)完在同一個(gè)計(jì)算圖中進(jìn)行多個(gè)操作,接下來將講述如何連接傳播數(shù)據(jù)的多個(gè)層。2.4.1開始本節(jié)中,將介紹如何更好地連接多層Layer,包括自定義Layer。這里給出一個(gè)例子(數(shù)據(jù)是生成隨機(jī)圖片數(shù)據(jù)),以更好地理解不同類型的操作和如何用內(nèi)建層Layer進(jìn)行計(jì)算。我們對(duì)2D圖像進(jìn)行滑動(dòng)窗口平均,然后通過自定義操作層Layer返回結(jié)果。在這節(jié),我們將會(huì)看到TensorFlow的計(jì)算圖太大,導(dǎo)致無法完整查看。為了解決此問題,將對(duì)各層Layer和操作進(jìn)行層級(jí)命名管理。按照慣例,加載numpy和tensorflow模塊,創(chuàng)建計(jì)算圖,代碼如下:2.4.2動(dòng)手做1.首先,通過numpy創(chuàng)建2D圖像,4×4像素圖片。我們將創(chuàng)建成四維:第一維和最后一維大小為1。注意,TensorFlow的圖像函數(shù)是處理四維圖片的,這四維是:圖片數(shù)量、高度、寬度和顏色通道。這里是一張圖片,單顏色通道,所以設(shè)兩個(gè)維度值為1:2.下面在計(jì)算圖中創(chuàng)建占位符。此例中占位符是用來傳入圖片的,代碼如下:3.為了創(chuàng)建過濾4×4像素圖片的滑動(dòng)窗口,我們將用TensorFlow內(nèi)建函數(shù)conv2d()(常用來做圖像處理)卷積2×2形狀的常量窗口。conv2d()函數(shù)傳入滑動(dòng)窗口、過濾器和步長。本例將在滑動(dòng)窗口四個(gè)方向上計(jì)算,所以在四個(gè)方向上都要指定步長。創(chuàng)建一個(gè)2×2的窗口,每個(gè)方向長度為2的步長。為了計(jì)算平均值,我們將用常量為0.25的向量與2×2的窗口卷積,代碼如下:可以使用函數(shù)中的name參數(shù)將層命名為Moring-Arg-Window。還可以使用公式:Output=(W-F+2P)/S+1計(jì)算卷積層的返回值形狀。這里,W是輸入形狀,F(xiàn)是過濾器形狀,P是padding的大小,S是步長形狀。4.現(xiàn)在定義一個(gè)自定義Layer,操作滑動(dòng)窗口平均的2×2的返回值。自定義函數(shù)將輸入張量乘以一個(gè)2×2的矩陣張量,然后每個(gè)元素加1。因?yàn)榫仃嚦朔ㄖ挥?jì)算二維矩陣,所以剪裁圖像的多余維度(大小為1)。TensorFlow通過內(nèi)建函數(shù)squeeze()剪裁。下面是新定義的Layer:5.現(xiàn)在把剛剛新定義的Layer加入到計(jì)算圖中,并且用_scope()命名唯一的Layer名字,后續(xù)在計(jì)算圖中可折疊/擴(kuò)展Custom_Layer層,代碼如下:6.為占位符傳入4×4像素圖片,然后執(zhí)行計(jì)算圖,代碼如下:2.4.3工作原理已命名的層級(jí)Layer和操作的可視化圖看起來更清晰,我們可以折疊和展開已命名的自定義層Layer。在圖2-3中,我們可以在左邊看到折疊的概略圖,在右邊看到展開的詳細(xì)圖:2.5TensorFlow實(shí)現(xiàn)損失函數(shù)損失函數(shù)(lossfunction)對(duì)機(jī)器學(xué)習(xí)來講是非常重要的。它們度量模型輸出值與目標(biāo)值(target)間的差值。本節(jié)會(huì)介紹TensorFlow中實(shí)現(xiàn)的各種損失函數(shù)。圖2-3兩層計(jì)算圖。第一層是Moving_Avg_Window,第二層是Custom_Layer2.5.1開始為了優(yōu)化機(jī)器學(xué)習(xí)算法,我們需要評(píng)估機(jī)器學(xué)習(xí)模型訓(xùn)練輸出結(jié)果。在TensorFlow中評(píng)估輸出結(jié)果依賴損失函數(shù)。損失函數(shù)告訴TensorFlow,預(yù)測(cè)結(jié)果相比期望的結(jié)果是好是壞。在大部分場(chǎng)景下,我們會(huì)有算法模型訓(xùn)練的樣本數(shù)據(jù)集和目標(biāo)值。損失函數(shù)比較預(yù)測(cè)值與目標(biāo)值,并給出兩者之間的數(shù)值化的差值。本節(jié)會(huì)介紹TensorFlow能實(shí)現(xiàn)的大部分損失函數(shù)。為了比較不同損失函數(shù)的區(qū)別,我們將會(huì)在圖表中繪制出來。先創(chuàng)建計(jì)算圖,然后加載matplotlib(Python的繪圖庫),代碼如下:2.5.2動(dòng)手做1.回歸算法的損失函數(shù)。回歸算法是預(yù)測(cè)連續(xù)因變量的。創(chuàng)建預(yù)測(cè)序列和目標(biāo)序列作為張量,預(yù)測(cè)序列是-1到1之間的等差數(shù)列,代碼如下:2.L2正則損失函數(shù)(即歐拉損失函數(shù))。L2正則損失函數(shù)是預(yù)測(cè)值與目標(biāo)值差值的平方和。注意,上述例子中目標(biāo)值為0。L2正則損失函數(shù)是非常有用的損失函數(shù),因?yàn)樗谀繕?biāo)值附近有更好的曲度,機(jī)器學(xué)習(xí)算法利用這點(diǎn)收斂,并且離目標(biāo)越近收斂越慢,代碼如下:TensorFlow有內(nèi)建的L2正則形式,稱為nn.l2_loss()。這個(gè)函數(shù)其實(shí)是實(shí)際L2正則的一半,換句話說,它是上面l2_y_vals的1/2。3.L1正則損失函數(shù)(即絕對(duì)值損失函數(shù))。與L2正則損失函數(shù)對(duì)差值求平方不同的是,L1正則損失函數(shù)對(duì)差值求絕對(duì)值,其優(yōu)勢(shì)在于當(dāng)誤差較大時(shí)不會(huì)變得更陡峭。L1正則在目標(biāo)值附近不平滑,這會(huì)導(dǎo)致算法不能很好地收斂。代碼如下:4.Pseudo-Huber損失函數(shù)是Huber損失函數(shù)的連續(xù)、平滑估計(jì),試圖利用L1和L2正則削減極值處的陡峭,使得目標(biāo)值附近連續(xù)。它的表達(dá)式依賴參數(shù)delta。我們將繪圖來顯示delta1=0.25和delta2=5的區(qū)別,代碼如下:現(xiàn)在我們轉(zhuǎn)向用于分類問題的損失函數(shù)。分類損失函數(shù)是用來評(píng)估預(yù)測(cè)分類結(jié)果的。通常,模型對(duì)分類的輸出為一個(gè)0~1之間的實(shí)數(shù)。然后我們選定一個(gè)截止點(diǎn)(通常為0.5),并根據(jù)輸出是否高于此點(diǎn)進(jìn)行分類。5.重新給x_vals和target賦值,保存返回值并在下節(jié)繪制出來,代碼如下:6.Hinge損失函數(shù)主要用來評(píng)估支持向量機(jī)算法,但有時(shí)也用來評(píng)估神經(jīng)網(wǎng)絡(luò)算法。在本例中是計(jì)算兩個(gè)目標(biāo)類(-1,1)之間的損失。下面的代碼中,使用目標(biāo)值1,所以預(yù)測(cè)值離1越近,損失函數(shù)值越?。?.兩類交叉熵?fù)p失函數(shù)(Cross-entropyloss)有時(shí)也作為邏輯損失函數(shù)。比如,當(dāng)預(yù)測(cè)兩類目標(biāo)0或者1時(shí),希望度量預(yù)測(cè)值到真實(shí)分類值(0或者1)的距離,這個(gè)距離經(jīng)常是0到1之間的實(shí)數(shù)。為了度量這個(gè)距離,我們可以使用信息論中的交叉熵,代碼如下:8.Sigmoid交叉熵?fù)p失函數(shù)(Sigmoidcrossentropyloss)與上一個(gè)損失函數(shù)非常類似,有一點(diǎn)不同的是,它先把x_vals值通過sigmoid函數(shù)轉(zhuǎn)換,再計(jì)算交叉熵?fù)p失,代碼如下:9.加權(quán)交叉熵?fù)p失函數(shù)(Weightedcrossentropyloss)是Sigmoid交叉熵?fù)p失函數(shù)的加權(quán),對(duì)正目標(biāo)加權(quán)。舉個(gè)例子,我們將正目標(biāo)加權(quán)權(quán)重0.5,代碼如下:10.Softmax交叉熵?fù)p失函數(shù)(Softmaxcross-entropyloss)是作用于非歸一化的輸出結(jié)果,只針對(duì)單個(gè)目標(biāo)分類的計(jì)算損失。通過softmax函數(shù)將輸出結(jié)果轉(zhuǎn)化成概率分布,然后計(jì)算真值概率分布的損失,代碼如下:11.稀疏Softmax交叉熵?fù)p失函數(shù)(Sparsesoftmaxcross-entropyloss)和上一個(gè)損失函數(shù)類似,它是把目標(biāo)分類為true的轉(zhuǎn)化成index,而Softmax交叉熵?fù)p失函數(shù)將目標(biāo)轉(zhuǎn)成概率分布。代碼如下:2.5.3工作原理這里用matplotlib繪制回歸算法的損失函數(shù)(見圖2-4):下面是用matplotlib繪制各種分類算法損失函數(shù)(見圖2-5):圖2-4各種回歸算法的損失函數(shù)圖2-5各種分類算法的損失函數(shù)2.5.4延伸學(xué)習(xí)下面總結(jié)一下前面描述的各種損失函數(shù):其他分類算法的損失函數(shù)都需要做交叉熵?fù)p失。Sigmoid交叉熵?fù)p失函數(shù)被用在非歸一化邏輯操作,先計(jì)算sigmoid,再計(jì)算交叉熵。TensorFlow有很好的內(nèi)建方法來處理數(shù)值邊界問題。Softmax交叉熵和稀疏Softmax交叉熵都類似。這里大部分描述的分類算法損失函數(shù)是針對(duì)二類分類預(yù)測(cè),不過也可以通過對(duì)每個(gè)預(yù)測(cè)值/目標(biāo)的交叉熵求和,擴(kuò)展成多類分類。也有一些其他指標(biāo)來評(píng)價(jià)機(jī)器學(xué)習(xí)模型,這里給出一個(gè)列表。2.6TensorFlow實(shí)現(xiàn)反向傳播使用TensorFlow的一個(gè)優(yōu)勢(shì)是,它可以維護(hù)操作狀態(tài)和基于反向傳播自動(dòng)地更新模型變量。本節(jié)將介紹如何使用這種優(yōu)勢(shì)來訓(xùn)練機(jī)器學(xué)習(xí)模型。2.6.1開始現(xiàn)在開始介紹如何調(diào)節(jié)模型變量來最小化損失函數(shù)。前面已經(jīng)學(xué)習(xí)了創(chuàng)建對(duì)象和操作,創(chuàng)建度量預(yù)測(cè)值和目標(biāo)值之間差值的損失函數(shù)。這里將講解TensorFlow是如何通過計(jì)算圖來實(shí)現(xiàn)最小化損失函數(shù)的誤差反向傳播進(jìn)而更新變量的。這步將通過聲明優(yōu)化函數(shù)(optimizationfunction)來實(shí)現(xiàn)。一旦聲明好優(yōu)化函數(shù),TensorFlow將通過它在所有的計(jì)算圖中解決反向傳播的項(xiàng)。當(dāng)我們傳入數(shù)據(jù),最小化損失函數(shù),TensorFlow會(huì)在計(jì)算圖中根據(jù)狀態(tài)相應(yīng)的調(diào)節(jié)變量。本節(jié)先舉個(gè)簡單的回歸算法的例子。從均值為1、標(biāo)準(zhǔn)差為0.1的正態(tài)分布中抽樣隨機(jī)數(shù),然后乘以變量A,目標(biāo)值為10,損失函數(shù)為L2正則損失函數(shù)。理論上,A的最優(yōu)值是10,因?yàn)樯傻臉永龜?shù)據(jù)均值是1。第二個(gè)例子是一個(gè)簡單的二值分類算法。從兩個(gè)正態(tài)分布(N(-1,1)和N(3,1))生成100個(gè)數(shù)。所有從正態(tài)分布N(-1,1)生成的數(shù)據(jù)標(biāo)為目標(biāo)類0;從正態(tài)分布N(3,1)生成的數(shù)據(jù)標(biāo)為目標(biāo)類1,模型算法通過sigmoid函數(shù)將這些生成的數(shù)據(jù)轉(zhuǎn)換成目標(biāo)類數(shù)據(jù)。換句話講,模型算法是sigmoid(x+A),其中,A是要擬合的變量,理論上A=-1。假設(shè),兩個(gè)正態(tài)分布的均值分別是m1和m2,則達(dá)到A的取值時(shí),它們通過-(m1+m2)/2轉(zhuǎn)換成到0等距的值。后面將會(huì)在TensorFlow中見證怎樣取到相應(yīng)的值。同時(shí),指定一個(gè)合適的學(xué)習(xí)率對(duì)機(jī)器學(xué)習(xí)算法的收斂是有幫助的。優(yōu)化器類型也需要指定,前面的兩個(gè)例子使用標(biāo)準(zhǔn)梯度下降法,由TensorFlow中的GradientDescentOptimizer()函數(shù)實(shí)現(xiàn)。2.6.2動(dòng)手做這里是回歸算法例子:1.導(dǎo)入Python的數(shù)值計(jì)算模塊,numpy和tensorflow:2.創(chuàng)建計(jì)算圖會(huì)話:3.生成數(shù)據(jù),創(chuàng)建占位符和變量A:4.增加乘法操作:5.增加L2正則損失函數(shù):6.現(xiàn)在聲明變量的優(yōu)化器。大部分優(yōu)化器算法需要知道每步迭代的步長,這距離是由學(xué)習(xí)率控制的。如果學(xué)習(xí)率太小,機(jī)器學(xué)習(xí)算法可能耗時(shí)很長才能收斂;如果學(xué)習(xí)率太大,機(jī)器學(xué)習(xí)算法可能會(huì)跳過最優(yōu)點(diǎn)。相應(yīng)地導(dǎo)致梯度消失和梯度爆炸問題。學(xué)習(xí)率對(duì)算法的收斂影響較大,我們會(huì)在本節(jié)結(jié)尾探討。在本節(jié)中使用的是標(biāo)準(zhǔn)梯度下降算法,但實(shí)際情況應(yīng)該因問題而異,不同的問題使用不同的優(yōu)化器算法,具體見2.6.5節(jié)中SebastianRuder所寫的文章。7.在運(yùn)行之前,需要初始化變量:選取最優(yōu)的學(xué)習(xí)率的理論很多,但真正解決機(jī)器學(xué)習(xí)算法的問題很難。2.6.5節(jié)列出了特定算法的學(xué)習(xí)率選取方法。8.最后一步是訓(xùn)練算法。我們迭代101次,并且每25次迭代打印返回結(jié)果。選擇一個(gè)隨機(jī)的x和y,傳入計(jì)算圖中。TensorFlow將自動(dòng)地計(jì)算損失,調(diào)整A偏差來最小化損失:現(xiàn)在將介紹簡單的分類算法例子。如果先重置一下前面的TensorFlow計(jì)算圖,我們就可以使用相同的TensorFlow腳本繼續(xù)分類算法的例子。我們?cè)噲D找到一個(gè)優(yōu)化的轉(zhuǎn)換方式A,它可以把兩個(gè)正態(tài)分布轉(zhuǎn)換到原點(diǎn),sigmoid函數(shù)將正態(tài)分布分割成不同的兩類。9.首先,重置計(jì)算圖,并且重新初始化變量:10.從正態(tài)分布(N(-1,1),N(3,1))生成數(shù)據(jù)。同時(shí)也生成目標(biāo)標(biāo)簽,占位符和偏差變量A:初始化變量A為10附近的值,遠(yuǎn)離理論值-1。這樣可以清楚地顯示算法是如何從10收斂為-1的。11.增加轉(zhuǎn)換操作。這里不必封裝sigmoid函數(shù),因?yàn)閾p失函數(shù)中會(huì)實(shí)現(xiàn)此功能:12.由于指定的損失函數(shù)期望批量數(shù)據(jù)增加一個(gè)批量數(shù)的維度,這里使用expand_dims()函數(shù)增加維度。下節(jié)將討論如何使用批量變量訓(xùn)練,這次還是一次使用一個(gè)隨機(jī)數(shù)據(jù):13.初始化變量A:14.聲明損失函數(shù),這里使用一個(gè)帶非歸一化logits的交叉熵的損失函數(shù),同時(shí)會(huì)用sigmoid函數(shù)轉(zhuǎn)換。TensorFlow的nn.sigmoid_cross_entropy_with_logits()函數(shù)實(shí)現(xiàn)所有這些功能,需要向它傳入指定的維度,代碼如下:15.如前面回歸算法的例子,增加一個(gè)優(yōu)化器函數(shù)讓TensorFlow知道如何更新和偏差變量:16.最后,通過隨機(jī)選擇的數(shù)據(jù)迭代幾百次,相應(yīng)地更新變量A。每迭代200次打印出損失和變量A的返回值:2.6.3工作原理作為概括,總結(jié)如下幾點(diǎn):1.生成數(shù)據(jù),所有樣本均需要通過占位符進(jìn)行加載。2.初始化占位符和變量。這兩個(gè)算法中,由于使用相同的數(shù)據(jù),所以占位符相似,同時(shí)均有一個(gè)乘法變量A,但第二個(gè)分類算法多了一個(gè)偏差變量。3.創(chuàng)建損失函數(shù),對(duì)于回歸問題使用L2損失函數(shù),對(duì)于分類問題使用交叉熵?fù)p失函數(shù)。4.定義一個(gè)優(yōu)化器算法,所有算法均使用梯度下降。5.最后,通過隨機(jī)數(shù)據(jù)樣本進(jìn)行迭代,更新變量。2.6.4延伸學(xué)習(xí)前面涉及的優(yōu)化器算法對(duì)學(xué)習(xí)率的選擇較敏感。下面給出學(xué)習(xí)率選擇總結(jié):有時(shí),標(biāo)準(zhǔn)梯度下降算法會(huì)明顯卡頓或者收斂變慢,特別是在梯度為0的附近的點(diǎn)。為了解決此問題,TensorFlow的MomentumOptimizer()函數(shù)增加了一項(xiàng)勢(shì)能,前一次迭代過程的梯度下降值的倒數(shù)。另外一個(gè)可以改變的是優(yōu)化器的步長,理想情況下,對(duì)于變化小的變量使用大步長;而變化迅速的變量使用小步長。這里不會(huì)進(jìn)行數(shù)學(xué)公式推導(dǎo),但給出實(shí)現(xiàn)這種優(yōu)點(diǎn)的常用算法:Adagrad算法。此算法考慮整個(gè)歷史迭代的變量梯度,TensorFlow中相應(yīng)功能的實(shí)現(xiàn)是AdagradOptimizer()函數(shù)。有時(shí),由于Adagrad算法計(jì)算整個(gè)歷史迭代的梯度,導(dǎo)致梯度迅速變?yōu)?。解決這個(gè)局限性的是Adadelta算法,它限制使用的迭代次數(shù)。TensorFlow中相應(yīng)功能的實(shí)現(xiàn)是AdadeltaOptimizer()函數(shù)。還有一些其他的優(yōu)化器算法實(shí)現(xiàn),請(qǐng)閱讀TensorFlow官方文檔:\h/api_guides/python/train。2.6.5參考2.7TensorFlow實(shí)現(xiàn)批量訓(xùn)練和隨機(jī)訓(xùn)練根據(jù)上面描述的反向傳播算法,TensorFlow更新模型變量。它能一次操作一個(gè)數(shù)據(jù)點(diǎn),也可以一次操作大量數(shù)據(jù)。一個(gè)訓(xùn)練例子上的操作可能導(dǎo)致比較“古怪”的學(xué)習(xí)過程,但使用大批量的訓(xùn)練會(huì)造成計(jì)算成本昂貴。到底選用哪種訓(xùn)練類型對(duì)機(jī)器學(xué)習(xí)算法的收斂非常關(guān)鍵。2.7.1開始為了TensorFlow計(jì)算變量梯度來讓反向傳播工作,我們必須度量一個(gè)或者多個(gè)樣本的損失。與前一節(jié)所做的相似,隨機(jī)訓(xùn)練會(huì)一次隨機(jī)抽樣訓(xùn)練數(shù)據(jù)和目標(biāo)數(shù)據(jù)對(duì)完成訓(xùn)練。另外一個(gè)可選項(xiàng)是,一次大批量訓(xùn)練取平均損失來進(jìn)行梯度計(jì)算,批量訓(xùn)練大小可以一次上擴(kuò)到整個(gè)數(shù)據(jù)集。這里將顯示如何擴(kuò)展前面的回歸算法的例子——使用隨機(jī)訓(xùn)練和批量訓(xùn)練。導(dǎo)入numpy、matplotlib和tensorflow模塊,開始一個(gè)計(jì)算圖會(huì)話,代碼如下:2.7.2動(dòng)手做1.開始聲明批量大小。批量大小是指通過計(jì)算圖一次傳入多少訓(xùn)練數(shù)據(jù):2.接下來,聲明模型的數(shù)據(jù)、占位符和變量。這里能做的是改變占位符的形狀,占位符有兩個(gè)維度:第一個(gè)維度為None,第二個(gè)維度是批量訓(xùn)練中的數(shù)據(jù)量。我們能顯式地設(shè)置維度為20,也能設(shè)為None。如第1章所述,我們必須知道訓(xùn)練模型中的維度,這會(huì)阻止不合法的矩陣操作:3.現(xiàn)在在計(jì)算圖中增加矩陣乘法操作,切記矩陣乘法不滿足交換律,所以在matmul()函數(shù)中的矩陣參數(shù)順序要正確:4.改變損失函數(shù),因?yàn)榕坑?xùn)練時(shí)損失函數(shù)是每個(gè)數(shù)據(jù)點(diǎn)L2損失的平均值。在TensorFlow中通過reduce_mean()函數(shù)即可實(shí)現(xiàn),代碼如下:5.聲明優(yōu)化器以及初始化模型變量,代碼如下:6.在訓(xùn)練中通過循環(huán)迭代優(yōu)化模型算法。這部分代碼與之前不同,因?yàn)槲覀兿肜L制損失值圖與隨機(jī)訓(xùn)練對(duì)比,所以這里初始化一個(gè)列表每間隔5次迭代保存損失函數(shù):7.迭代100次輸出最終返回值。注意,A值現(xiàn)在是二維矩陣:2.7.3工作原理批量訓(xùn)練和隨機(jī)訓(xùn)練的不同之處在于它們的優(yōu)化器方法和收斂過程。找到一個(gè)合適的批量大小是挺難的。為了展現(xiàn)兩種訓(xùn)練方式收斂過程的不同,批量損失的繪圖代碼見下文。這里是存儲(chǔ)隨機(jī)損失的代碼,接著上一節(jié)的代碼:繪制回歸算法的隨機(jī)訓(xùn)練損失和批量訓(xùn)練損失(見圖2-6),代碼如下:圖2-6迭代100次的隨機(jī)訓(xùn)練損失和批量訓(xùn)練損失(批量大小為20)圖。注意,批量訓(xùn)練損失更平滑,隨機(jī)訓(xùn)練損失更不規(guī)則2.7.4延伸學(xué)習(xí)2.8TensorFlow實(shí)現(xiàn)創(chuàng)建分類器在本節(jié)中,將結(jié)合前面所有的知識(shí)點(diǎn)創(chuàng)建一個(gè)iris數(shù)據(jù)集的分類器。2.8.1開始iris數(shù)據(jù)集詳細(xì)細(xì)節(jié)見第1章。加載樣本數(shù)據(jù)集,實(shí)現(xiàn)一個(gè)簡單的二值分類器來預(yù)測(cè)一朵花是否為山鳶尾。iris數(shù)據(jù)集有三類花,但這里僅預(yù)測(cè)是否是山鳶尾。導(dǎo)入iris數(shù)據(jù)集和工具庫,相應(yīng)的對(duì)原數(shù)據(jù)集進(jìn)行轉(zhuǎn)換。2.8.2動(dòng)手做1.導(dǎo)入相應(yīng)的工具庫,初始化計(jì)算圖。注意,這里導(dǎo)入matplotlib模塊是為了后續(xù)繪制結(jié)果:2.導(dǎo)入iris數(shù)據(jù)集,根據(jù)目標(biāo)數(shù)據(jù)是否為山鳶尾將其轉(zhuǎn)換成1或者0。由于iris數(shù)據(jù)集將山鳶尾標(biāo)記為0,我們將其從0置為1,同時(shí)把其他物種標(biāo)記為0。本次訓(xùn)練只使用兩種特征:花瓣長度和花瓣寬度,這兩個(gè)特征在x-value的第三列和第四列:3.聲明批量訓(xùn)練大小、數(shù)據(jù)占位符和模型變量。注意,數(shù)據(jù)占位符的第一維度設(shè)為None:注意,通過指定dtype=tf.float32降低float的字節(jié)數(shù),可以提高算法的性能。4.定義線性模型。線性模型的表達(dá)式為:x2=x1*A+b。如果找到的數(shù)據(jù)點(diǎn)在直線以上,則將數(shù)據(jù)點(diǎn)代入x2-x1*A-b計(jì)算出的結(jié)果大于0;同理找到的數(shù)據(jù)點(diǎn)在直線以下,則將數(shù)據(jù)點(diǎn)代入x2-x1*A-b計(jì)算出的結(jié)果小于0。將公式x2-x1*A-b傳入sigmoid函數(shù),然后預(yù)測(cè)結(jié)果1或者0。TensorFlow有內(nèi)建的sigmoid損失函數(shù),所以這里僅僅需要定義模型輸出即可,代碼如下:5.增加TensorFlow的sigmoid交叉熵?fù)p失函數(shù)sigmoid_cross_entropy_with_logits(),代碼如下:6.聲明優(yōu)化器方法,最小化交叉熵?fù)p失。選擇學(xué)習(xí)率為0.05,代碼如下:7.創(chuàng)建一個(gè)變量初始化操作,然后讓TensorFlow執(zhí)行它,代碼如下:8.現(xiàn)在迭代100次訓(xùn)練線性模型。傳入三種數(shù)據(jù):花瓣長度、花瓣寬度和目標(biāo)變量。每200次迭代打印出變量值,代碼如下:9.下面的命令抽取模型變量并繪圖,結(jié)果圖在下一小節(jié)展示,代碼如下:2.8.3工作原理我們的目的是利用花瓣長度和花瓣寬度的特征在山鳶尾與其他物種間擬合一條直線。繪制所有的數(shù)據(jù)點(diǎn)和擬合結(jié)果,將會(huì)看到圖2-7。圖2-7山鳶尾和非山鳶尾。實(shí)心直線是迭代1000次得到的線性分隔2.8.4延伸學(xué)習(xí)當(dāng)前用一條直線分割兩類目標(biāo)并不是最好的模型。第4章將會(huì)介紹一種更好的方法來分割兩類目標(biāo)。2.8.5參考關(guān)于iris數(shù)據(jù)集的介紹,可以看維基百科:\h/wiki/Iris_flower_data_set?;蛘逽cikitLearn的iris數(shù)據(jù)集:\h/stable/auto_examples/datasets/plot_iris_dataset.html。2.9TensorFlow實(shí)現(xiàn)模型評(píng)估學(xué)完如何使用TensorFlow訓(xùn)練回歸算法和分類算法,我們需要評(píng)估模型預(yù)測(cè)值來評(píng)估訓(xùn)練的好壞。2.9.1開始模型評(píng)估是非常重要的,每個(gè)模型都有很多模型評(píng)估方式。使用TensorFlow時(shí),需要把模型評(píng)估加入到計(jì)算圖中,然后在模型訓(xùn)練完后調(diào)用模型評(píng)估。在訓(xùn)練模型過程中,模型評(píng)估能洞察模型算法,給出提示信息來調(diào)試、提高或者改變整個(gè)模型。但是在模型訓(xùn)練中并不是總需要模型評(píng)估,我們將展示如何在回歸算法和分類算法中使用它。訓(xùn)練模型之后,需要定量評(píng)估模型的性能如何。在理想情況下,評(píng)估模型需要一個(gè)訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,有時(shí)甚至需要一個(gè)驗(yàn)證數(shù)據(jù)集。想評(píng)估一個(gè)模型時(shí)就得使用大批量數(shù)據(jù)點(diǎn)。如果完成批量訓(xùn)練,我們可以重用模型來預(yù)測(cè)批量數(shù)據(jù)點(diǎn)。但是如果要完成隨機(jī)訓(xùn)練,就不得不創(chuàng)建單獨(dú)的評(píng)估器來處理批量數(shù)據(jù)點(diǎn)。如果在損失函數(shù)中使用的模型輸出結(jié)果經(jīng)過轉(zhuǎn)換操作,例如,sigmoid_cross_entropy_with_logits()函數(shù),為了精確計(jì)算預(yù)測(cè)結(jié)果,別忘了在模型評(píng)估中也要進(jìn)行轉(zhuǎn)換操作。另外一個(gè)重要方面是在評(píng)估前注意是回歸模型還是分類模型?;貧w算法模型用來預(yù)測(cè)連續(xù)數(shù)值型,其目標(biāo)不是分類值而是數(shù)字。為了評(píng)估這些回歸預(yù)測(cè)值是否與實(shí)際目標(biāo)相符,我們需要度量兩者間的距離。這里將重寫本章上一小節(jié)的回歸算法的例子,打印訓(xùn)練過程中的損失,最終評(píng)估模型損失。分類算法模型基于數(shù)值型輸入預(yù)測(cè)分類值,實(shí)際目標(biāo)是1和0的序列。我們需要度量預(yù)測(cè)值與真實(shí)值之間的距離。分類算法模型的損失函數(shù)一般不容易解釋模型好壞,所以通常情況是看下準(zhǔn)確預(yù)測(cè)分類的結(jié)果的百分比。這次將使用本章上一小節(jié)的分類算法的例子。2.9.2動(dòng)手做首先,將展示如何評(píng)估簡單的回歸算法模型,其擬合常數(shù)乘法,目標(biāo)值是10,步驟如下:1.加載所需的編程庫,創(chuàng)建計(jì)算圖、數(shù)據(jù)集、變量和占位符。創(chuàng)建完數(shù)據(jù)后,將它們隨機(jī)分割成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。不管算法模型預(yù)測(cè)的如何,我們都需要測(cè)試算法模型,這點(diǎn)相當(dāng)重要。在訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)上都進(jìn)行模型評(píng)估,以搞清楚模型是否過擬合:2.聲明算法模型、損失函數(shù)和優(yōu)化器算法。初始化模型變量A,代碼如下:3.像以往一樣迭代訓(xùn)練模型,代碼如下:4.現(xiàn)在,為了評(píng)估訓(xùn)練模型,將打印訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集訓(xùn)練的MSE損失函數(shù)值,代碼如下:對(duì)于分類模型的例子,與前面的例子類似。創(chuàng)建準(zhǔn)確率函數(shù)(accuracyfunction),分別調(diào)用sigmoid來測(cè)試分類是否正確。5.重新加載計(jì)算圖,創(chuàng)建數(shù)據(jù)集、變量和占位符。記住,分割數(shù)據(jù)集和目標(biāo)成為訓(xùn)練集和測(cè)試集,代碼如下:6.在計(jì)算圖中,增加模型和損失函數(shù),初始化變量,并創(chuàng)建優(yōu)化器,代碼如下:7.現(xiàn)在進(jìn)行迭代訓(xùn)練,代碼如下:8.為了評(píng)估訓(xùn)練模型,我們創(chuàng)建預(yù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論