最近學習TensorFlow框架的使用,總是覺得有點怪怪的扛施。在我先入為主的概念中鸿捧,TensorFlow就是一個工具包,提供API給我調(diào)用實現(xiàn)功能就行了疙渣。然而事實并不是如此匙奴。
TensorFlow中的各種概念,占位符妄荔、張量泼菌、會話、計算圖等等啦租。單單這些概念就搞得我頭大哗伯。所以覺得這個框架有點不一樣,除了記住使用方法外篷角,我覺得還是有必要理解這些概念焊刹。
TensorFlow
TensorFlow的概念很多資源都有詳細介紹。簡而言之就是張量流恳蹲,這個概念對于通常的API有點不一樣虐块,并不是簡單的運算,而是張量在計算圖中的結(jié)點上進行流轉(zhuǎn)流動嘉蕾。
張量
TensorFlow的概念就是張量在計算圖中的結(jié)點上進行流轉(zhuǎn)流動贺奠。張量就是數(shù)據(jù)。
TensorFlow中的所有流經(jīng)計算圖的數(shù)據(jù)都是張量错忱。張量的概念可以對比常量敞嗡、變量與向量。其中航背,零階張量表示標量(scalar)喉悴,代表一個數(shù);一階張量表示向量(vector)玖媚,代表一維數(shù)組箕肃;n階張量表示一個n維數(shù)組。
計算圖
一直說到計算圖今魔。計算圖到底是個什么東西勺像?
簡單來說障贸,就是結(jié)點關(guān)聯(lián)起來形成的圖就是計算圖,這個圖是一個有向無環(huán)圖吟宦。舉個例子:
import tensorflow as tf
X = tf.constant(5)
Y = tf.constant(6)
Z = X * Y
print(X)
print(Y)
print(Z)
運行代碼篮洁,發(fā)現(xiàn)打印出來的結(jié)果并不是5、6和30殃姓。而是
Tensor("Const:0", shape=(), dtype=int32)
Tensor("Const_1:0", shape=(), dtype=int32)
Tensor("mul:0", shape=(), dtype=int32)
可以看到袁波,XYZ都是Tensor類型,我們可以把它理解為計算圖中的結(jié)點蜗侈。XY分別是5篷牌、6兩個常量結(jié)點,而結(jié)點Z就是*
這個運算操作踏幻。雖然 *
看起來并不像是TensorFlow的操作枷颊,但實際上TensorFlow會重載這個操作符。而這個操作并不會運算5 * 6 = 30
這樣的操作该面,而僅僅是生成一個運算關(guān)系的結(jié)點夭苗。
言歸正傳,經(jīng)過定義XY結(jié)點隔缀,再通過Z結(jié)點關(guān)聯(lián)听诸,這樣就有了一張真正的計算圖。盡管這個圖很簡單蚕泽。
會話
通過前面例子發(fā)現(xiàn)Z并不是執(zhí)行的結(jié)果,而只是一個結(jié)點桥嗤。整個計算圖并沒有計算须妻,會話中才是真正執(zhí)行。
會話的作用是處理內(nèi)存分配和優(yōu)化泛领,使我們能夠?qū)嶋H執(zhí)行由計算圖指定的計算荒吏。會話包含一個指向全局圖的指針,該指針通過指向所有節(jié)點的指針不斷更新渊鞋。
當執(zhí)行如下代碼時:
with tf.Session() as sess:
print(sess.run([Z, X, Y]))
打印結(jié)果如下:
[30, 5, 6]
個人理解圖的定義有點類似編程绰更,然后會話是執(zhí)行程序。沒有運行或被調(diào)用的方法自然不會執(zhí)行锡宋,也就不會產(chǎn)生結(jié)果儡湾。而TensorFlow中的layer則可以類比編程中的模塊或者是類。