TensorFlow常量、變數和佔位符詳解(學習筆記)

Daaangawa發表於2020-11-08

本文章只是學習筆記,不具有任何參考性

http://c.biancheng.net/view/1885.html 學習網站

基本的TensorFlow提供了一個庫定義和執行對張量的各種數學運算。

 

張量:可以理解為一個n維矩陣,所有型別的資料。包括標量,向量和矩陣都是特殊型別的張量。

 

TensorFlow 支援一下三種型別的張量:

1.常量:常量是其值不能改變的張量

2.變數:當一個量在會話中的值需要更新時,使用變數來表示。例如,在神經網路中,權重需要在訓練期間更新,可以通過將權重宣告為變數來實現

變數在使用前需要被顯示初始化。另外需要注意的是,常量儲存在計算圖的定義中,每次載入圖時都會載入相關變數。換句話說,它們是佔用記憶體的。另一方面,變數又是分開儲存的。它們可以儲存在引數伺服器上。

3.佔位符:用於將值輸入TensorFlow圖中。他們可以和feed_dict 一起使用來輸入資料。在訓練神經網路時,它們通常用於提供新的訓練樣本。在繪畫中執行計算圖時,可以為佔位符賦值。這樣在構建一個計算圖時不需要真正地輸入資料。需要注意的是佔位符不包含任何資料,因此不需要初始化它們。

 

TensorFlow 常量

宣告一個標量常量:

t_1 = tf.constant(4)

一個形如[1,3]的常量向量可以用如下程式碼宣告:

t_2 = tf.constant([4,3,2])

要建立一個所有元素為零的張量,可以使用tf.zero()函式。這個語句可以建立一個形如[M,N]的零元素矩陣,資料型別(dtype)可以是32位,float32等

例如:

zero_t = tf.zeros([2,3],tf.int32)

還可以建立與現有Numpy陣列或張量具有相同形狀的張量常量

tf.zeros_like(t_2)

tf.ones_like(t_2)

建立一個所有元素都設為1的張量。下面的語句即建立一個形如[M,N]、元素均為1的矩陣:

例如:

tf.ones([2,3],tf.int32)

更進一步,還有以下語句:

  • 在一定範圍內生成一個聰初值到終值等差排布的序列:
tf.linspace(start,stop,num)

相應的值位(stop-start/(num-1))例如:

range_t = tf.linspace(2.0,5.0,0.5)
  • 從開始(預設值=0)生成一個數字序列,增量為delta (預設值=1),直到終值(但不包括終值)
tf.range(start,limit,delta)
range_t = tf.range(5)
#resualt:[0,1,2,3,4]

TensorFlow 允許建立具有不同分佈的隨機張量:

1.使用以下語句建立一個具有一定均值(預設值=0.0)和標準差(預設值=1.0)、形狀為[M,N] 的正態分佈隨及陣列:

shape:輸入張量的形狀,必選

mean:正態分佈的均值,預設為0

stddev:正態分佈的標準差

dtype:輸出的型別,預設為tf.float32

seed:隨機數種子,是一個整數,當設定之後,每次生成的隨機數都一樣

name: 操作的名稱

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
t_random = tf.random_normal([2,3],mean=2.0,stddev=4,seed=12)

#2.建立一個具有一定均值(預設值=0.0)和標準差(預設值=1.0)、形狀[M,N]的截尾正態分佈隨機陣列:

t_random =tf.truncated_normal([1,5],stddev=2,seed=12)

#3.要在種子的[minval (default=0),maxval] 範圍內建立形狀為[M,N] 的給定伽馬分佈隨機陣列,請執行如下語句:

4.要將給定的張量隨機剪為指定的大小,使用以下語句:

tf.random_crop(t_random[2,5],seed=12)

這裡t_random 是一個已經定義好的張量。這將導致隨及從張量 t_random 中裁剪出一個大小為[2,5]的張量。

很多時候需要以隨機的順序來呈現訓練樣本,可以使用tf.random.shuffle() 來沿著它的第一維隨機排列張量。如果t_random 是想要重新排列的張量,使用下面的程式碼:

tf.set_random_seed(54)

TensorFlow 變數

它們通過使用變數類來建立。變數的定義還包括應該初始化的常量/隨機值。下面的程式碼中建立了兩個不同的張量變數t_a和t_b。 兩者將被初始化為形狀為[50,50]的隨機均勻分佈,最小值=0,最大值=10:

rand_t = tf.random_uniform([50,50],0,10,seed=0)
t_a = tf.Variable(rand_t)
t_b = tf.Variable(rand_t)

注意變數通常在神經網路中表示權重和偏置

定義兩個變數的權重和偏置。

weights = tf.Variable(tf.random_noraml([100,100],stddev=2))
bias = tf.Variable(tf.zeros[100],name = 'biases')

在前面的例子中,都是利用一些常量來初始化變數,也可以指定一個變數來初始化另一個變數。下面的語句將利用前面定義的權重來初始化weight2:

weight2 = tf.Variable(weights.initialized_value(),name='w2')

變數的定義將指定變數如何被初始化,但是必須顯式初始化所有的宣告變數。在計算圖的定義中通過宣告初始化操作物件來實現:

intial_op = tf.global_variables_initializer()

每個變數也可以在執行途中單獨來初始化

bias = tf.Variable(tf.zeros([100,100]))
with tf.Session() as sess:
    sess.run(bias.initializer)

儲存變數:使用Saver類儲存變數,定義一個Saver操作物件

saver = tf.train.Saver()

TensorFlow 佔位符

它們用於將資料提供給計算圖。

tf.placeholder(dtype,shape=None,name=None)

dtype 定佔位符的資料型別,並且必須宣告佔位符時指定。在這裡,為x定義一個佔位符並計算 y=x *2,

x = tf.placeholder("float")

y = x * 2

data_x = tf.random_uniform([4,5],10)

with tf.Session() as sess:
    x_data = sess.run(data_x)
    print(sess.run(y,feed_dict{x:x_data}))

需要注意的是,所有常量、變數和佔位符將在程式碼的計算圖部分中定義。如果在定義部分使用 print 語句,只會得到有關張量型別的資訊,而不是它的值。

為了得到相關的值,需要建立會話圖並對需要提取的張量顯式使用執行命令,如下所示:

print(sess.run(t_1))
#Will print the value of t_1 defined in step 1

 

相關文章