tensorflow基礎-數據類型


一:tensorflow中的計算定義和執行

首先,對於tensorflow來說,最重要的概念就是圖(Graph)和會話(Session),tensorflow的計算思想是:以圖的形式來表示模型,表示和計算分隔開。

 

 

 這就是一個Data Flow Graph,最核心的就是定義和計算不等於執行,一個模型跑起來只需要兩步:先描述整幅圖,然后在session中執行運算。tensorflow==tensor + flow,tensor是張量,flow流動,可以理解為張量在圖中通過上圖所示里面的a,b,c,d,e這些運算(這里把他們叫做op)進行流動(傳遞和變換)。下面通過一個簡單的實例看一下:

v1 = tf.constant([1,2,3])
v2 = tf.constant([4,5,6])
v3 = tf.add(v1, v2)
print(v1)
print(v2)
print(v3)
with tf.Session() as sess:
    print(sess.run(v3))

 

 

 

在上面,定義了兩個常量類型的張量(后面會說)v1、v2,v3把v1、v2相加,然后通縮Seeion執行運算,看一下輸出結果:

Tensor("Const:0", shape=(3,), dtype=int32)
Tensor("Const_1:0", shape=(3,), dtype=int32)
Tensor("Add:0", shape=(3,), dtype=int32)
[5 7 9]

 

可以看到,此時的v3並不是我們想要的數據,而是一個張量,括號里面顯示了張量的類型,形狀,以及里面的數據類型。這就是上面說的tensorflow中計算定義和執行是分開的,要想得到結果就必須用session來執行運算,首先初始化session,然后調用run()方法來執行定義的v3這個運算,這樣我們就可以輸出結果了,經過run之后再次輸出,此時的結果就是我們想要的數據[5 7 9]了。session在執行的時候會找到你讓他執行的運算a的依賴,把依賴的節點都進行計算,不需要的節點則不用計算。

二:tensorflow中的張量類型

張量:可理解為一個 n 維矩陣,所有類型的數據,包括標量、矢量和矩陣等都是特殊類型的張量。

TensorFlow 支持以下三種類型的張量:

  1. 常量constant:常量是其值不能改變的張量。
  2. 變量variable:當一個量在會話中的值需要更新時,使用變量來表示。例如,在神經網絡中,權重需要在訓練期間更新,可以通過將權重聲明為變量來實現。變量在使用前需要被顯示初始化。另外需要注意的是,常量存儲在計算圖的定義中,每次加載圖時都會加載相關變量。換句話說,它們是占用內存的。另一方面,變量又是分開存儲的。它們可以存儲在參數服務器上。
  3. 占位符placeholder:用於將值輸入 TensorFlow 圖中。它們可以和 feed_dict 一起使用來輸入數據。在訓練神經網絡時,它們通常用於提供新的訓練樣本。在會話中運行計算圖時,可以為占位符賦值。這樣在構建一個計算圖時不需要真正地輸入數據。需要注意的是,占位符不包含任何數據,因此不需要初始化它們。

2.1:tensorflow常量

可以這樣聲明一個常量:

a = tf.constant(2, name="a")
b = tf.constant(3, name="b")
x = tf.add(a, b, name="add")

 

這里的name是為了在tensorboard中方便查看,至於tensorboard就是整個模型的圖表示。

一個形如 [1,3] 的常量向量可以用如下代碼聲明:

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

要創建一個所有元素為零的張量,可以使用 tf.zeros() 函數。這個語句可以創建一個形如 [M,N] 的零元素矩陣,數據類型(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]]

 

還可以創建與現有 Numpy 數組或張量常量具有相同形狀的張量常量,如下所示:



創建一個所有元素都設為 1 的張量。下面的語句即創建一個形如 [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]]

更進一步,還有以下語句:
  • 在一定范圍內生成一個從初值到終值等差排布的序列:

    tf.linspace(start,stop,num)

    相應的值為 (stop-start)/(num-1)。例如:
    range_t = tf.linspace(2.0,5.0,5)
    #We get:[2. 2.75 3.5 4.25 5.]

     

  • 從開始(默認值=0)生成一個數字序列,增量為 delta(默認值=1),直到終值(但不包括終值):

    tf.range(start,limit,delta)

    下面給出實例:
    range_t = tf.range(10)
    #Result:[0 1 2 3 4 5 6 7 8 9]

     


