Tensorflow 是一個編程系統,使用圖(graph)來表示計算任務,圖(graph)中的節點稱之爲 op (operation),一個 op 得到 0 個或多個 Tensor,執行計算,產生 0 個或多個 Tensor。Tensor 看做是一個 n 維的數組或列表。圖必須在會話(Session)裏被啓動。python
下圖顯示了Session、Graph、Tensor、Variable之間的關係 算法
在TensorFlow的官方文檔中,Graph 被定義爲「一些 Operation 和 Tensor 的集合」。例如咱們表達以下的一個計算的 python代碼,編程
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
c = tf.placeholder(tf.float32)
d = a*b+c
e = d*2
複製代碼
就會生成相應的一張圖,在Tensorboard中看到的圖大概以下這樣。其中每個圓圈表示一個Operation(輸入處爲Placeholder),橢圓到橢圓的邊爲Tensor,箭頭的指向表示了這張圖Operation 輸入輸出 Tensor 的傳遞關係。 數組
會話(Session)
是TensorFlow中的一個很是重要的概念。上面提到了,在TensorFlow中的全部計算都構建在一張計算圖(Graph)中,這是一種對數學運算過程的可視化方法。而會話(Session)就是負責讓這個圖運算起來,會話(Session)
持有並管理TensorFlow程序運行時的全部資源,例如CPU或者GPU的分配。bash
方式一:明確的調用會話的生成函數和關閉會話函數session
# 建立一個會話
sess = tf.Session()
# 使用該會話執行一個結果
sess.run(...)
# 關閉會話,釋放內存
sess.close()
複製代碼
調用這種方式時,要明確調用Session.close()
,以釋放資源。當程序異常退出時,關閉函數就不能被執行,從而致使資源泄露。數據結構
方式二:上下文管理機制自動釋放全部資源 利用with結構將須要執行的代碼包裹住,建立會話,並經過上下文機制管理器管理該會話框架
with tf.Session() as sess:
sess.run(...)
# 不須要再調用"Session.close()"
# 在退出with statement時,會話關閉和資源釋放已自動完成
複製代碼
Tips:通常狀況下推薦使用方式二使用會話函數
TensorFlow用張量這種數據結構來表示全部的數據.你能夠把一個張量想象成一個n維的數組或列表.一個張量有一個靜態類型和動態類型的維數.張量能夠在圖中的節點之間流通學習
在TensorFlow系統中,張量的維數來被描述爲階.可是張量的階和矩陣的階並非同一個概念.張量的階(有時是關於如順序或度數或者是n維)是張量維數的一個數量描述.好比,下面的張量(使用Python中list定義的)就是2階.
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
複製代碼
你能夠認爲一個二階張量就是咱們日常所說的矩陣,一階張量能夠認爲是一個向量.對於一個二階張量你能夠用語句t[i, j]來訪問其中的任何元素.而對於三階張量你能夠用't[i, j, k]'來訪問其中的任何元素.
階 | 數學實例 | Python 例子 |
---|---|---|
0 | 純量 (只有大小) | s = 483 |
1 | 向量(大小和方向) | v = [1.1, 2.2, 3.3] |
2 | 矩陣(數據表) | m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3階張量 (數據立體) | t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]] |
n | n階 (本身想一想看) | .... |
張量是全部深度學習框架中最核心的組件,由於後續的全部運算和優化算法都是基於張量進行的。幾何代數中定義的張量是基於向量和矩陣的推廣,通俗一點理解的話,咱們能夠將標量視爲零階張量,矢量視爲一階張量,那麼矩陣就是二階張量。
本質也是一個tensor張量,但variable主要用於數據存儲(能夠理解爲Java中的全局變量) Variable 用於構建一個變量,在計算圖的運算過程當中,其值會一直保存到程序運行結束,而通常的tensor張量在tensorflow運行過程當中只是在計算圖中流過,並不會保存下來。 所以Varibale主要用來保存tensorflow構建的一些結構中的參數,這些參數纔不會隨着運算的消失而消失,才能最終獲得一個模型。
Tips: 全部和varible有關的操做在計算的時候都要使用session會話來控制,包括計算,打印等等。
# 2.2變量
import tensorflow as tf
# 定義一個變量 X
X=tf.Variable([1,2])
# 定義一個常量 a
a=tf.constant([3,3])
# 增長一個減法op
sub=tf.subtract(X,a)
# 增長一個加法op
add=tf.add(X,sub)
# 初始化全部變量
init=tf.global_variables_initializer()
# 定義一段會話
with tf.Session() as sess:
# 在會話中執行
sess.run(init)
print(sess.run(sub))
print(sess.run(add))
# 建立一個變量,初始化爲0
state=tf.Variable(0,name='counter')
# 建立一個op,做用是使state加1
new_value=tf.add(state,1)
# 賦值op
update=tf.assign(state,new_value)
# 變量初始化
init=tf.global_variables_initializer()
# 建立一個會話
with tf.Session() as sess:
# 利用會話執行初始化操做
sess.run(init)
print(sess.run(state))
for _ in range(5):
sess.run(update)
print(sess.run(state))
複製代碼
會話運行完成以後,若是咱們想查看會話運行的結果,能夠使用fetch來實現
import tensorflow as tf
# Fetch
# 建立三個常量
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
# 執行加法和乘法操做
add=tf.add(input2,input3)
mul=tf.multiply(input1,add)
# 建立會話執行
with tf.Session() as sess:
result=sess.run([mul,add])
print(result)
複製代碼
運行結果爲:
[21.0, 7.0]
複製代碼
當咱們構建一個模型的時候,有時候咱們須要在運行時候輸入一些初始數據,這個時候定義模型數據輸入在tensorflow中就是用placeholder(佔位符)來完成。它的定義以下:
def placeholder(dtype, shape=None, name=None):
複製代碼
其中dtype表示數據類型,shape表示維度,name表示名稱。它支持單個數值與任意維度的數組輸入。 1. 單個數值佔位符定義
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
c = tf.add(a, b)
複製代碼
當咱們須要執行獲得c的運行結果時候咱們就須要在會話運行時候,經過feed來插入a與b對應的值,代碼演示以下:
with tf.Session() as sess:
result = sess.run(c, feed_dict={a:3, b:4})
print(result)
複製代碼
其中 feed_dict就是完成了feed數據功能,feed中文有餵飯的意思,這裏仍是很形象的,對定義的模型來講,數據就是最好的食物,因此就經過feed_dict來實現。
2. 多維數據 一樣對於模型須要多維數據的狀況下經過feed同樣能夠完成,定義二維數據的佔位符,而後相加,代碼以下:
_x = tf.placeholder(shape=[None, 2], dtype=tf.float32, name="x")
_y = tf.placeholder(shape=[None, 2], dtype=tf.float32, name="y")
z = tf.add(_x, _y);
複製代碼
運行時候須要feed二維數組,實現以下:
with tf.Session() as sess:
result = sess.run(z, feed_dict={_x:[[3, 4], [1, 2]], _y:[[8, 8],[9, 9]]})
print(result)
複製代碼
下面給出示例代碼:
import tensorflow as tf
# Feed
# 常見佔位符
input4=tf.placeholder(tf.float32)
input5=tf.placeholder(tf.float32)
output=tf.multiply(input4,input5)
with tf.Session() as sess:
# feed的數據以字典的形式傳入
print(sess.run(output,feed_dict={input4:2.0,input5:45.2}))
複製代碼
執行結果爲:
90.4
複製代碼
總結下,feed和fetch的做用就和他的意思是同樣的,fetch用於從session中獲取結果數據,feed是用於將數據餵給operation,而後用session執行。