TensorFlow筆記(1)——TensorFlow中的相關基本概念

前言

Tensorflow 是一個編程系統,使用圖(graph)來表示計算任務,圖(graph)中的節點稱之爲 op (operation),一個 op 得到 0 個或多個 Tensor,執行計算,產生 0 個或多個 Tensor。Tensor 看做是一個 n 維的數組或列表。圖必須在會話(Session)裏被啓動。python

基本概念

  • 使用圖(Graph)來表示計算任務
  • 在被稱爲會話(Session)的上下文(context)中執行圖
  • 使用tensor表示數據
  • 經過變量(Variable)維護狀態
  • 使用feed和fetch能夠爲任意的操做賦值或者從中獲取數據

下圖顯示了Session、Graph、Tensor、Variable之間的關係 算法

關係圖

圖(Graph)

在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 的傳遞關係。 數組

圖(Graph)

會話(Session)

會話(Session)是TensorFlow中的一個很是重要的概念。上面提到了,在TensorFlow中的全部計算都構建在一張計算圖(Graph)中,這是一種對數學運算過程的可視化方法。而會話(Session)就是負責讓這個圖運算起來,會話(Session)持有並管理TensorFlow程序運行時的全部資源,例如CPU或者GPU的分配。bash

使用會話(Session)的兩種方式

方式一:明確的調用會話的生成函數和關閉會話函數session

# 建立一個會話
sess = tf.Session()

# 使用該會話執行一個結果
sess.run(...)

# 關閉會話,釋放內存
sess.close()
複製代碼

調用這種方式時,要明確調用Session.close(),以釋放資源。當程序異常退出時,關閉函數就不能被執行,從而致使資源泄露。數據結構

方式二:上下文管理機制自動釋放全部資源 利用with結構將須要執行的代碼包裹住,建立會話,並經過上下文機制管理器管理該會話框架

with tf.Session() as sess:
    sess.run(...)
# 不須要再調用"Session.close()"
# 在退出with statement時,會話關閉和資源釋放已自動完成
複製代碼

Tips:通常狀況下推薦使用方式二使用會話函數

張量(Tensor)

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階 (本身想一想看) ....

張量是全部深度學習框架中最核心的組件,由於後續的全部運算和優化算法都是基於張量進行的。幾何代數中定義的張量是基於向量和矩陣的推廣,通俗一點理解的話,咱們能夠將標量視爲零階張量,矢量視爲一階張量,那麼矩陣就是二階張量。

變量(Variable)

本質也是一個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))
複製代碼

feed和fetch

1.fetch

會話運行完成以後,若是咱們想查看會話運行的結果,能夠使用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]
複製代碼

2.feed與佔位符(placeholder)

當咱們構建一個模型的時候,有時候咱們須要在運行時候輸入一些初始數據,這個時候定義模型數據輸入在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
複製代碼

3. feed和fetch

總結下,feed和fetch的做用就和他的意思是同樣的,fetch用於從session中獲取結果數據,feed是用於將數據餵給operation,而後用session執行。

相關文章
相關標籤/搜索