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

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打印相同的數據:

主站蜘蛛池模板: 武胜县| 定陶县| 都江堰市| 九龙坡区| 河源市| 辰溪县| 昆山市| 乃东县| 荔浦县| 大连市| 漯河市| 前郭尔| 惠来县| 井陉县| 百色市| 景宁| 牡丹江市| 永平县| 新沂市| 大关县| 闵行区| 灌云县| 中牟县| 连州市| 巧家县| 博爱县| 海丰县| 信宜市| 维西| 西宁市| 巴楚县| 正宁县| 新绛县| 成安县| 拉萨市| 江陵县| 庆元县| 论坛| 大同县| 庄浪县| 娄烦县|