一、張量的概念node
在TensorFlow中,全部的數據都經過張量的形式來表示。從功能的角度,張量能夠簡單理解爲多維數組,零階張量表示標量(scalar),也就是一個數;一階張量爲向量(vector),也就是一維數組;n階張量能夠理解爲一個n維數組。須要注意的是,張量並無真正保存數字,它保存的是計算過程。算法
二、張量的屬性編程
以張量Tensor("Add:0", shape=(), dtype=float32) 爲例:數組
(1)名字(Name)瀏覽器
屬性的第一項就是名字,通常形式爲「node:src_output」,node表示節點名稱,src_output 來自節點的第幾個輸出。網絡
(2)形狀(Shape)session
屬性的第二項是維度,張量的維度能夠用三個術語來描述:階(Rank)、形狀(Shape)、維數(Dimension Number)。通常表示形式如表1所示。數據結構
階app |
形狀dom |
維數 |
例子 |
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。
一、常量 Constant
常量指在運行過程當中不會改變的值,在TensorFlow中無需進行初始化操做。
建立語句:
Constant_name = tf.constant(value)
常量在TensorFlow中通常被用於設置訓練步數、訓練步長和訓練輪數等超參數,此類參數在程序執行過程當中通常不須要被改變,因此通常被設置爲常量。
二、變量 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)
一、Feed提交數據
在TensorFlow中若是構建了一個包含placeholder操做的計算圖,在程序執行當在session中調用run方法時,placeholder佔用的變量必須經過feed_dict參數傳遞進去,不然報錯。圖12提供了一個Feed的樣例。
二、 Fetch提取數據
會話運行完成以後,若是咱們想查看會話運行的結果,就須要使用fetch來實現,feed、fetch通常搭配起來使用