TensorFlow入門——計算圖,張量,會話

目錄

TensorFlow計算模型——計算圖

TensorFlow數據模型——張量

TensorFlow運行模型——會話


TensorFlow計算模型——計算圖

計算圖是TensorFlow中最基本的一個概念,所有的計算都會轉換成計算圖上的結點,而結點上的邊描述了計算之間的依賴關係。

在tensorflow程序中,系統會自動維護一個默認的計算圖,可以通過tf.get_default_graph()函數獲取。

文中測試代碼均來自書《TensorFlow實戰Google深度學習框架》

下面代碼給出了一個樣例:

import tensorflow as tf 
# 定義一個常量使用tf.constant方法
a=tf.constant([1.0,2.0], name='a') 
b=tf.constant([1.0,2.0], name='b') 
result = a+b 
# 通過a.graph可以查看張量所屬的計算圖,如果沒有特別指定,則屬於當前默認的計算圖
print(a.graph is tf.get_default_graph()) # 輸出爲True

可以使用tf.Graph來生成新的計算圖,如:

##代碼來自書《TensorFlow實戰Google深度學習框架》
g1=tf.Graph()
with g1.as_default():
    # 在計算圖g1中定義變量'v',並設置初始值爲0。
    v=tf.get_variable('v',initializer=tf.zeros_initializer()(shape = [1]))
    
g2=tf.Graph()
with g2.as_default():
    # 在計算圖g2中定義變量'v',並設置初始值微1。
    v=tf.get_variable('v',initializer=tf.ones_initializer()(shape = [1]))

# 在計算圖g1中讀取變量'v'的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        # 在計算圖g1中,變量'v'的取值應該爲0,下一行代碼會輸出[0.]。
        print(sess.run(tf.get_variable('v')))

# 在計算圖g2中讀取變量'v'的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        # 在計算圖g2中,變量'v'的取值應該爲1,下一行代碼會輸出[1.]。
        print(sess.run(tf.get_variable('v')))

在運行不同的計算圖時,v的結果是不一樣的。這種機制可以隔離張量和計算,還提供了管理張量和計算的機制。

另外,計算圖可以通過tf.Graph.device來指定運行計算的設備:

# 指定計算運行的設備:GPU。
with g.device('/gpu:0'):
    result=a+b

TensorFlow數據模型——張量

TensorFlow的名字中就包含了它的兩個重要概念——tensor和flow。tensor即張量,表現了TensorFlow的數據結構,他是TensorFlow管理數據的形式。從功能上講,它可以被理解爲一個多維數組,第一階張量爲向量(vector),也就是一維數組,第n階張量可以理解爲一個n維數組,零階張量表示標量。

# tf.constant是一個計算,這個計算的結果爲一個張量,保存在變量a中。
a=tf.constant([1.0,2.0], name='a')
b=tf.constant([1.0,2.0], name='b')
result = tf.add(a,b,name='add')
print(result)
'''
輸出:Tensor("add:0", shape=(2,), dtype=float32)
'''

注意:這裏的加法得到的是對結果的引用,它的計算結果並不是一個數字,體現了一個張量的結構:名字(name),維度(shape),類型(type)。

在運算中,TensorFlow支持的數據類型有:tf.float32,tf.float64,tf.int8,tf.int16,tf.int32.tf.int64,tf.uint8,tf.bool,tf.complex64,tf.complex128

張量中本身沒有存儲具體數字,但是可以通過會話(session)來獲得具體數字。

TensorFlow運行模型——會話

會話(session)可以管理TensorFlow程序運行的所有資源,計算完成之後可以通過關閉會話,使系統釋放資源。

# 1、 創建一個會話,看前面張量的取值,這種方式無需關閉,上下文退出時會話關閉
with tf.Session() as sess:
    print(sess.run(result))

# tensorflow中需要手動指定默認會話,當該會話指定後,可以通過tf.Tensor.eval函數來計算一個張量的取值。
# 2、 創建一個默認的會話
sess=tf.Session()
with sess.as_default():
    print(result.eval())

# 3、 創建一個會話
sess=tf.Session()
# 下面兩個命令等價
print(sess.run(result))
print(result.eval(session=sess))

# 在交互式環境下,使用設置默認會話的方法來獲取張量的取值更加方便,tensorflow提供了一種在交互式環境下直接構建
# 默認會話的函數,tf.InteractiveSession。該函數會自動將生成的會話註冊爲默認會話。
sess= tf.InteractiveSession()
print(result.eval())
sess.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章