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

1.2 TensorFlow介紹

TensorFlow是基于計算圖實現(xiàn)的。思考下面的數(shù)學(xué)表達式:

c=(a+b),d=b+5

e=c*d

圖1-2是TensorFlow的一個計算圖。因為計算都是并行完成的,所以這很強大。

圖1-2 TensorFlow計算圖

TensorFlow安裝

有兩種簡單的TensorFlow安裝方法:

·使用虛擬環(huán)境(推薦并在此說明)。

·使用Docker鏡像。

1.針對macOS X/Linux不同版本

下面代碼片段用于創(chuàng)建一個Python虛擬環(huán)境,并在該環(huán)境安裝TensorFlow。運行此代碼之前,需要先安裝Anaconda:

請在TensorFlow官方頁面查看最新版本。

嘗試在你的Python控制臺運行以下代碼來驗證TensorFlow的安裝是否成功。如果安裝成功,控制臺應(yīng)該打印出“Hello World!”。

2.TensorFlow基礎(chǔ)

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

TensorFlow程序的核心是計算圖。計算圖是由以下兩部分組成的有向圖:

·創(chuàng)建計算圖。

·運行計算圖。

計算圖在會話中執(zhí)行。會話是計算圖的運行時環(huán)境,它負責(zé)分配CPU、GPU并管理TensorFlow運行時狀態(tài)。下面的代碼使用tf.Session創(chuàng)建一個名為sess的會話實例。然后運行sess.run()函數(shù)進行張量的運算,并將返回結(jié)果存儲在output變量中。最終打印出“Hello World!”

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

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

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

這里執(zhí)行一些基本的數(shù)學(xué)函數(shù),如張量間的加、減、乘、除。

3.TensorFlow中的數(shù)學(xué)基礎(chǔ)

tf.add()函數(shù)取2個數(shù)字,2個張量,或1個數(shù)字和1個張量,然后以張量的形式返回它們的和:

減法和乘法的例子如下:

如果想用非常量該怎么處理呢?如何向TensorFlow提供輸入數(shù)據(jù)集?為此,TensorFlow提供了一個API—tf.placeholder(),并運用feed_dict類型。

placeholder是后續(xù)會在tf.session.run()函數(shù)中賦予值的變量,基于此,我們可以在暫時沒有數(shù)據(jù)的情況下創(chuàng)建我們的操作和計算圖。然后,在tf.session.run()函數(shù)中使用feed_dict參數(shù)值設(shè)置placeholder張量,通過這些占位符(placeholder)將數(shù)據(jù)輸入到計算圖中。如下示例,在會話運行之前,將字符串“Hello World”設(shè)置給張量x:

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

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

當傳遞給feed_dict參數(shù)的數(shù)據(jù)與張量類型不匹配或者不能強制轉(zhuǎn)換為張量類型時,將拋出錯誤“ValueError:invalid literal for...”。

tf.truncated_normal()函數(shù)返回一個具有正態(tài)分布隨機值的張量。此函數(shù)主要用于網(wǎng)絡(luò)權(quán)重初始化:

4.TensorFlow中的softmax函數(shù)

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

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

圖1-3 TensorFlow中的softmax函數(shù)

代碼實現(xiàn)如下:

我們在數(shù)學(xué)上表示標簽的方式通常稱為one-hot編碼。每個標簽都由一個向量表示,向量中1表示正確對應(yīng)的標簽,0表示其他。這對大多數(shù)問題是很有效的。然而當問題有數(shù)百萬個標簽時,one-hot編碼是無效的,因為向量中大多數(shù)元素是0。我們用交叉熵測量兩個概率向量之間的相似距離,用D表示。

交叉熵是非對稱的,即D(S,L)!=D(L,S)

在機器學(xué)習(xí)中,我們通常用數(shù)學(xué)函數(shù)來定義一個模型的好壞。這個函數(shù)叫作損失函數(shù)、成本函數(shù)或者目標函數(shù)。用于確定模型損失的一個很常見的函數(shù)叫作交叉熵損失。這個概念來自信息論(想了解更多,請參考視覺信息論https://colah.github.io/posts/2015-09-Visual-Information/)。直觀來看,如果模型在訓(xùn)練數(shù)據(jù)上的分類效果很差,則損失會很高,否則損失將會很低,如圖1-4所示。

在TensorFlow中,可以使用tf.reduce_sum()編寫一個交叉熵函數(shù)。它需要一個數(shù)字數(shù)組,并將其和作為一個張量返回(請參閱如下代碼塊):

圖1-4 交叉熵損失函數(shù)

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

主站蜘蛛池模板: 花垣县| 大渡口区| 渝北区| 乌海市| 巩义市| 宝山区| 任丘市| 昭觉县| 炎陵县| 郯城县| 乌兰察布市| 怀来县| 桑日县| 涿鹿县| 湾仔区| 武宁县| 南郑县| 湘潭县| 会宁县| 烟台市| 平武县| 安新县| 东丰县| 黄陵县| 长白| 揭西县| 阿图什市| 铜鼓县| 吴川市| 靖远县| 都兰县| 万荣县| 花垣县| 保康县| 宁明县| 东兴市| 梁平县| 禄丰县| 桑日县| 铜川市| 崇州市|