官术网_书友最值得收藏!

2.1 TensorFlow2.0簡介

谷歌公司在2011年啟動了谷歌大腦(Google Brain)項目,該項目旨在探索超大規模的深度神經網絡,一方面用于研究,另一方面也希望可以在谷歌公司的各類產品中使用,DistBelief分布式機器學習框架便是該項目的一部分。DistBelief曾在谷歌公司內部得到了廣泛的使用,有超過50個谷歌公司團隊(包括其子公司)在他們的產品中使用DistBelief部署了深度神經網絡,包括搜索、廣告、地圖、語音識別及YouTube等系統。

TensorFlow是谷歌公司在DistBelief的經驗和基礎上開發的第二代大規模分布式機器學習系統。為了打造一個行業標準,以及借助社區的力量來完善TensorFlow等目的,谷歌公司于2015年11月將TensorFlow在GitHub上開源。在從TensorFlow1.0正式版發布(2017年2月)到TensorFlow2.0的RC版發布(2019年9月)僅2年多時間中,TensorFlow已經成為各類深度學習框架中的主力軍。

TensorFlow使用數據流模型來描述計算過程,并將它們映射到了各種不同的操作系統上,包括Linux、Max OS X、Windows、Android和iOS等,從x86架構到ARM架構,從擁有單個或多個CPU的服務器到大規模GPU集群,憑借著統一的架構,可以跨越多種平臺部署,顯著地降低了機器學習系統的應用部署難度,易用性得到了很大程度的提升。

2.1.1 TensorFlow的基本概念

本節將簡單地介紹TensorFlow的基本概念。

1.計算圖

計算圖(Computation Graph)是一個有向圖(Directed Graph),是對TensorFlow中計算任務的抽象描述,也稱為數據流圖(Data Flow Graph)。TensorFlow使用計算圖將計算表示成獨立指令之間的依賴關系。在計算圖中,節點表示計算單元(即一個獨立的運算操作),圖中的邊表示計算使用或產生的數據。

TensorFlow1.x采用的是靜態計算圖機制,即我們使用TensorFlow低級API編程時,要先定義好計算圖,再創建TensorFlow會話(Session)來執行計算圖,可以反復調用它(1.x版本提供的Eager Execution接口可以讓用戶使用動態計算圖)。

TensorFlow2.0則采用了動態計算圖機制(1.x版本的Eager Execution在2.0中成為默認的執行方式),可以像執行普通的Python程序一樣執行TensorFlow的代碼,而不再需要自己預先定義好計算圖,調試代碼也更加容易。TensorFlow1.x的靜態計算圖機制一直被用戶所詬病,調整為動態計算圖機制是TensorFlow2.0的一個重大改進,并且提供了方法,以保留靜態計算圖的優勢。

2.會話

在1.x版本中,會話(Session)是客戶端程序與TensorFlow系統進行交互的接口,我們定義好的計算圖必須在會話中執行。當會話被創建時會初始化一個空的圖,客戶端程序可以通過會話提供的“Extend”方法向這個圖中添加新的節點來創建計算圖,并通過“tf.Session”類提供的“run”方法來執行計算圖。在大多數情況下只需要創建一次會話和計算圖,之后可以在會話中反復執行整個計算圖或者其中的某些子圖。

TensorFlow2.0采用了動態計算圖機制,就不需要在會話中執行計算圖了,“tf.Session”類被放到了兼容模塊“TensorFlow.compat.v1”中,這個模塊里有完整的TensorFlow1.x的API。為了保留靜態計算圖的優勢(例如性能優化和可移植性等),TensorFlow2.0提供了“tf.function”方法,對于使用“tf.function”方法修飾的Python函數,TensorFlow可以將其作為單個圖來運行。

3.運算操作和運算核

計算圖中的每一個節點就是一個運算操作(Operation,通常簡稱Op),每一個運算操作都有名稱,并且代表了一種類型的抽象運算,例如“MatMul”代表矩陣的乘法。每個運算操作都可以有自己的屬性,但是所有的屬性都必須被預先設置,或者能夠在創建計算圖時根據上下文推斷出來。通過設置運算操作的屬性可以讓運算操作支持不同的張量(Tensor)元素類型,例如讓向量加法操作運算只接收浮點類型的張量。運算核(Kernel)是一個運算操作在某個具體的硬件(比如CPU或GPU)上的實現,在TensorFlow中可以通過注冊機制加入新的運算操作或者為已有的運算操作添加新的運算核。

