一、張量
1、張量的概念
在TensorFlow中,所有的資料都通過張量的形式來表示。從功能的角度,張量可以簡單理解為多維陣列,零階張量表示標量(scalar),也就是一個數;一階張量為向量(vector),也就是一維陣列;n階張量可以理解為一個n維陣列。需要注意的是,張量並沒有真正儲存數字,它儲存的是計算過程。
2、張量的屬性
以張量Tensor("Add:0", shape=(), dtype=float32) 為例:
(1)名字(Name)
屬性的第一項就是名字,一般形式為“node:src_output”,node表示節點名稱,src_output 來自節點的第幾個輸出。
(2)形狀(Shape)
屬性的第二項是維度,張量的維度可以用三個術語來描述:階(Rank)、形狀(Shape)、維數(Dimension Number)。一般表示形式如表1所示。
階 |
形狀 |
維數 |
例子 |
0 |
() |
0-D |
4 |
1 |
(D0) |
1-D |
[2,3,5] |
2 |
(D0,D1) |
2-D |
[[2,3],[3,4]] |
3 |
(D0,D1,D2) |
3-D |
[[[7],[3]],[[2],[4]]] |
N |
(D0,D1,…,Dn-1) |
N-D |
形為(D0,D1,…,Dn-1)的張量 |
表3-1 張量的維度表示
(3)型別(Type)
每一個張量會有一個唯一的型別,TensorFlow在進行運算的時候會對參與運算的所有張量進行型別的檢查,發現型別不匹配時會報錯.
TensorFlow支援14種不同的型別:
實數 tf.float32, tf.float64
整數 tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8
布林 tf.bool
複數 tf.complex64, tf.complex128
預設型別:不帶小數點的數會被預設為int32,帶小數點的會被預設為float32。
二、常量與變數
1、常量 Constant
常量指在執行過程中不會改變的值,在TensorFlow中無需進行初始化操作。
建立語句:
Constant_name = tf.constant(value)
常量在TensorFlow中一般被用於設定訓練步數、訓練步長和訓練輪數等超引數,此類引數在程式執行過程中一般不需要被改變,所以一般被設定為常量。
2、變數 Variable
變數是指在執行過程中會改變的值,在TensorFlow中需要進行初始化操作。
建立語句:
name_variable = tf.Variable(value, name)
注意:V是大寫字母
個別變數初始化:
init_op = name_variable.initializer()
使用TensorFlow編寫一個簡單的神經網路一般會用到幾十個變數,若編寫大型的神經網路,往往會使用到成千上萬個變數。若每個變數定義完都要初始化未免太過繁瑣,所以TensorFlow有提供所有變數初始化的語句。 所有變數初始化:
init_op = tf.global_variables_initializer()
# 一個簡單計算圖 node1 = tf.constant(3.0,tf.float32,name="node1") node2 = tf.constant(4.0,tf.float32,name="node2") node3 = tf.add(node1, node2) print(node3) # 建立對話並顯示執行結果 sess = tf.Session() print("執行sess.run(node1)的結果:", sess.run(node1)) # 更新變數並返回計算結果 print("執行sess.run(node3)的結果:", sess.run(node3)) # 關閉session sess.close()
三、會話
# 定義計算圖 tens1 = tf.constant([1,2,3]) # 建立一個會話 sess = tf.Session() try: #使用這個建立好的會話來得到關心的運算的結果。比如可以呼叫 sess.run(result) #來得到張量result的取值 print(sess.run(tens1)) except: print("Exception!") finally: #關閉會話使得本次執行中使用到的資源可以被釋放 sess.close()
node1 = tf.constant(3.0,tf.float32,name="node1") node2 = tf.constant(4.0,tf.float32,name="node2") result = tf.add(node1, node2) #建立一個會話,並通過Python中的上下文管理器來管理這個會話 with tf.Session() as sess: #使用這建立好的會話來計算關心的結果 print(sess.run(result)) # 不需要再呼叫 Session.close() 函式來關閉會話 # 當上下文退出時會話關閉和資源釋放也自動完成了
四、變數的賦值
與傳統的程式設計不同,在TensorFlow中變數定義和初始化後,一般無需人工進行賦值,系統會根據演算法模型,訓練優化過程中自動調整變數對應的數值。這部分的內容在後面我們使用TensorFlow實現機器學習的一些演算法的時候會更加有體會。
TensorFlow中的變數可以通過設定trainable引數來確定在訓練的時候是否更新其值,如前面提到訓練輪數一般設定為常量,但如果設定為變數,可以設定trainable=False,同樣可以達到程式執行過程中不改變其值的目的。前面提到的訓練輪數可以用以下語句進行變數賦值:
epoch = tf.Variable(0,name='epoch',trainable=False)。
但是當TensorFlow中有特殊情況需要對變數進行人工更新,也是可以用變數的更新語句的,例如:
update_op = tf.assign(variable_to_be_updated, new_value)。
import tensorflow as tf value = tf.Variable(0, name="value") one = tf.constant(1) new_value = tf.add(value, one) update_value = tf.assign(value, new_value) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for _ in range(10): sess.run(update_value) print(sess.run(value))
五、佔位符
前文提到,TensorFlow中的Variable變數型別,在定義時需要初始化,但有些變數定義時並不知道其數值,只有當真正開始執行程式時,才由外部輸入,比如訓練資料,這時候需要用到佔位符。
佔位符,是TensorFlow中特有的一種資料結構,類似動態變數,函式的引數、或者C語言或者Python語言中格式化輸出時的“%”佔位符。
TensorFlow中的佔位符雖然定義完之後不需要對其值進行初始化,但是需要確定其資料的Type和Shape。佔位符的函式介面如下:
tf.placeholder(dtype, shape=None, name=None)
1、Feed提交資料
在TensorFlow中如果構建了一個包含placeholder操作的計算圖,在程式執行當在session中呼叫run方法時,placeholder佔用的變數必須通過feed_dict引數傳遞進去,否則報錯。圖12提供了一個Feed的樣例。
2、 Fetch提取資料
會話執行完成之後,如果我們想檢視會話執行的結果,就需要使用fetch來實現,feed、fetch一般搭配起來使用