TensorFlow解析常量、变量和占位符
TensorFlow解析常量、變量和占位符
最基本的 TensorFlow 提供了一個庫來定義和執(zhí)行對張量的各種數(shù)學(xué)運算。張量,可理解為一個 n 維矩陣,所有類型的數(shù)據(jù),包括標(biāo)量、矢量和矩陣等都是特殊類型的張量。
TensorFlow 支持以下三種類型的張量:
- 常量:常量是其值不能改變的張量。
- 變量:當(dāng)一個量在會話中的值需要更新時,使用變量來表示。例如,在神經(jīng)網(wǎng)絡(luò)中,權(quán)重需要在訓(xùn)練期間更新,可以通過將權(quán)重聲明為變量來實現(xiàn)。變量在使用前需要被顯示初始化。另外需要注意的是,常量存儲在計算圖的定義中,每次加載圖時都會加載相關(guān)變量。換句話說,它們是占用內(nèi)存的。另一方面,變量又是分開存儲的。它們可以存儲在參數(shù)服務(wù)器上。
- 占位符:用于將值輸入 TensorFlow 圖中。它們可以和 feed_dict 一起使用來輸入數(shù)據(jù)。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,通常用于提供新的訓(xùn)練樣本。在會話中運行計算圖時,可以為占位符賦值。這樣在構(gòu)建一個計算圖時不需要真正地輸入數(shù)據(jù)。需要注意的是,占位符不包含任何數(shù)據(jù),因此不需要初始化它們。
TensorFlow 常量
聲明一個標(biāo)量常量:
t_1 = tf.constant(4)
一個形如 [1,3] 的常量向量可以用如下代碼聲明:
t_2 = tf.constant([4,3,2])
要創(chuàng)建一個所有元素為零的張量,可以使用 tf.zeros() 函數(shù)。這個語句可以創(chuàng)建一個形如 [M,N] 的零元素矩陣,數(shù)據(jù)類型(dtype)可以是 int32、float32 等:
tf.zeros([M,N],tf.dtype)
例如:
zero_t = tf.zeros([2,3],tf.int32)
# Results in an 2x3 array of zeros:[[0 0 0],[0 0 0]]
還可以創(chuàng)建與現(xiàn)有 Numpy 數(shù)組或張量常量具有相同形狀的張量常量,如下所示:
創(chuàng)建一個所有元素都設(shè)為 1 的張量。下面的語句即創(chuàng)建一個形如 [M,N]、元素均為 1 的矩陣:
tf.ones([M,N],tf,dtype)
例如:
ones_t = tf.ones([2,3],tf.int32)
# Results in an 2x3 array of ones:[[1 1 1],[1 1 1]]
更進(jìn)一步,還有以下語句:
? 在一定范圍內(nèi)生成一個從初值到終值等差排布的序列:
tf.linspace(start,stop,num)
相應(yīng)的值為 (stop-start)/(num-1)。例如:
range_t = tf.linspace(2.0,5.0,5)
#We get:[2. 2.75 3.5 4.25 5.]
? 從開始(默認(rèn)值=0)生成一個數(shù)字序列,增量為 delta(默認(rèn)值=1),直到終值(但不包括終值):
tf.range(start,limit,delta)
下面給出實例:
range_t = tf.range(10)
#Result:[0 1 2 3 4 5 6 7 8 9]
TensorFlow 允許創(chuàng)建具有不同分布的隨機張量:
-
使用以下語句創(chuàng)建一個具有一定均值(默認(rèn)值=0.0)和標(biāo)準(zhǔn)差(默認(rèn)值=1.0)、形狀為 [M,N] 的正態(tài)分布隨機數(shù)組:
-
創(chuàng)建一個具有一定均值(默認(rèn)值=0.0)和標(biāo)準(zhǔn)差(默認(rèn)值=1.0)、形狀為 [M,N] 的截尾正態(tài)分布隨機數(shù)組:
-
要在種子的 [minval(default=0),maxval] 范圍內(nèi)創(chuàng)建形狀為 [M,N] 的給定伽馬分布隨機數(shù)組,請執(zhí)行如下語句:
-
要將給定的張量隨機裁剪為指定的大小,使用以下語句:
tf.random_crop(t_random,[2,5],seed=12)
這里,t_random 是一個已經(jīng)定義好的張量。這將導(dǎo)致隨機從張量 t_random 中裁剪出一個大小為 [2,5] 的張量。
很多時候需要以隨機的順序來呈現(xiàn)訓(xùn)練樣本,可以使用 tf.random_shuffle() 來沿著它的第一維隨機排列張量。如果 t_random 是想要重新排序的張量,使用下面的代碼:
tf.random_shuffle(t_random) -
隨機生成的張量受初始種子值的影響。要在多次運行或會話中獲得相同的隨機數(shù),應(yīng)該將種子設(shè)置為一個常數(shù)值。當(dāng)使用大量的隨機張量時,可以使用 tf.set_random_seed() 來為所有隨機產(chǎn)生的張量設(shè)置種子。以下命令將所有會話的隨機張量的種子設(shè)置為 54:
tf.set_random_seed(54)
TIP:種子只能有整數(shù)值。
TensorFlow 變量
它們通過使用變量類來創(chuàng)建。變量的定義還包括應(yīng)該初始化的常量/隨機值。下面的代碼中創(chuàng)建了兩個不同的張量變量 t_a 和 t_b。兩者將被初始化為形狀為 [50,50] 的隨機均勻分布,最小值=0,最大值=10:
注意:變量通常在神經(jīng)網(wǎng)絡(luò)中表示權(quán)重和偏置。
下面的代碼中定義了兩個變量的權(quán)重和偏置。權(quán)重變量使用正態(tài)分布隨機初始化,均值為 0,標(biāo)準(zhǔn)差為 2,權(quán)重大小為 100×100。偏置由 100 個元素組成,每個元素初始化為 0。在這里也使用了可選參數(shù)名以給計算圖中定義的變量命名:
在前面的例子中,都是利用一些常量來初始化變量,也可以指定一個變量來初始化另一個變量。下面的語句將利用前面定義的權(quán)重來初始化 weight2:
變量的定義將指定變量如何被初始化,但是必須顯式初始化所有的聲明變量。在計算圖的定義中通過聲明初始化操作對象來實現(xiàn):
每個變量也可以在運行圖中單獨使用 tf.Variable.initializer 來初始化:
保存變量:使用 Saver 類來保存變量,定義一個 Saver 操作對象:
saver = tf.train.Saver()
TensorFlow 占位符
介紹完常量和變量之后,我們來講解最重要的元素——占位符,它們用于將數(shù)據(jù)提供給計算圖。可以使用以下方法定義一個占位符:
tf.placeholder(dtype,shape=None,name=None)
dtype 定占位符的數(shù)據(jù)類型,并且必須在聲明占位符時指定。在這里,為 x 定義一個占位符并計算 y=2*x,使用 feed_dict 輸入一個隨機的 4×5 矩陣:
解讀分析
需要注意的是,所有常量、變量和占位符將在代碼的計算圖部分中定義。如果在定義部分使用 print 語句,只會得到有關(guān)張量類型的信息,而不是它的值。
為了得到相關(guān)的值,需要創(chuàng)建會話圖并對需要提取的張量顯式使用運行命令,如下所示:
print(sess.run(t_1))
#Will print the value of t_1 defined in step 1
拓展閱讀
很多時候需要大規(guī)模的常量張量對象;在這種情況下,為了優(yōu)化內(nèi)存,最好將它們聲明為一個可訓(xùn)練標(biāo)志設(shè)置為 False 的變量:
t_large = tf.Varible(large_array,trainable = False)
TensorFlow 被設(shè)計成與 Numpy 配合運行,因此所有的 TensorFlow 數(shù)據(jù)類型都是基于 Numpy 的。使用 tf.convert_to_tensor() 可以將給定的值轉(zhuǎn)換為張量類型,并將其與 TensorFlow 函數(shù)和運算符一起使用。該函數(shù)接受 Numpy 數(shù)組、Python 列表和 Python 標(biāo)量,并允許與張量對象互操作。
下表列出了 TensorFlow 支持的常見的數(shù)據(jù)類型:
請注意,與 Python/Numpy 序列不同,TensorFlow 序列不可迭代。試試下面的代碼:
for i in tf.range(10)
你會得到一個錯誤提示:
#typeError("'Tensor’object id not iterable.")
總結(jié)
以上是生活随笔為你收集整理的TensorFlow解析常量、变量和占位符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow编程结构
- 下一篇: AIoT 2020 年分析