- 實用卷積神經網絡:運用Python實現高級深度學習模型
- (印)莫希特·賽瓦克等
- 1696字
- 2019-04-22 18:02:15
1.2 TensorFlow介紹
TensorFlow是基于計算圖實現的。思考下面的數學表達式:
c=(a+b),d=b+5
e=c*d
圖1-2是TensorFlow的一個計算圖。因為計算都是并行完成的,所以這很強大。

圖1-2 TensorFlow計算圖
TensorFlow安裝
有兩種簡單的TensorFlow安裝方法:
·使用虛擬環境(推薦并在此說明)。
·使用Docker鏡像。
1.針對macOS X/Linux不同版本
下面代碼片段用于創建一個Python虛擬環境,并在該環境安裝TensorFlow。運行此代碼之前,需要先安裝Anaconda:

請在TensorFlow官方頁面查看最新版本。
嘗試在你的Python控制臺運行以下代碼來驗證TensorFlow的安裝是否成功。如果安裝成功,控制臺應該打印出“Hello World!”。

2.TensorFlow基礎
在TensorFlow中,數據不是以整型、浮點型、字符串或其他原始數據類型存儲的,而是用一個稱為張量的數據結構來表示這些數據。它是一個由原始值組成的任意維的數組。張量的維數稱為階。在前面的例子中,hello_constant是一個0階的常量字符串張量。一些常量張量的例子如下:

TensorFlow程序的核心是計算圖。計算圖是由以下兩部分組成的有向圖:
·創建計算圖。
·運行計算圖。
計算圖在會話中執行。會話是計算圖的運行時環境,它負責分配CPU、GPU并管理TensorFlow運行時狀態。下面的代碼使用tf.Session創建一個名為sess的會話實例。然后運行sess.run()函數進行張量的運算,并將返回結果存儲在output變量中。最終打印出“Hello World!”

可以使用TensorBoard可視化圖形。運行TensorBoard的命令如下:

如下所示,讓我們創建一段簡單的加法代碼。首先創建一個整型常量x,賦值5;然后創建一個新的變量y,賦值為x加5,打印出y的值:

不同的是,沒有像在Python代碼中那樣將x+5的結果直接賦給變量variable_y,而是寫成了一個方程。這意味著當計算變量y時,取x在那個時間點的值然后加上5。variable_y值的計算在前面的代碼中從未實際執行過。上面的這段代碼實際上屬于典型的TensorFlow程序的計算圖創建部分。運行這段代碼后,你將得到類似于<tensorflow.python.ops.variables.Variable object at 0x7f074bfd9ef0>的內容,而不是variable_y的實際值10。為了解決這個問題,必須執行計算圖的代碼部分,如下所示:

這里執行一些基本的數學函數,如張量間的加、減、乘、除。
3.TensorFlow中的數學基礎
tf.add()函數取2個數字,2個張量,或1個數字和1個張量,然后以張量的形式返回它們的和:

減法和乘法的例子如下:

如果想用非常量該怎么處理呢?如何向TensorFlow提供輸入數據集?為此,TensorFlow提供了一個API—tf.placeholder(),并運用feed_dict類型。
placeholder是后續會在tf.session.run()函數中賦予值的變量,基于此,我們可以在暫時沒有數據的情況下創建我們的操作和計算圖。然后,在tf.session.run()函數中使用feed_dict參數值設置placeholder張量,通過這些占位符(placeholder)將數據輸入到計算圖中。如下示例,在會話運行之前,將字符串“Hello World”設置給張量x:

也可以使用feed_dict參數值設置多個張量,如下所示:

占位符也可以在多維情況下存儲數組,請參見如下示例:

當傳遞給feed_dict參數的數據與張量類型不匹配或者不能強制轉換為張量類型時,將拋出錯誤“ValueError:invalid literal for...”。
tf.truncated_normal()函數返回一個具有正態分布隨機值的張量。此函數主要用于網絡權重初始化:

4.TensorFlow中的softmax函數
softmax函數將其輸入(被稱為logit或者logit score)轉換為0到1之間的值,并對輸出進行歸一化,使其總和為1。換句話說,softmax函數將你的logit轉換為概率。logit是指一個事件發生與不發生的概率比值的對數。在數學上,softmax函數的定義如下:

TensorFlow中實現了softmax函數。它輸入logit并返回與輸入同類型同形狀的softmax激活,如圖1-3所示。

圖1-3 TensorFlow中的softmax函數
代碼實現如下:

我們在數學上表示標簽的方式通常稱為one-hot編碼。每個標簽都由一個向量表示,向量中1表示正確對應的標簽,0表示其他。這對大多數問題是很有效的。然而當問題有數百萬個標簽時,one-hot編碼是無效的,因為向量中大多數元素是0。我們用交叉熵測量兩個概率向量之間的相似距離,用D表示。
交叉熵是非對稱的,即D(S,L)!=D(L,S)
在機器學習中,我們通常用數學函數來定義一個模型的好壞。這個函數叫作損失函數、成本函數或者目標函數。用于確定模型損失的一個很常見的函數叫作交叉熵損失。這個概念來自信息論(想了解更多,請參考視覺信息論https://colah.github.io/posts/2015-09-Visual-Information/)。直觀來看,如果模型在訓練數據上的分類效果很差,則損失會很高,否則損失將會很低,如圖1-4所示。
在TensorFlow中,可以使用tf.reduce_sum()編寫一個交叉熵函數。它需要一個數字數組,并將其和作為一個張量返回(請參閱如下代碼塊):

圖1-4 交叉熵損失函數

但實際上,當計算softmax函數時,由于指數的存在,中間項可能會很大,所以除大數會導致數值上的不穩定。我們應該用TensorFlow提供的softmax和交叉熵損失API。如下代碼片段手動計算交叉熵損失,并使用TensorFlow API打印相同的數據:


- TensorFlow Lite移動端深度學習
- PHP+MySQL網站開發技術項目式教程(第2版)
- GitLab Repository Management
- 21天學通C++(第6版)
- 飛槳PaddlePaddle深度學習實戰
- Python Data Analysis Cookbook
- Instant Lucene.NET
- ASP.NET程序開發范例寶典
- 自學Python:編程基礎、科學計算及數據分析(第2版)
- 創意UI:Photoshop玩轉APP設計
- 貫通Tomcat開發
- 計算語言學導論
- Spark技術內幕:深入解析Spark內核架構設計與實現原理
- C/C++語言程序開發參考手冊
- Hands-On Artificial Intelligence with Unreal Engine