




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
TensorFlowKeras深度學習人工智能實踐應用目錄\h第1章人工智能、機器學習與深度學習簡介\h1.1人工智能、機器學習、深度學習的關系\h1.2機器學習介紹\h1.3機器學習分類\h1.4深度學習簡介\h1.5結論\h第2章深度學習的原理\h2.1神經傳導的原理\h2.2以矩陣運算仿真神經網絡\h2.3多層感知器模型\h2.4使用反向傳播算法進行訓練\h2.5結論\h第3章TensorFlow與Keras介紹\h3.1TensorFlow架構圖\h3.2TensorFlow簡介\h3.3TensorFlow程序設計模式\h3.4Keras介紹\h3.5Keras程序設計模式\h3.6Keras與TensorFlow比較\h3.7結論\h第4章在Windows中安裝TensorFlow與Keras\h4.1安裝Anaconda\h4.2啟動命令提示符\h4.3建立TensorFlow的Anaconda虛擬環境\h4.4在Anaconda虛擬環境安裝TensorFlow與Keras\h4.5啟動JupyterNotebook\h4.6結論\h第5章在LinuxUbuntu中安裝TensorFlow與Keras\h5.1安裝Anaconda\h5.3啟動JupyterNotebook\h5.4結論\h第6章KerasMNIST手寫數字識別數據集\h6.1下載MNIST數據\h6.2查看訓練數據\h6.3查看多項訓練數據images與label\h6.4多層感知器模型數據預處理\h6.5features數據預處理\h6.6label數據預處理\h6.7結論\h第7章Keras多層感知器識別手寫數字\h7.1Keras多元感知器識別MNIST手寫數字圖像的介紹\h7.2進行數據預處理\h7.3建立模型\h7.4進行訓練\h7.5以測試數據評估模型準確率\h7.6進行預測\h7.7顯示混淆矩陣\h7.8隱藏層增加為1000個神經元\h7.9多層感知器加入DropOut功能以避免過度擬合\h7.10建立多層感知器模型包含兩個隱藏層\h7.11結論\h第8章Keras卷積神經網絡識別手寫數字\h8.1卷積神經網絡簡介\h8.2進行數據預處理\h8.3建立模型\h8.4進行訓練\h8.5評估模型準確率\h8.6進行預測\h8.7顯示混淆矩陣\h8.8結論\h第9章KerasCIFAR-10圖像識別數據集\h9.1下載CIFAR-10數據\h9.2查看訓練數據\h9.3查看多項images與label\h9.4將images進行預處理\h9.5對label進行數據預處理\h9.6結論\h第10章Keras卷積神經網絡識別CIFAR-10圖像\h10.1卷積神經網絡簡介\h10.2數據預處理\h10.3建立模型\h10.4進行訓練\h10.5評估模型準確率\h10.6進行預測\h10.7查看預測概率\h10.8顯示混淆矩陣\h10.9建立3次的卷積運算神經網絡\h10.10模型的保存與加載\h10.11結論\h第11章Keras泰坦尼克號上的旅客數據集\h11.1下載泰坦尼克號旅客數據集\h11.2使用PandasDataFrame讀取數據并進行預處理\h11.3使用PandasDataFrame進行數據預處理\h11.4將DataFrame轉換為Array\h11.5將ndarray特征字段進行標準化\h11.6將數據分為訓練數據與測試數據\h11.7結論\h第12章Keras多層感知器預測泰坦尼克號上旅客的生存概率\h12.1數據預處理\h12.2建立模型\h12.3開始訓練\h12.4評估模型準確率\h12.5加入《泰坦尼克號》電影中Jack與Rose的數據\h12.6進行預測\h12.7找出泰坦尼克號背后的感人故事\h12.8結論\h第13章IMDb網絡電影數據集與自然語言處理\h13.1Keras自然語言處理介紹\h13.2下載IMDb數據集\h13.3讀取IMDb數據\h13.4查看IMDb數據\h13.5建立token\h13.6使用token將“影評文字”轉換成“數字列表”\h13.7讓轉換后的數字長度相同\h13.8結論\h第14章Keras建立MLP、RNN、LSTM模型進行IMDb情感分析\h14.1建立多層感知器模型進行IMDb情感分析\h14.2數據預處理\h14.3加入嵌入層\h14.4建立多層感知器模型\h14.5訓練模型\h14.6評估模型準確率\h14.7進行預測\h14.8查看測試數據預測結果\h14.9查看《美女與野獸》的影評\h14.10預測《美女與野獸》的影評是正面或負面的\h14.11文字處理時使用較大的字典提取更多文字\h14.12RNN模型介紹\h14.13使用KerasRNN模型進行IMDb情感分析\h14.14LSTM模型介紹\h14.15使用KerasLSTM模型進行IMDb情感分析\h14.16結論\h第15章TensorFlow程序設計模式\h15.1建立“計算圖”\h15.2執行“計算圖”\h15.3TensorFlowplaceholder\h15.4TensorFlow數值運算方法介紹\h15.5TensorBoard\h15.6建立一維與二維張量\h15.7矩陣基本運算\h15.8結論\h第16章以TensorFlow張量運算仿真神經網絡的運行\h16.1以矩陣運算仿真神經網絡\h16.2以placeholder傳入\hX\h值\h16.3創建layer函數以矩陣運算仿真神經網絡\h16.4建立layer_debug函數顯示權重與偏差\h16.5結論\h第17章TensorFlowMNIST手寫數字識別數據集\h17.1下載MNIST數據\h17.2查看訓練數據\h17.3查看多項訓練數據images與labels\h17.4批次讀取MNIST數據\h17.5結論\h第18章TensorFlow多層感知器識別手寫數字\h18.1TensorFlow建立多層感知器辨識手寫數字的介紹\h18.2數據準備\h18.3建立模型\h18.4定義訓練方式\h18.5定義評估模型準確率的方式\h18.6進行訓練\h18.7評估模型準確率\h18.8進行預測\h18.9隱藏層加入更多神經元\h18.10建立包含兩個隱藏層的多層感知器模型\h18.11結論\h第19章TensorFlow卷積神經網絡識別手寫數字\h19.1卷積神經網絡簡介\h19.2進行數據預處理\h19.3建立共享函數\h19.4建立模型\h19.5定義訓練方式\h19.6定義評估模型準確率的方式\h19.7進行訓練\h19.8評估模型準確率\h19.9進行預測\h19.10TensorBoard\h19.11結論\h第20章TensorFlowGPU版本的安裝\h20.1確認顯卡是否支持CUDA\h20.2安裝CUDA\h20.3安裝cuDNN\h20.4將cudnn64_5.dll存放的位置加入Path環境變量\h20.5在Anaconda建立TensorFlowGPU虛擬環境\h20.6安裝TensorFlowGPU版本\h20.7安裝Keras\h20.8結論\h第21章使用GPU加快TensorFlow與Keras訓練\h21.1啟動TensorFlowGPU環境\h21.2測試GPU與CPU執行性能\h21.3超出顯卡內存的限制\h21.4以多層感知器的實際范例比較CPU與GPU的執行速度\h21.5以CNN的實際范例比較CPU與GPU的執行速度\h21.6以KerasCifarCNN的實際范例比較CPU與GPU的執行速度\h21.7結論\h附錄A本文范例程序的下載與安裝說明\hA.1在Windows系統中下載與安裝范例程序\hA.2在UbuntuLinux系統中下載與安裝范例程序第1章人工智能、機器學習與深度學習簡介近年來,人工智能(ArtificialIntelligence,AI)吸引了大眾與媒體的目光,AlphaGo的成功讓人工智能技術變得更加炙手可熱,其實AI早已進入你我的生活中,例如我們手機中的語音助理、人臉識別、影音平臺的每日推薦等。然而,人工智能的發展才剛剛起步,未來人工智能的應用將會深入生活中的每一個層面,也就是說未來一定是AI的時代。1.1人工智能、機器學習、深度學習的關系人工智能、機器學習、深度學習的關系整理如圖1-1所示。圖1-1?人工智能“人工智能”一詞最早是在20世紀50年代提出的。人工智能的目標是讓計算機像人一樣思考與學習。被視為人工智能之父的圖靈(AlanMathisonTuring)提出了著名的“圖靈測試”(TuringTesting):人類與機器通過電傳設備對話,如果人類無法根據這個對話過程判斷對方是機器或人,通過圖靈測試就可以認定這臺機器具有人工智能。20世紀80年代,約翰?塞爾(JohnSearle)提出了對“人工智能”的分類方式。強人工智能(StrongAI):機器具有與人類一樣完整的認知能力。弱人工智能(WeakAI):機器不需要具有與人類一樣完整的認知能力,只要設計得看起來像具有智慧即可。?機器學習機器學習(MachineLearning)是人工智能的分支。機器學習是通過算法,使用大量數據進行訓練,訓練完成后會產生模型。將來有新的數據時,我們可以使用訓練產生的模型進行預測。機器學習可分為有監督的學習(SupervisedLearning)、無監督的學習(UnsupervisedLearning)和增強式學習(ReinforcementLearning)。機器應用相當廣泛,例如推薦引擎、定向廣告、需求預測、垃圾郵件過濾、醫學診斷、自然語言處理、搜索引擎、詐騙偵測、證券分析、視覺識別、語音識別、手寫識別,等等。?深度學習深度學習(DeepLearning)也是機器學習的分支。深度學習是人工智能中成長最快的領域,深度學習仿真人類神經網絡的工作方式,常見的深度學習架構有多層感知器(Multi-LayerPerceptron)、深度神經網絡(DeepNeuralNetwork,DNN)、卷積神經網絡(ConvolutionalNeuralNetwork,CNN)、遞歸神經網絡(RecurrentNeuralNetwork,RNN)。深度學習已經應用于視覺識別、語音識別、自然語言處理、生物醫學等領域,并且取得了非常好的效果。?為何近年來人工智能發展加速早在20世紀60年代及70年代,科學家就提出了各種機器學習的算法,然而受限于當時計算機的計算能力以及大量數據的獲取也不容易,因而機器學習一直都沒有很成功。大數據(BigData)分布式存儲與運算隨著全球設備、機器和系統的相互連接,從而產生了大量數據,再加上分布式存儲(例如Hadoop、NoSQL等)的發展,也提供了大量數據,而且大量服務器的并行計算功能(例如Spark等)提供了巨大的運算能力。大量數據與運算能力就像燃料,推動了機器學習與深度學習的加速發展。GPU、TPU并行計算GPU(GraphicsProcessingUnit,圖形處理器)原本用來處理畫面像素的運算,例如電腦游戲界面所需要的大量圖形運算。CPU與GPU架構上有著根本的不同:CPU含有數顆核心,為順序處理進行優化,而GPU可以有高達數千個小型而且高效率的核心,可以發揮并行計算的強大功能,如圖1-2所示。圖1-2深度學習以大量矩陣運算模擬神經元的工作方式,矩陣運算的特性是,單一運算都很簡單,但是需要大量運算,特別適合采用并行計算。GPU通過大量核心進行并行計算,可讓通過GPU進行深度學習訓練比通過CPU進行深度學習訓練快10~75倍,讓訓練的時間從數周縮短為數天。而Google公司更在2016年宣布,研發人工智能專用芯片TPU(TensorProcessingUnit,張量處理單元或張量處理芯片)來進行并行計算。TPU是專為深度學習特定用途設計的特殊規格的邏輯芯片(IC),使得深度學習的訓練速度更快。1.2機器學習介紹機器學習的訓練數據是由features、label組成的。features:數據的特征,例如濕度、風向、風速、季節、氣壓。label:數據的標簽,也就是我們希望預測的目標,例如降雨(0:不會下雨、1:會下雨)、天氣(1:晴天、2:雨天、3:陰天、4:下雪)、氣溫。如圖1-3所示,機器學習可分為兩個階段:訓練(Training)訓練數據是過去累積的歷史數據,可能是文本文件、數據庫或其他來源的數據,經過FeatureExtraction(特征提取)產生features(數據特征)與label(真實的標簽數據),然后經過機器學習算法訓練后產生模型。預測(Predict)新輸入數據,經過FeatureExtraction(特征提取)產生features(數據特征),使用訓練完成的模型進行預測,最后產生預測結果。圖1-31.3機器學習分類前面介紹過,機器學習可分為有監督的學習、無監督的學習和增強式學習。以下詳細介紹其分類。?有監督的學習有監督的學習的數據具備特征(features)與預測目標(label),通過算法訓練并建立模型。當有新的數據時,我們就可以使用模型進行預測。有下列分類:二元分類已知濕度、風向、風速、季節、氣壓等數據特征,希望預測當天是否會下雨(0:不會下雨、1:會下雨)。希望預測的目標label有兩個選項,就好像在做是非題。多元分類已知濕度、風向、風速、季節、氣壓等數據特征,希望預測當天天氣(1:晴天、2:雨天、3:陰天、4:下雪)。希望預測的目標label有多個選項,就好像在做選擇題。回歸分析已知濕度、風向、風速、季節、氣壓等數據特征,希望預測當天氣溫。希望預測的目標label是連續的值,就好像在做計算題。?無監督的學習對于無監督的學習,從現有數據我們不知道要預測的答案,所以沒有label(預測目標)。例如,cluster集群算法將數據分成幾個差異性最大的群組,而群組內的則相似程度最高。?增強式學習增強式學習的原理:借助定義動作(Actions)、狀態(States)、獎勵(Rewards)的方式不斷訓練機器循序漸進,學會執行某項任務的算法。例如,訓練機器玩《超級瑪麗》電子游戲,動作:左/右/跳,狀態:當前游戲的界面,獎勵:得分/受傷,借助不斷地訓練學會玩游戲。常見的算法有Q-Learning、TD(TemporalDifference)、Sarsa。?機器學習分類整理機器學習分類整理見表1-1。表1-1機器學習分類整理(續表)?機器學習分類機器學習分類如圖1-4所示。圖1-4本文主要介紹深度學習,如果你對機器學習與大數據有興趣,可以參考筆者的另一本文《Python+Spark2.0+Hadoop機器學習與大數據實戰》。1.4深度學習簡介人腦的重量大約為一千多克,結構非常復雜,預估具有860億個神經元以及超過100兆條神經相連,形成的網絡比最先進的超級計算機還要強大。因為人類神經網絡太過復雜,為了方便用計算機來仿真神經網絡,人們將神經元分為多個層次。通常會有一個輸入層、一個輸出層,隱藏層可以有非常多層(見圖1-5),所以稱為深度學習。圖1-5?機器學習與深度學習的關系如圖1-6所示,深度學習的應用很廣泛,你可以將深度學習技術應用在有監督的學習、無監督的學習和增強式學習等領域。圖1-61.5結論本章我們介紹了人工智能、機器學習、深度學習的關系以及它們的基本概念,并且簡明介紹了機器學習的分類,下一章將詳細介紹深度學習的原理。第2章深度學習的原理本章將介紹深度學習與類神經網絡的原理,并介紹如何以矩陣的數學公式來仿真類神經網絡的運行。2.1神經傳導的原理1.神經元的信息傳導神經傳導的工作原理很復雜,在此我們只是簡略介紹其概念,如圖2-1所示。圖2-1軸突傳送信息:神經元長出一個細長條的軸突,以電流方式將信息傳遞給另一個神經元。軸突最長可達一米,最短只有幾十分之一毫米。樹突接收信息:樹突主要的功能是接收其他神經元傳來的電化學信息,再傳遞給本身的細胞。突觸是輸入與輸出的神經元傳遞的機制:輸入與輸出的神經元之間發展出的特殊結構稱為突觸,神經元通過釋放化學物質來傳遞信息,當電壓達到臨界值時,就會通過軸突傳送電脈沖動作電位至接收神經元。2.以數學公式仿真神經元的信息傳導為了將神經元的傳導用計算機來仿真,我們必須將神經元的傳導以數學公式來表示。以圖2-2來說明如何以數學公式模擬神經元的信息傳導。圖2-2圖2-2(續)圖2-2可以整理為以下公式:y=activationfunction(x1×w1+x2×w2+x3×w3+b1)詳細說明如表2-1所示。表2-1以數學公式模擬神經元的信息傳導參數說明3.激活函數通常為非線性函數以上激活函數可以仿真神經傳導的工作方式將上一層神經元信號傳遞到下一層。激活函數通常為非線性函數,加入激活函數能讓神經網絡處理比較復雜的非線性問題。表2-2所示為線性函數與非線性函數的圖像。表2-2線性函數與非線性函數的圖像Keras與TensorFlow支持很多激活函數,不過在此我們介紹最常用的兩種:Sigmoid與ReLU。4.Sigmoid激活函數常用的激活函數Sigmoid公式如下:Sigmoid激活函數的圖像如圖2-3所示。圖2-3Sigmoid激活函數其實與人類感覺神經對信號的接收類似,例如,當接收神經元所接收刺激的總和:小于臨界值時,會忽略此刺激當x<-5時,輸出y接近0。大于臨界值時,開始接收神經刺激當x范圍在-5與5之間時,隨著x數值加大,y的數值也加大。達到一定程度時,感覺會開始鈍化即使受到更大的刺激,感覺仍維持不變,即當x>5時,y的數值趨近于1。5.ReLU激活函數另一個很常見的激活函數ReLU的圖像如圖2-4所示。當接收神經元所接收刺激的總和:小于臨界值時,會忽略此刺激輸入x小于0,y值是0。大于臨界值時,開始接收神經刺激輸入x大于0,y等于x。圖2-42.2以矩陣運算仿真神經網絡前面只是以數學運算模擬單個接收神經元,本節將介紹以矩陣模擬兩個接收神經元。1.以矩陣運算仿真神經網絡的信息傳導多個接收神經元的神經網絡如圖2-5所示。圖2-5?以數學公式模擬輸出與接收神經元的工作方式:y1=activationfunction(x1×w11+x2×w21+x3×w31+b1)y2=activationfunction(x1×w12+x2×w22+x3×w32+b2)?以上兩個數學公式可以整合成一個矩陣運算公式:?另一種形式的矩陣公式表示如下:y=activation(x×w+b)?矩陣公式以中文表示如下:輸出=激活函數(輸入×權重+偏差)說明見表2-3。表2-3以數學公式模擬輸出與接收神經元的工作方式參數說明2.3多層感知器模型在20世紀80年代,多層感知器(MultilayerPerceptron,MLP)模型是一種受歡迎的機器學習解決方案,尤其是在語音識別、圖像識別和機器翻譯等多個領域。到20世紀90年代,MLP遇到來自更簡單的模型(例如,支持向量機(SupportVectorMachine,SVM))的強烈競爭。近年來,由于深度學習的成功,多層感知器又重新受到業界的重視。1.以多層感知器模型識別MNIST手寫數字圖像我們將以多層感知器模型識別MNIST手寫數字圖像說明多層感知器模型的工作方式,如圖2-6所示。圖2-62.以矩陣公式仿真多層感知器模型的工作方式(見圖2-7)圖2-7?建立輸入層與隱藏層的公式:h1=ReLU(x×w1+b1)詳細說明如表2-4所示。表2-4輸入層與隱藏層的公式參數說明(續表)?建立隱藏層與輸出層公式:y=softmax(h1×w2+b2)詳細說明如表2-5所示。表2-5隱藏層與輸出層的公式參數說明2.4使用反向傳播算法進行訓練當我們建立深度學習模型后,就必須進行訓練。反向傳播法(BackPropagation)是訓練人工神經網絡的常見方法,并且與優化器(Optimizer,例如梯度下降法)結合使用。反向傳播是一種有監督的學習方法,必須輸入features(特征值)與label(真實的值)。簡單來說,反向傳播算法就是“從錯誤中學習”。多層感知器模型識別MNIST手寫數字圖像,過程整理如圖2-8所示。1.訓練前必須先進行“數據預處理”與“建立模型”(1)數據預處理:MNIST數據集經過數據預處理產生features(數字圖像的特征值)、label(數字圖像真實的值),用于后續訓練使用。(2)建立模型:建立多層感知模型,并且以隨機數初始化模型的權重(Weight)與偏差(Bias):w1、b1,w2、b2。圖2-82.反向傳播算法訓練多層感知器模型(見圖2-9)圖2-9圖2-9說明如下:進行訓練時,數據分為多個批次,例如每一批次200項數據,然后每次讀取一批次數據進行反向傳播算法訓練。重復以下傳播和權重更新(weightupdate),直到誤差(loss)收斂。?傳播(1)模型輸入特征值:features(數字圖像的特征值),輸入到神經網絡進行計算。(2)模型輸出計算結果:經過多個隱藏層網絡進行計算,逐層向前傳播,最后到達輸出層,產生神經網絡的輸出。?權重更新(1)損失函數計算誤差:使用損失函數計算模型輸出(預測的結果)與label(數字圖像真實的值)之間的誤差值。(2)優化器更新權重與偏差:按照誤差值更新神經元連接的權重與偏差,盡量使損失函數的誤差值最小化。3.損失函數簡單地說,反向傳播算法就是“從錯誤中學習”,而損失函數就是幫我們計算誤差。CrossEntropy是深度學習常用的損失函數,說明如圖2-10所示。圖2-10以上損失函數計算模型輸出(預測的結果)與label(數字圖像真實的值)之間的誤差值,都是以One-HotEncoding(一位有效編碼)表示,例如預測數字7。label(數字圖像真實的值):由0算起第7個數字是1,其他都是0。模型輸出(預測的結果):預測結果0的概率是0.1(10%),預測結果1的概率是0.3(30%),等等。預測結果7的概率是0.9,代表預測結果數字7有90%的概率,其他的概率都不高。4.優化器優化器就是使用某種數值方法在不斷的批次訓練中不斷更新權重與偏差,使損失函數的誤差值最小化,并最終找出誤差值最小的“權重與偏差的組合”。在深度學習中,通常使用隨機梯度下降法(StochasticGradientDescent,SGD)來對“權重與偏差的組合”進行優化。隨機梯度下降法可以想象成在所有“權重與偏差的組合”組成的高維度空間中,每個訓練批次沿著每個維度下降的方向走一小步,經過許多次步驟,就可以找到優化的“權重與偏差的組合”。?二維權重與損失函數真實的深度學習中權重與偏差數量很多,會形成非常多維的空間。為了方便說明,我們假設最簡單的情況,即只有兩個權重weight1(w1)與weight2(w2)。因為只有兩個權重,所以可以把w1與w2畫成如圖2-11所示的二維圖形。圖2-11圖2-11說明如下:x軸是weight1(w1)。y軸是weight2(w2)。損失函數輸入兩個參數:w1與w2。按照Loss(w1,w2)的數值可以畫出由多個橢圓形所組成的等高線,顏色越深,代表Loss數值越小。?SGD梯度下降法SGD梯度下降法就是每次沿著Loss下降的方向每個訓練批次走一小步,經過許多次訓練步驟就能夠下降到Loss=0.1,損失函數的誤差最小化,如圖2-12所示。圖2-12梯度下降法,用比較通俗的說法就是:一個在山上的人正在尋找山谷最低點(試圖找到損失函數Loss的極小值)。因為大霧能見度低,看不見下山的道路,所以他必須利用局部信息來找到極小值。他使用梯度下降法,觀察當前位置處的陡峭程度(梯度),然后沿著(下降梯度)最大的方向前進。使用此方法不斷前進,最終找到山谷最低點。另外,還有許多隨機梯度下降法的變形,如RMSprop、Adagrad、Adadelta、Adam等,適用于不同的深度學習模型。不同的優化器具有不同的訓練效果,你可以參考這個網頁的說明:/2015/03/alec-radfords-animations-for.html此網頁上的圖以動態方式顯示出不同的優化器,以不同的路徑找到Loss的最小值。2.5結論本章我們介紹了深度學習類神經網絡原理,并介紹了如何以矩陣數學公式來仿真類神經網絡的運行。接下來將介紹TensorFlow與Keras,可以讓我們構建各種深度的學習模型。如果讀者有些地方還看不懂,沒有關系,只需要有基本概念,后續章節配合程序看就會清楚了。第3章TensorFlow與Keras介紹本章將介紹TensorFlow與Keras的概念和程序設計模式。TensorFlow功能強大,執行效率高,支持各種平臺,然而屬于低級的深度學習鏈接庫,學習門檻高。所以本文先介紹Keras,它是高級的深度學習鏈接庫,對初學者學習門檻低,可以很容易地建立深度學習模型,并且進行訓練、預測。等讀者熟悉深度學習模型概念之后,再來學習TensorFlow就比較輕松了。在第2章中,我們學習了深度學習的核心概念,是以張量(矩陣)運算模擬神經網絡的。因此TensorFlow的主要設計就是讓矩陣運算達到最高性能,并且能夠在各種不同的平臺執行。TensorFlow最初由Google(谷歌)公司的BrainTeam團隊開發,Google公司使用TensorFlow進行研究及自身產品開發,并于2015年11月公開了源代碼,在Apache2.0與開放源代碼規范下,所有的開發者都可以免費使用。Google的很多產品早就使用了機器學習或深度學習,例如Gmail過濾垃圾郵件、Google語音識別、Google圖像識別、Google翻譯等。TensorFlow功能強大又好用,Google為什么要開放源代碼呢?Google認為機器學習是創新技術,而且是未來技術的關鍵,這方面的研究是全球性而且增長快速的,但是缺乏共同的標準。Google希望通過開源社區的分享建立一個龐大的社區,并且建立共同的標準,這樣可以擴展各種深度學習的應用領域,讓TensorFlow更加完善。3.1TensorFlow架構圖TensorFlow架構圖說明如圖3-1所示。圖3-1參照以上的架構圖,我們自下而上進行說明。?處理器:TensorFlow可以在CPU、GPU、TPU中執行CPU:每一臺計算機都有中央處理器(CPU),可以執行TensorFlow。GPU:圖形處理器,GPU含有高達數千個微小且高效率的計算內核,可以發揮并行計算的強大功能。TPU:TPU(TensorProcessingUnit)是Google為人工智能(AI)研發的專用芯片,比GPU的計算性能更佳,不過目前只部署在Google數據中心,也許未來會對外銷售。?平臺:TensorFlow具備跨平臺能力,可以在目前主流的平臺執行TensorFlow可以在不需修改程序代碼的前提下,讓深度學習模型在不同的平臺上執行訓練,以提升效率。Windows:個人計算機最常用的操作系統,讓初學者也可以使用。Linux:TensorFlow可以在各種版本的Linux操作系統中執行。Android:在Android上運行TensorFlow可以讓深度學習進入移動端,Android設備已達到十幾億臺,設備的執行性能也日益提升,越來越適合運行TensorFlow。iOS:TensorFlow可以在iOS移動設備或MacOS中執行。RaspberryPi:樹莓派可以用于開發物聯網或機器人,提供人工智能功能。云端執行:可以通過云端大量的服務器加速深度學習模型的訓練。?TensorFlowDistributedExecutionEngine(分布式執行引擎)在深度學習中,最花時間的就是模型的訓練,尤其大型的深度學習模型必須使用大量數據進行訓練,需要數天乃至數周之久,TensorFlow具備分布式計算能力,可同時在數百臺機器上執行訓練模型,大幅縮短模型訓練的時間。?前端程序語言TensorFlow可以使用多種前端程序語言,例如Python、C++等,但對Python的支持是最好的,Python具有程序代碼簡明、易學習、高生產力的特質,面向對象、函數式的動態語言,應用非常廣泛。?高級APITensorFlow是比較低級的深度學習API,所以用程序設計模型時必須自行設計:張量乘積、卷積等底層操作,好處是我們可以自行設計各種深度學習模型,但是缺點是開發時需要編寫更多程序代碼,并且需要花更多時間。所以網上的開發社區以TensorFlow為底層開發很多高級的深度學習API,例如Keras、TF-Learn、TF-Slim、TF-Layer等。這樣讓開發者使用更簡潔、更可讀性的程序代碼就可以構建出各種復雜的深度學習模型。本文主要介紹Keras,因為Keras的功能最完整。3.2TensorFlow簡介TensorFlow是由Tensor與Flow所組成的,說明如下:?Tensor(張量)在數學里,張量是一種幾何實體或廣義上的“數量”,在此“數量”包含“標量、向量或矩陣”。零維的張量為標量,一維的張量是向量,二維以上的張量是矩陣,如圖3-2所示。圖3-2?Flow(數據流)想象當你到了一個陌生國度,你不會當地的語言,為了到達目的地,最好的方式是畫一張地圖,告訴司機你要去的目的地,司機則會按照你提供的地圖載你前往。TensorFlow也是相同的概念,為了讓TensorFlow可以支持不同的程序設計語言接口,并且讓TensorFlow程序可以在各種平臺執行,所有的TensorFlow程序都是先建立“計算圖”(computationalgraph),這是張量運算和數據處理的流程。我們可以使用TensorFlow提供的模塊以不同的程序設計語言建立“計算圖”。TensorFlow提供的模塊非常強大,我們可以設計張量運算流程,并且構建各種深度學習或機器學習模型。建立“計算圖”完成后,我們就可以在不同的平臺上執行“計算圖”。如圖3-3所示,這是典型的“計算圖”,功能很簡單,其算式為y=MatMul(x,w)+b(x、w、b都是張量,w與b先使用隨機數進行初始化,使用MatMul將x與w進行張量乘積,再加上b,最后結果是y)。圖3-3在上面的“計算圖”中:節點(Node)代表運算,而邊(Edge)代表張量的數據流。我們可以想象邊就是管線,張量(數據)在管線中流動,以上虛線代表數據流的方向。經過節點運算后,轉換為不同的張量(數據)。圖3-3是靜態的,不太容易看到數據流動的情況,可以訪問TensorFlow官方網站(https://www.TensorF/images/tensors_Flowing.gif),查看以動畫顯示的“計算圖”數據的流動。3.3TensorFlow程序設計模式如圖3-4所示,TensorFlow程序設計模式的核心是“計算圖”,可分為兩部分:建立“計算圖”與執行“計算圖”。圖3-4圖3-4說明如下:(1)建立“計算圖”我們可以使用TensorFlow提供的模塊建立“計算圖”。TensorFlow提供的模塊非常強大,我們可以設計張量運算流程,并且構建各種深度學習或機器學習模型。(2)執行“計算圖”建立“計算圖”后,我們就可以建立Session執行“計算圖”了。在TensorFlow中,Session(原意為會話)的作用是在客戶端和執行設備之間建立連接。有了這個連接,就可以將“計算圖”在各種不同設備中執行,后續任何與設備之間的數據傳輸都必須通過Session來進行,并且最后獲得執行后的結果。3.4Keras介紹Keras是一個開放源碼的高級深度學習程序庫,使用Python編寫,能夠運行在TensorFlow或Theano之上。其主要作者和維護者是Google公司的工程師Fran?oisChollet,以MIT開放源碼方式授權。?為何需要使用KerasKeras使用最少的程序代碼、花費最少的時間就可以建立深度學習模型,進行訓練、評估準確率,并進行預測。相對而言,使用TensorFlow這樣低級的鏈接庫雖然可以完全控制各種深度學習模型的細節,但是需要編寫更多的程序代碼,花費更多時間進行開發。?Keras的工作方式Keras是一個模型級(model-level)的深度學習鏈接庫,Keras只處理模型的建立、訓練、預測等功能。深度學習底層的運行,例如張量(矩陣)運算,Keras必須配合“后端引擎”(backendengine)進行運算。目前Keras提供了兩種后端引擎:Theano與TensorFlow。如圖3-5所示,Keras程序員只需要專注于建立模型,至于底層操作細節,例如張量(矩陣)運算,Keras會幫你轉化為Theano或TensorFlow相對指令。圖3-5本文介紹的Keras范例都是使用TensorFlow作為后端引擎的,因為是以TensorFlow作為底層,所以之前章節中所介紹的TensorFlow的好處(例如跨平臺與執行性能)就都具備了。?Keras深度學習鏈接庫特色簡單快速地建立原型prototyping:Keras具備友好的用戶界面、模塊化設計、可擴充性。已經內建各種類神經網絡層級,例如卷積層CNN、RNN,可以幫助我們快速建立神經網絡模型。通過后端引擎Theano與TensorFlow,可以在CPU與GPU上運行。以Keras開發的程序代碼更簡潔、可讀性更高、更容易維護、更具生產力。Keras的說明文件非常齊全,官方網站上提供的范例也非常淺顯易懂。3.5Keras程序設計模式英文成語“pieceofcake”的意思是“非常容易的事”,其實Keras的程序設計模式建立一個深度學習模型很簡單,就好像做一個多層蛋糕。首先,建立一個蛋糕架。然后,我們不需要自己做每一層蛋糕,可以選擇現成的蛋糕層,例如水果蛋糕層、巧克力蛋糕層等。我們可以指定每一層的“內容”,例如指定裝飾水果種類與數量。只需要將每一層蛋糕加入蛋糕架上即可。最后就可以做出一個好吃又美觀的多層蛋糕。如圖3-6所示,我們將建立多層感知器(MultilayerPerceptron)模型,輸入層(x)共有784個神經元,隱藏層(h)共有256個神經元,輸出層(y)共有10個神經元。建立這樣的模型很簡單,只需先建立一個蛋糕架,然后將神經網絡層一層一層加上去即可。圖3-6如圖3-7所示,我們可以很簡單地使用下列程序代碼將“輸入層”“隱藏層”與“輸出層”加入模型中。圖3-7可以看出,在Keras建立多層感知器很簡單。1.建立Sequential模型Sequential模型是多個神經網絡層的線性堆疊。我們可以想象Sequential模型是一個蛋糕架,接下來可以加入一層一層的蛋糕。2.加入“輸入層”與“隱藏層”到模型中Keras已經內建各種神經網絡層(例如Dense層、Conv2d層等),只要在之前建立的模型上加入我們選擇的神經網絡層就可以了(就好像在“蛋糕架”加入“蛋糕層”一樣簡單)。以下程序代碼加入“輸入層”與“隱藏層”到模型中,就好像加入兩層蛋糕。3.加入“輸出層”到模型以下程序代碼加入“輸出層”到模型中,就好像再加入一層蛋糕。以上基本就完成了多層感知器模型的建立,是不是很簡單呢?這里只介紹了Keras程序設計的概念,詳細程序代碼的解說在后面章節會陸續介紹。3.6Keras與TensorFlow比較Keras與TensorFlow比較見表3-1。表3-1Keras與TensorFlow比較?輕松學會“深度學習”:先學Keras再學TensorFlow初學者學習TensorFlow,就好像沒有任何攝影經驗的人一開始就使用單反相機且使用M(手動)模式,必須學習一大堆有關光圈、快門等的知識,研究了老半天,還是沒辦法拍出一張像樣的照片,會有很大的挫感。初學者學習Keras,就好像單反相機的初學者先以Auto自動模式來學習界面的構圖等,這樣就可以很容易地拍出一張張照片,再慢慢地使用P模式、A模式、S模式等,學習步驟自行設定,最后就可以使用M模式,完全掌控了。本文希望能讓初學者很輕松地學會“深度學習”,所以會先介紹Keras再介紹TensorFlow。因為大部分讀者沒有接觸過深度學習模型,如果一開始就學習TensorFlow,就要面對TensorFlow特殊的程序設計模式,并且還必須自行設計張量(矩陣)的運算,會有很大的挫折感。而先學習Keras可以讓讀者很容易地建立深度學習模型,并且訓練模型,使用模型進行預測。等讀者對深度學習模型有了一定認識后,再來學習TensorFlow就不會感覺那么困難了。3.7結論本章我們介紹了TensorFlow與Keras的功能,并分別介紹了它們的程序設計模式。后續章節將介紹TensorFlow與Keras的安裝,讀者可以自行決定要使用Windows或Linux操作系統,我們將在第4章介紹Windows安裝,在第5章介紹LinuxUbuntu安裝。第4章在Windows中安裝TensorFlow與Keras本章將介紹在Windows系統中安裝TensorFlow與Keras,并且啟動JupyterNotebook查看TensorFlow與Keras的版本。新版本的TensorFlow可以在Windows系統中安裝,為用戶帶來很大的方便,畢竟大部分用戶使用的都是Windows操作系統。在TensorFlow官方網站介紹了很多安裝TensorFlow的方式,網址如下:https://www.tensorF/versions/r0.10/get_started/os_setup本文只介紹最簡單的安裝方式,就是以Anaconda安裝。安裝TensorFlow必須安裝Python。而安裝Python最方便的方式就是使用軟件包來安裝。Anaconda是一個Python發行版,其中包含大量的標準數學和科學計算軟件包。安裝Anaconda軟件包時會同時幫我們安裝很多軟件包,包括JupyterNotebook、NumPy、SciPy、Matplotlib、Pandas這5個用于數據分析、科學計算的常用軟件包。4.1安裝Anaconda安裝Anaconda的步驟如下。下載Anaconda網址。先打開瀏覽器,輸入下列網址,顯示出如圖4-1所示的網頁:https://www.continuum.io/downloads圖4-1運行下載后的Anaconda,如圖4-2所示。圖4-2單擊Next按鈕,如圖4-3所示。圖4-3單擊IAgree按鈕,如圖4-4所示。圖4-4單擊Next按鈕,如圖4-5所示。圖4-5設置安裝目錄,如圖4-6所示。圖4-6設置Anaconda,如圖4-7所示。圖4-7安裝完成,如圖4-8所示。圖4-84.2啟動命令提示符在Linux系統我們會使用“終端”程序輸入命令,在Windows系統我們將使用“命令提示符”程序來輸入命令。啟動命令提示符程序,如圖4-9所示。圖4-9打開命令提示符窗口,如圖4-10所示。在命令提示符窗口中可以輸入命令。注意,命令提示符界面默認的輸入法是微軟的拼音輸入法,按Ctrl+【空格】組合鍵可切換為英文輸入法,再輸入命令。圖4-10設置命令提示符窗口,如圖4-11所示。因為計算機屏幕上默認的“黑底白字”在書上印刷看起來不清楚,所以后續會改為“白底黑字”。單擊菜單圖標,選擇“屬性”選項開始進行設置。圖4-11設置命令提示符的背景顏色,如圖4-12所示。圖4-12設置命令提示符的文字顏色,如圖4-13所示。圖4-13設置完成后的命令提示符窗口,如圖4-14所示。圖4-14上面的屏幕顯示界面出現后,命令提示符就是用戶的目錄。我們可以在此輸入命令。4.3建立TensorFlow的Anaconda虛擬環境為什么要使用Anaconda虛擬環境安裝TensorFlow?因為在一臺計算機中,我們常常需要安裝很多軟件,但是每個軟件所需要的Python的關聯模塊或版本都不相同。例如,我們要使用Python開發網站系統,安裝的網站框架可能需要Python3.x的版本,但是要安裝TensorFlow需要Python3.5的版本,此時就會發生版本不一致的問題。為了解決這個問題,我們可以使用Anaconda虛擬環境來安裝,讓網站框架與TensorFlow分別安裝在不同的虛擬環境中,這樣就不會有版本不一致的問題了。另外,本文會分別介紹如何使用CPU與GPU執行TensorFlow與Keras。然而,CPU與GPU所需要安裝的TensorFlow版本不一樣,所以我們會分別建立CPU與GPU的虛擬環境,方便后續測試CPU與GPU的執行性能。1.建立工作目錄在命令提示符窗口輸入下列命令:?建立并且切換到工作目錄執行后屏幕顯示界面如圖4-15所示。圖4-152.建立Anaconda虛擬環境下面使用conda命令建立一個新的Python3.5Anaconda虛擬環境,我們將虛擬環境命名為TensorFlow。這個虛擬環境將用來安裝TensorFlow的CPU版本。在命令提示符窗口輸入下列命令:?建立TensorFlowAnaconda虛擬環境以上命令說明見表4-1。表4-1命令說明執行后屏幕顯示界面如圖4-16所示。圖4-16按Y鍵之后,就會開始安裝Anaconda虛擬環境,并且安裝各個軟件包。安裝完成后屏幕顯示界面如圖4-17所示。圖4-173.啟動Anaconda虛擬環境建立TensorFlow的Anaconda虛擬環境后,就可以啟動這個虛擬環境了。在命令提示符窗口輸入下列命令:?啟動Anaconda虛擬環境執行后屏幕顯示界面如圖4-18所示。圖4-184.關閉TensorFlow的Anaconda虛擬環境當我們不再使用TensorFlow的Anaconda虛擬環境后,就可以關閉此虛擬環境。可在命令提示符窗口輸入下列命令:?關閉Anaconda虛擬環境執行后屏幕顯示界面如圖4-19所示。圖4-194.4在Anaconda虛擬環境安裝TensorFlow與Keras之前已經建立了Anaconda虛擬環境,現在要在此虛擬環境中安裝TensorFlow與Keras。1.啟動Anaconda虛擬環境安裝TensorFlow與Keras前,先啟動TensorFlow的Anaconda虛擬環境。在命令提示字符窗口輸入下列命令:?啟動Anaconda虛擬環境執行后屏幕顯示界面如圖4-20所示。圖4-202.安裝TensorFlow在命令提示符窗口中輸入下列命令:?安裝TensorFlowCPU版本執行后屏幕顯示界面如圖4-21所示。圖4-213.安裝Keras在命令提示符窗口輸入下列命令:?安裝Keras執行后屏幕顯示界面如圖4-22所示。圖4-224.5啟動JupyterNotebook之前已經在Anaconda虛擬環境安裝了TensorFlow與Keras,現在我們要在JupyterNotebook查看TensorFlow與Keras的版本。JupyterNotebook具備交互式界面,在Web界面輸入Python命令后,可以立刻看到結果。我們還可以將數據分析的過程、執行后的命令與結果存儲成筆記本。下次打開筆記本時,可以重新執行這些命令。JupyterNotebook筆記本可以包含文字、數學公式、程序代碼、結果、圖形和視頻。因為JupyterNotebook是功能強大的交互式界面,所以在后續章節介紹的范例程序也會使用JupyterNotebook示范TensorFlow與Keras指令。1.啟動JupyterNotebook在4.3節,當我們建立TensorFlow的Anaconda虛擬環境時,也同時安裝了JupyterNotebook,所以不需要再安裝,直接啟動即可。啟動JupyterNotebook時先確認:(1)切換至工作目錄,后續JupyterNotebook讀取與存盤都會在此工作目錄。(2)確認已經啟動TensorFlow的Anaconda虛擬環境,因為我們之前安裝TensorFlow與Keras是在虛擬環境中,如果尚未啟動這個虛擬環境就打開JupyterNotebook,那么執行TensorFlow與Keras程序時會出現ModuleNotFoundError錯誤。在命令提示符窗口輸入下列命令:?切換工作目錄?啟動Anaconda虛擬環境?啟動JupyterNotebook執行后屏幕顯示界面如圖4-23所示。在圖4-23所示的運行界面中,輸入JupyterNotebook并按Enter鍵后,就會自動打開JupyterNotebook的Web界面。圖4-232.建立新的Notebook進入JupyterNotebook界面后,可以按照如圖4-24所示的步驟新建NoteBook。圖4-24新建JupyterNotebook后會打開瀏覽器新的頁面,NoteBook默認的名稱是Untitled,我們可以單擊Untitled來修改NoteBook的名稱,如圖4-25所示。圖4-25輸入新的名稱,然后單擊OK按鈕,如圖4-26所示。圖4-263.JupyterNotebook輸入命令的方式在JupyterNotebook的Cell(程序單元格)中輸入程序代碼,然后按Shift+Enter或Ctrl+Enter組合鍵來執行程序代碼。這兩種方式的差異如下。Shift+Enter:執行后,光標會移到下一個程序單元格。Ctrl+Enter:執行后,光標仍在當前的程序單元格。4.導入TensorFlow模塊在程序單元格輸入下列命令,然后按Shift+Enter組合鍵,執行程序代碼:?導入TensorFlow模塊,后續以tf來引用這個模塊執行結果如圖4-27所示。圖4-27以上命令執行后,并沒有任何輸出(沒有消息就是好消息),代表導入TensorFlow模塊沒有任何問題。如果TensorFlow安裝有問題,就會顯示錯誤信息。5.查看TensorFlow版本接下來,我們就可以查看TensorFlow版本了。在程序單元格輸入下列命令:?查看TensorFlow版本執行結果如圖4-28所示。圖4-28JupyterNotebook執行后屏幕顯示界面如圖4-29所示。圖4-296.導入Keras模塊在JupyterNotebook的程序單元格輸入程序代碼。?導入Keras模塊執行結果如圖4-30所示。圖4-30因為已經同時安裝了Keras與TensorFlow,所以導入Keras模塊后,我們可以看到Keras自動以TensorFlow作為Backend(后端)。7.查看Keras版本在JupyterNotebook的程序單元格輸入如圖4-31所示的程序代碼,查看Keras版本。圖4-31以上執行結果顯示Keras版本是2.0.2。8.保存Notebook當要退出Notebook時,記得保存,如圖4-32所示。圖4-329.關閉Notebook保存完成后,就可以關閉Notebook網頁,步驟如圖4-33所示。圖4-3310.打開之前保存的NoteBook回到Jupyter網頁,我們可以看到之前保存的test.ipynb。如果要再次打開這個Notebook,單擊即可,如圖4-34所示。圖4-3411.關閉Jupyter瀏覽器(見圖4-35)圖4-3512.關閉JupyterNotebook關閉瀏覽器后,回到命令提示符窗口,按Ctrl+C組合鍵即可關閉JupyterNotebook程序,如圖4-36所示。圖4-364.6結論本章我們介紹了如何在Windows中安裝TensorFlow與Keras,并且介紹了如何打開JupyterNotebook查看TensorFlow與Keras版本。我們將在第5章介紹如何在LinuxUbuntu中安裝TensorFlow與Keras。第5章在LinuxUbuntu中安裝TensorFlow與KerasLinux操作系統是大數據分析與機器學習很常用的平臺。而Ubuntu是眾多Linux操作系統版本中的一種,是一個開放源碼、功能強大而且免費的操作系統。本文特別介紹在LinuxUbuntu操作系統中安裝TensorFlow1.0+Keras2.0。本文假設讀者已經安裝了LinuxUbuntu操作系統,如果需要安裝Ubuntu系統有關的資料,可以在網上找到詳細的安裝步驟,也可以參考筆者的另一本文《Python+Spark2.0+Hadoop機器學習與大數據實戰》,書中有詳細的安裝說明。5.1安裝Anaconda安裝Anaconda的步驟如下。復制安裝Anaconda的下載網址。在瀏覽器輸入下列網址。?連接到continuum網址向下瀏覽,我們可以看到AnacondaforLinux,按照圖5-1所示的步驟進行操作。圖5-1下載Anaconda3-4.2.0-Linux-x86_64.sh。先在“終端”程序輸入wget再按【空格】鍵,然后按Ctrl+Shift+V組合鍵來粘貼之前所復制的網址,如圖5-2所示。圖5-2安裝Anaconda。在“終端”程序輸入下列命令,執行Anaconda3-4.2.0-Linux-x86_64.sh。執行后屏幕顯示界面如圖5-3所示。圖5-3以上指令加上“-b”是batch處理安裝,會自動省略。閱讀License條款,并自動安裝到路徑/home/hduser/anaconda2下。編輯~/.bashrc加入模塊路徑。可以在“終端”程序中輸入下列命令編輯~/.bashrc:打開編輯器屏幕顯示界面,輸入如圖5-4所示的內容,輸入完成后單擊“保存”按鈕。圖5-4使得~/.bashrc的修改生效。我們可以通過重新注銷再登錄,或使用下列命令讓用戶環境變量的設置生效(見圖5-5):圖5-5查看Python版本。可以在“終端”程序中輸入下列命令:執行后屏幕顯示界面如圖5-6所示,我們可以看到版本是Anaconda4.2.0。圖5-65.2安裝TensorFlow與Keras安裝TensorFlow與Keras的步驟如下。安裝TensorFlow。在“終端”程序中輸入下列命令。?安裝TensorFlow(見圖5-7)圖5-7安裝Keras。在“終端”程序中輸入下列命令。?安裝Keras(見圖5-8)圖5-85.3啟動JupyterNotebook之前已經在UbuntuLinux系統中安裝了TensorFlow與Keras,現在我們要在JupyterNotebook中查看TensorFlow與Keras的版本。安裝Anaconda時,也同時安裝了JupyterNotebook,所以不需要再單獨安裝,直接啟動即可。建立ipynotebook的工作目錄。可以在“終端”程序中輸入下列命令,建立并切換到ipynotebook工作目錄。按Enter鍵后,屏幕顯示如圖5-9所示。圖5-9進入JupyterNotebook。進入工作目錄后,在“終端”程序中輸入下列命令,進入JupyterNotebook:按Enter鍵后,就會啟動瀏覽器,默認的網址是http://localhost:8888,JupyterNotebook的界面如圖5-10所示。圖5-10啟動JupyterNotebook。進入JupyterNotebook界面,如圖5-11所示。關于JupyterNotebook的簡易使用說明,可參考4.5節的內容。圖5-115.4結論本章介紹了如何在LinuxUbuntu中安裝TensorFlow與Keras,并且介紹了如何打開JupyterNotebook來查看TensorFlow與Keras版本。從下一章開始,我們將開始使用Keras來設計程序。第6章KerasMNIST手寫數字識別數據集本章將介紹MNIST手寫數字識別數據集,這是由YannLeCun所搜集的,他也是ConvolutionNeuralNetworks的創始人。MNIST數字文字識別數據集數據量不會太多,而且是單色的圖像,比較簡單,很適合深度學習的初學者用來練習建立模型、訓練、預測。MNIST數據集共有訓練數據60000項、測試數據10000項。MNIST數據集中的每一項數據都由images(數字圖像)與labels(真實的數字)所組成,如圖6-1所示。圖6-1有關本章的完整程序代碼參考范例程序Keras_Mnist_Introduce.ipynb。范例程序的下載與安裝參考本文附錄A。6.1下載MNIST數據我們將創建以下Keras程序,下載并讀取MNIST數據。1.導入Keras及相關模塊因為我們已經同時安裝了Keras與TensorFlow,所以導入Keras模塊后,可以看到Keras自動以TensorFlow作為Backend。程序代碼說明見表6-1。表6-1程序代碼說明2.導入Keras模塊Keras已經提供了現成的模塊,可以幫我們下載并讀取MNIST數據,所以先導入MNIST模塊。3.第一次進行MNIST數據的下載第一次執行mnist.load_data()方法,程序會檢查用戶目錄下是否已經有MNIST數據集文件,如果還沒有,就會下載文件。以下是第一次下載文件的屏幕顯示界面,因為必須要下載文件,所以運行時間會比較長。4.查看下載的MNIST數據文件查看下載的MNIST數據文件,根據所使用的環境是Windows或LinuxUbuntu會有所不同,說明如下。?在Windows下查看已下載的MNIST數據文件MNIST數據文件下載后會存儲在用戶個人的文件夾中,因為筆者的用戶名稱是kevin,所以下載后會存儲在目錄C:\Users\kevin\.keras\datasets中,文件名是mnist.npz,如圖6-2所示。我們也可以使用文件資源管理器來查看。圖6-2?在LinuxUbuntu下查看已下載的MNIST數據文件下載完成后,可以輸入下列指令查看目錄(見圖6-3):圖6-35.讀取MNIST數據當再次執行mnist.load_data()時,由于之前已經下載了文件,因此不需要再進行下載,只需要讀取文件,這樣運行速度就會快很多。6.查看MNIST數據下載后,可以使用下列指令查看MNIST數據集的數據項數。從以上執行結果可知,數據分為兩部分:train訓練數據60000項。test測試數據10000項。6.2查看訓練數據先查看訓練數據。1.訓練數據是由images與labels所組成的images與labels共60000項,images是單色的數字圖像,labels是數字圖像的真實值,如圖6-4所示。圖6-42.定義plot_image函數顯示數字圖像為了能夠顯示images數字圖像,我們創建下列plot_image函數。以上程序代碼說明見表6-2。表6-2程序代碼說明3.執行plot_image函數查看第0個數字圖像以下程序調用plot_image函數傳入mnist.train.images[0],也就是訓練數據集的第0項數據,從顯示結果可以看到這是一個數字5的圖形。4.查看第0項label數據第0項label數據是第0個數字圖像的真實值,所以是5。6.3查看多項訓練數據images與label接下來,我們將創建plot_images_labels_prediction函數,可以顯示多項MNIST數據的images與label。1.創建plot_images_labels_prediction()函數我們希望能很方便地查看數字圖形、真實的數字與預測結果,因此創建了下列函數。?導入pyplot模塊,后續會使用plt來引用?定義plot_images_labels_prediction()函數定義plot_images_labels_prediction()函數需要傳入下列參數:images(數字圖像)、label(真實值)、prediction(預測結果)、idx(開始顯示的數據index)、num(要顯示的數據項數,默認是10,不超過25)。?設置顯示圖形的大小?如果顯示項數參數大于25,就設置為25,以免發生錯誤?for循環執行程序塊內的程序代碼,畫出num個數字圖形查看以上程序代碼時可參考注釋。?開始畫圖2.查看訓練數據前10項數據執行plot_images_labels_prediction()函數顯示前10項訓練數據。輸入x_test_image和y_test_label,不過,目前還沒有預測結果(prediction),所以傳入空list[],從第0項數據開始一直顯示到第9項數據。3.查看test測試數據查看test測試數據項數,我們可以看到共計10000項數據。4.顯示test測試數據執行plot_images_labels_prediction顯示前10項測試數據。6.4多層感知器模型數據預處理在下一章,我們將建立多層感知器模型(MultilayerPerceptron),必須先將images與label的內容進行預處理,才能使用多層感知器模型進行訓練與預測。數據預處理分為以下兩部分。features(數字圖像的特征值)數據預處理:將在6.5節說明label(數字圖像真實的值)數據預處理:將在6.6節說明。6.5features數據預處理features(數字圖像的特征值)數據預處理可分為下列兩個步驟:(1)將原本28×28的數字圖像以reshape轉換為一維的向量,其長度是784,并且轉換為Float。(2)數字圖像image的數字標準化。查看image的shape。可以用下列指令查看每一個數字圖像的shape是28×28。將image以reshape轉換。下面的程序代碼將原本28×28的二維數字圖像以reshape轉換為一維的向量,再以astype轉換為Float,共784個浮點數。查看轉換為一維向量的shape。可以用下列指令查看每一個數字圖像是784個浮點數。查看images圖像的內容。查看images第0項的內容。從以上執行結果可知,大部分都是0,少部分是數字。每一個數字都是從0到255的值,代表圖形每一個點灰度的深淺。將數字圖像images的數字標準化。images的數字標準化可以提高后續訓練模型的準確率,因為images的數字是從0到255的值,所以最簡單的標準化方式是除以255。查看數字圖像images數字標準化后的結果。使用下列指令查看數字圖像images的數字標準化后的結果,都介于0與1之間。6.6label數據預處理label(數字圖像真實的值)標簽字段原本是0~9的數字,必須以One-HotEncoding(一位有效編碼)轉換為10個0或1的組合,例如數字7經過One-HotEncoding轉換后是0000000100,正好對應輸出層的10個神經元。查看原本的label標簽字段。以下列指令來查看訓練數據label標簽字段的前5項訓練數據,我們可以看到這是0~9的數字。label標簽字段進行One-HotEncoding轉換。下面的程序代碼使用np_utils.to_categorical分別傳入參數y_train_label(訓練數據)與y_test_label(測試數據)的label標簽字段,進行One-HotEncoding轉換。查看進行One-HotEncoding轉換之后的label標簽字段。進行One-HotEncoding轉換之后,查看訓練數據label標簽字段的前5項數據,我們可以看到轉換后的結果。參考上面的結果,例如第1項數據,原來的真實值是5,進行One-HotEncoding轉換后,只有第5個數字(由0算起)是1,其余都是0。6.7結論在本章中,我們已經介紹了如何使用Keras下載并且讀取MNIST數據集,并介紹了MNIST數據集的特色,也完成了數據的預處理。在下一章,我們可以使用Keras建立多層感知器模型進行訓練,并且使用模型進行預測。第7章Keras多層感知器識別手寫數字本章將介紹用Keras建立多層感知器模型,然后訓練模型、評估模型的準確率,最后使用訓練完成的模型識別MNIST手寫數字。關于多層感知器模型的詳細介紹,可參考第2章。有關本章的完整程序代碼可參考范例程序Keras_Mnist_MLP_h256.ipynb。范例程序的下載與安裝可參考本文附錄A。7.1Keras多元感知器識別MNIST手寫數字圖像的介紹1.多層感知器模型的介紹為了能夠識別MNIST手寫數字圖像,我們將建立如圖7-1所示的多層感知器模型。圖7-12.多層感知器的訓練與預測建立如圖7-2所示的多層感知器模型后,必須先訓練模型才能夠進行預測(識別)這些手寫數字。圖7-2以多層感知器模型識別MNIST數字圖像可分為訓練與預測。?訓練MNIST數據集的訓練數據共60000項,經過數據預處理后會產生Features(數字圖像特征值)與Label(數字真實的值),然后輸入多層感知器模型進行訓練,訓練完成的模型就可以作為下一階段預測使用。?預測輸入數字圖像,預處理后會產生Features(數字圖像特征值),使用訓練完成的多層感知器模型進行預測,最后產生預測結果是0~9的數字。3.建立多層感知器模型的步驟多層感知器識別MNIST數據集中的手寫數字的步驟說明如圖7-3所示。圖7-37.2進行數據預處理有關讀取MNIST數據集數據并且進行數據預處理的詳細介紹可參考第6章。導入所需模塊。讀取MNIST數據。將features(數字圖像特征值)使用reshape轉換。下面的程序代碼將原本28×28的數字圖像以reshape轉換成784個Float數。將features(數字圖像特征值)標準化。將features(數字圖像特征值)標準化可以提高模型預測的準確度,并且更快收斂。label(數字真實的值)以One-HotEncoding進行轉換。使用np
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學年四川省達州市高二下學期7月期末監測數學試題(解析版)
- 2024-2025學年四川省達州市高一上學期1月期末考試語文試題(解析版)
- 2025年甘肅省武威市嘉峪關市臨夏州中考數學真題含答案
- 高中英語人教版必修二Unit5-Music-單元話題寫作作業
- 2025年秋三年級上冊語文同步教案 17 海濱小城
- 車輛維修廠務虛發言材料
- 自貢統計年鑒-2009-運輸和郵電主要統計指標解釋
- 冠心病的冶療與護理講課件
- 作業人員資質管理制度
- 作業現場物料管理制度
- 新教材人教A版高中數學必修第二冊全冊教學課件
- 老年患者的皮膚管理
- 機械式停車設備
- 北京市西城區2020-2021學年三年級語文下學期期末試卷新人教版
- 菌種確認課件
- 醫院病房樓電氣安裝施工方案
- 腸外營養及腸外營養制劑
- 人民幣發展史
- 學校食品安全檔案管理制度
- 環境法學案例分析題
- 《心理健康與職業生涯》期末考試題庫含答案
評論
0/150
提交評論