表2-1所示的是TensorFlow中的一些內建運算操作。

表2-1 TensorFlow的部分運算操作

4.張量

張量(Tensor)可以看作一個多維的數組或列表,它是對矢量和矩陣的更高維度的泛化,張量由“tf.Tensor”類定義。計算圖中的一個運算操作可以獲得0個或多個張量作為輸入,運算后會產生0個或多個張量輸出。這些張量在計算圖的邊中流動(Flow),從一個節點(運算操作)到另一個節點,TensorFlow也因此而得名。

張量具有以下兩個屬性:

●數據類型(同一個張量中的每個元素都具有相同的數據類型,例如float32、int32及string)。

●形狀(即張量的維數及每個維度的大?。?。

表2-2所示的是TensorFlow中張量的形狀示例。

表2-2 TensorFlow中張量的形狀示例

TensorFlow有一些特殊的張量,如下所示。

●tf.Variable:變量。TensorFlow中的張量一般都不會被持久化保存,參與一次運算操作后就會被丟棄了。而變量是一種特殊的張量。對于那些需要被持久化保存的張量,可以用變量來代替。我們可以使用“tf.Variable”類來定義和操作變量,該類提供了一些操作讓我們可以對變量的值進行更改,例如“assign”和“assign_add”等。模型的參數一般都是使用變量來存儲的,在模型訓練的過程中,參數會不斷地更新。變量的值可以修改,但是其維度不可以改變。

●tf.constant:常量。常量定義時必須初始化值,且定義后其值和維度不可再改變。

●tf.placeholder:占位符。在執行“session.run()”方法時傳入具體的值,TensorFlow2.0中不再使用,但依然可以在“TensorFlow.compat.v1”模塊中找到。

●tf.SparseTensor:稀疏張量。

2.1.2 從1.x到2.0的變化

TensorFlow2.0在1.x的基礎上做了重新設計,重點放在了提升開發人員的工作效率上,確保2.0版本更加簡單易用。TensorFlow2.0為了提升易用性做了很多改進,例如對API做了精簡,刪除了冗余的API,使得API更加一致(例如統一TensorFlow和tf.keras的循環神經網絡和優化器等),以及由靜態計算圖轉變為動態計算圖等(這使得代碼的編寫和調試變得更加容易)。接下來看看TensorFlow2.0的主要變化。

1.API精簡

很多TensorFlow1.x的API在2.0中被去掉或者改變了位置,還有一些則被新的API給替換掉了。官方提供了一個轉換工具,可以用來將1.x版本的代碼升級到2.0,其主要工作其實就是修改這些有變更的API。不過使用該工具不一定能夠轉換成功,轉換成功后的代碼也并不一定能夠正常運行,很多時候還是需要人工修改。

2.動態計算圖

動態計算圖(Eager Execution)是TensorFlow從1.8版開始正式加入的,但只是作為一種可選操作,在TensorFlow2.0之前,TensorFlow默認的模式都是靜態計算圖機制(Graph Execution),TensorFlow2.0將動態計算圖設為默認模式。在該模式下用戶能夠更輕松地編寫和調試代碼,可以使用原生的Python控制語句,大大降低學習和使用TensorFlow的門檻。在TensorFlow2.0中,圖(Graph)和會話(Session)都變成了底層實現,而不再需要用戶關心了。

3.取消全局變量

TensorFlow1.x非常依賴隱式全局命名空間。當我們調用“tf.Variable”創建變量時,該變量就會被放進默認的圖中,即使我們忘記了指向它的Python變量,它也會留在那里。當我們想恢復這些變量時,必須知道該變量的名稱。如果沒法控制這些變量的創建,也就無法做到這點。TensorFlow1.x中有各種機制旨在幫助用戶再次找到他們所創建的變量,而在2.0版中則取消了所有這些機制,支持默認機制:跟蹤變量。當我們不再用到某個變量時,該變量就會被自動回收。

4.使用函數而不是會話

在TensorFlow1.x中,使用“session.run()”方法執行計算圖,“session.run()”方法的調用類似于函數調用:指定輸入數據和調用的方法,最后返回輸出結果。為了保留靜態圖的優勢,如性能優化及重用模塊化的TensorFlow函數等,在TensorFlow2.0中,我們可以使用“tf.function()”來修飾Python函數以將其標記為即時(Just-In-Time)編譯,從而TensorFlow可以將其作為單個圖來執行。

2.1.3 TensorFlow2.0的架構

作為全球最受歡迎、使用最為廣泛的機器學習平臺之一,TensorFlow在其發展的三年時間也是機器學習和人工智能發展最為迅猛的三年。TensorFlow2.0是一個重要的里程碑,其重心放在了簡單性和易用性上,盡量降低用戶使用的門檻。TensorFlow團隊為其添加了許多的組件,在TensorFlow2.0里,這些組件被打包成了一個全面的平臺,它支持從訓練到部署的標準化的機器學習流程。圖2-1是TensorFlow2.0架構的簡化概念圖。

圖2-1 TensorFlow2.0架構的簡化概念圖

接下來我們結合圖2-1介紹TensorFlow2.0的基本工作流程及對應的可以使用的API,還會根據TensorFlow的官方文檔重點介紹一下“tf.data”和“tf.keras”這兩個API,讓讀者快速入門TensorFlow2.0的使用。讀者可以結合官方文檔在本書后續的項目實戰中慢慢熟悉和掌握其他API。

1.使用tf.data加載數據

我們使用tf.data所創建的輸入管道來讀取訓練數據,并可以通過tf.feature_column來指定特征列或者交叉特征。

2.使用tf.keras或Premade Estimators構建、訓練和驗證模型

作為TensorFlow的核心高級API,tf.keras已經和TensorFlow的其余部分緊密集成。使用tf.keras可以簡單、快捷地構建模型。另外tf.estimator中打包了一些標準的模型供我們直接使用,例如邏輯回歸、提升樹及隨機森林等。當我們不想從頭開始訓練一個模型時(例如這個模型的訓練可能非常耗時),可以使用TensorFlow Hub模塊來進行遷移學習。

3.使用Eager Execution運行和調試模型,以及使用tf.function充分利用計算圖的優勢

前面已經介紹過,在Eager Execution模式下,可以更加方便地編寫和調試代碼,在TensorFlow2.0中,該模式是默認開啟的。我們可以使用tf.function來將Python程序轉換為TensorFlow的靜態計算圖,這樣就可以保留TensorFlow1.x版本中的靜態計算圖的優勢。

4.使用Distribution Strategies進行分布式訓練

對于大規模的機器學習訓練任務,tf.distribute.Strategy API旨在讓用戶只需要對現有的模型和代碼做最少的更改就可以實現分布式的訓練。TensorFlow支持CPU、GPU以及TPU等硬件加速器,可以將訓練任務分配到單節點、多加速器及多節點或多加速器。

5.使用SavedModel存儲模型

在TensorFlow中有兩種模型存儲的格式:一個是檢查點(Checkpoints),另一個是SavedModel,前者依賴于創建模型的源代碼,而后者則與創建模型的源代碼無關,因此標準化后的SavedModel可以作為TensorFlow Serving、TensorFlow Lite、TensorFlow.js或者其他編程語言的交換格式。

主站蜘蛛池模板: 南充市| 克拉玛依市| 鄂伦春自治旗| 广西| 南宫市| 丘北县| 濮阳县| 邹城市| 涟水县| 榆社县| 汨罗市| 元江| 通榆县| 晴隆县| 云林县| 郑州市| 米脂县| 清流县| 武鸣县| 肃北| 榆社县| 治多县| 巴里| 长寿区| 大名县| 新和县| 清原| 伊宁县| 靖边县| 沅江市| 洛宁县| 文山县| 遂溪县| 凤阳县| 绥化市| 鹤壁市| 梁山县| 宝鸡市| 德昌县| 漠河县| 德格县|