TensorFlow 允許創建具有不同分布的隨機張量:
  1. 使用以下語句創建一個具有一定均值(默認值=0.0)和標准差(默認值=1.0)、形狀為 [M,N] 的正態分布隨機數組:


     
  2. 創建一個具有一定均值(默認值=0.0)和標准差(默認值=1.0)、形狀為 [M,N] 的截尾正態分布隨機數組:


     
  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.random_shuffle(t_random)

  5. 隨機生成的張量受初始種子值的影響。要在多次運行或會話中獲得相同的隨機數,應該將種子設置為一個常數值。當使用大量的隨機張量時,可以使用 tf.set_random_seed() 來為所有隨機產生的張量設置種子。以下命令將所有會話的隨機張量的種子設置為 54:

    tf.set_random_seed(54)

    TIP:種子只能有整數值。

2.2:tensorflow變量

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

注意:變量通常在神經網絡中表示權重和偏置。

下面的代碼中定義了兩個變量的權重和偏置。權重變量使用正態分布隨機初始化,均值為 0,標准差為 2,權重大小為 100×100。偏置由 100 個元素組成,每個元素初始化為 0。在這里也使用了可選參數名以給計算圖中定義的變量命名:



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



變量的定義將指定變量如何被初始化,但是必須顯式初始化所有的聲明變量。在計算圖的定義中通過聲明初始化操作對象來實現:



每個變量也可以在運行圖中單獨使用 tf.Variable.initializer 來初始化:



保存變量:使用 Saver 類來保存變量,定義一個 Saver 操作對象:

saver = tf.train.Saver()

 

 輸出變量內容會用到Eval()函數:

# W 是一個700 x 100 隨機變量
W = tf.Variable(tf.truncated_normal([700, 10])) 
with tf.Session() as sess:
  sess.run(W.initializer) 
  print(w)
  print(w.eval())>> Tensor("Variable/read:0", shape=(700, 10),
  dtype=float32)
  >> [[-0.76781619 -0.67020458......

 

2.3:tensorflow占位符

可以使用下面的方法定義一個占位符:

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

 

通過一個例子看一下:

# create a placeholder of type float 32-bit, shape is a vector of 3 elements 
a = tf.placeholder(tf.float32, shape=[3])
# create a constant of type float 32-bit, shape is a vector of 3 elements 
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant or a variable 
c=a+b #Shortfortf.add(a,b)
with tf.Session() as sess:
print sess.run(c)

 

上面這段程序會報錯:# Error because a doesn’t have any value 對於a我們沒有給任何數據,我們將代碼修改為:

# create a placeholder of type float 32-bit, shape is a vector of 3 elements 
a = tf.placeholder(tf.float32, shape=[3])
# create a constant of type float 32-bit, shape is a vector of 3 elements 
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant or a variable 
c=a+b #Shortfortf.add(a,b)
with tf.Session() as sess:
# feed [1, 2, 3] to placeholder a via the dict {a: [1, 2, 3]}
print sess.run(c, {a: [1, 2, 3]})
# the tensor a is the key, not the string ‘a’
# >> [6, 7, 8]

 

我們通過字典的形式將數據傳給placeholder,這是tensorflow中最普遍的方式

下面我們再看一個例子:先創建兩個op

a = tf.add(2, 5)
b = tf.mul(a, 3)

 

然后創建一個replace_dict來修改a的值:

with tf.Session() as sess:
# define a dictionary that says to replace the value of 'a' with 15
replace_dict = {a: 15}
# Run the session, passing in 'replace_dict' as the value to 'feed_dict'
sess.run(b, feed_dict=replace_dict) 
# returns 45

 

feed_dict是tensorflow中用於喂數據的方法,都以字典形式存入,就像上面這一段代碼,feed_dict={a:15},那么就把b這個op中的a的值賦值為15。

文章參考:https://www.jianshu.com/p/f4cca870b893http://c.biancheng.net/view/1885.html

***************不積跬步無以至千里***************


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM