白話TensorFlow +實戰系列(一)詳解Tensor與Flow

TensorFlow作為目前最歡迎的深度學習框架(是的,你沒看錯,是最受歡迎,GitHub上已超越Caffe),是由Google開源的一個計算框架,該框架已經很好的集成了深度學習的各種演算法,所以說是非常方便,並且與Keras也兼容,再加上Google強大的資源,可以說選TensorFlow進行深度學習是非常明智的。TensorFlow這個名字是由Tensor(張量)與Flow(流)兩部分組成,一看就知道這兩部分格外重要,不然Google也不會隨便拿來命名,是吧。所以接下來就挨個詳細解剖這倆部分。

Tensor,翻譯成張量,是TensorFlow中管理數據的形式,其中Tensor並不保存真正的數據,他保存的是得到這些數字的計算過程。剛開始接觸TensorFlow的話,很不容易明白這是什麼吧,你可以換個方式理解,從tensor的功能上可以把他看作成多維數組(只是用於理解,並不等同於數組!後面會解釋道),比如,一個shape=[2,3]的張量可以理解成一個大LIST中有兩個小list,例如,大LIST=[[1,2,3],[4,5,6]]。而每一個小list由三個數據構成,list1=[1,2,3],list2=[4,5,6],高維度的Tensor依此類推,大LIST套小list,環環套。再次說明一下,這個只是為了理解,張量並不等同於列表!

張量是TensorFlow中基本的數據結構,我們可以用TensorFlow定義一個W(關於TensorFlow定義變數的方法以後會講,現在直接運用)

我們通過tf.constant把W定義成了一個shape=(2,3)的張量,當我們直接列印W時,會發現並沒有像數組那樣直接列印出來,而是一個關於Tensor的解釋。如圖:

由圖可以看見,關於Tensor的解釋主要由三個屬性組成:名字(name)、維度(shape)、類型(type)。其中第一個屬性名字給出了這個張量是怎麼來的,"Const:0"表示的是這個張量由計算節點Const(關於節點的解釋下面介紹Flow的時候給出)輸出的第一個結果得來;第二個屬性shape給出了這個張量的維度信息,shape=(2,3)說明了張量是個二維數組,也可理解為一個2x 3的矩陣;第三個屬性說明了張量的數據類型,TensorFlow支持14種不同的類型:浮點型float(tf.float32, tf.float64), 整數型int(tf.int8,tf.int16, tf.int32, tf.int64, tf.int128), 布爾型(tf.bool),複數(tf.complex64,tf.complex128),值得注意的一點時,當兩個張量進行運算時,數據類型要相同,不然TensorFlow會報錯。由此可見我們定義的W並非簡單的數組。

這時候可能就會有個疑問,既然張量保存的計算過程,那如何得到張量里的數據呢?或者如何將張量print出來,而不是僅僅是列印關於Tensor的解釋呢?

這個就涉及到TensorFlow的第二個關鍵點,Flow(流)的解釋了。Flow可以理解成各個張量計算相互轉化的過程,而TensorFlow計算過程是基於一個叫計算圖的的方式進行的。一個簡單的計算圖如下:

圖中的圓圈a與b、以及矩形add是計算圖中的一個節點,節點的含義指的是TensorFlow中的計算過程!這個簡單的計算圖代碼如下:

看到這裡可能會有疑問了,add節點很好理解,代表的是節點a與節點b相加的計算過程。但是a與b明明都是由tf.constant函數定義的張量,怎麼會在計算圖中表示節點呢?怎麼會是計算過程呢?這個恰恰就剛好解釋了TensorFlow中張量與數組之間的區別。還記得之前我說張量保存的計算過程吧,再看上面列印張量W的圖:

當我們列印張量W的時候,得到的結果是一個Tensor的解釋,其中第一個屬性名字(name)表示的是該張量由節點Const的第一個輸出而來。正是這個原因,當我們用tf.Variable或者tf.constant定義變數或者常量的時候,我們其實定義的是一個特殊的計算過程,而這個計算過程我們可以理解為恆定的輸出某個數。所以這就可以很好的理解為什麼a與b在計算圖中是一個節點了,並且張量為什麼是一個計算過程了。

既然張量是一個計算過程,而我們明明想要的是張量里的數據,那我們到底要怎樣才能得到我們想要的結果呢?

這就回到了用TensorFlow進行編程時特有的形式了。編程時,我們首先要做的就是構建計算圖,其目的是定義計算圖中的所有計算,注意此時的計算圖並沒有執行的功能,要想將定義好的計算圖執行運算,要用到TensorFlow中的會話來進行,創建會話用tf.Sess(),具體代碼如圖:

上面有幾點需要注意下:1)tf.global_variables_initializer()這個函數的作用是初始化所有變數,TensorFlow中要求將定義好的變數進行初始化,可以當成是固定模式,沒什麼好過多說的。2)withtf.Session() as sess: 這個是創建會話用到的,也可以理解為固定模式,3)經過a+b後形成的y也是一個張量,而通過會話中sees.run(y)執行後,此時列印的張量為為:

也就是說,張量經過會話執行運算後,這時候就是計算結果了,而非一個Tensor。

經過上面的解釋,相信已經可以很好的理解Tensor以及TensorFlow進行編程的形式了。

首發博客地址~

本人水平有限,如有不正確的地方,歡迎指正~


推薦閱讀:

PyTorch提取中間層特徵?
顯卡、顯卡驅動、cuda 之間的關係是什麼?
如何評價人們對電腦在圍棋上戰勝人類的時間預測?
關於深度學習的論文的網站有哪些比較出名國內國外的各有哪些?

TAG:深度学习DeepLearning | TensorFlow |