前一段時間在學Keras,對深度學習算是有了點了解。最近在學Tensorflow,感覺有些重要的概念需要記錄下來,方便日後複習查看。
首先來看下什麼是計算圖
Tensorflow 程序中的計算過程可以表示爲一個計算圖,其作用與外觀都可以類比程序流程圖來理解,在計算圖上我們可以直觀地看到數據的計算流程。
計算圖中每一個運算都可以視爲一個節點(Node),每一個節點都可有任意個輸入和輸出。
如果一個運算的輸入取值自另一個運算的輸出,那麼稱這兩個運算存在依賴關係,並且這兩個運算的節點之間通過邊相互連接。
通常將Tensorflow的計算圖稱爲程序的“計算模型”,編寫Tensorflow程序時,系統會自動維護一個默認的計算圖,Tensorflow會自動將定義的所有計算添加到默認的計算圖中。在Tensorflow程序中,通過函數get_default_graph()可以獲取對當前默認計算圖的引用。
一般情況下我們使用默認的計算圖可以滿足絕大部分情況下的需求,當我們需要更多的計算圖來完成工作的時候,可以通過函數Graph()來生成新的計算圖,而且可以通過函數as_default()將新的計算圖設置成默認的計算圖。
我們來看一個例子
import tensorflow as tf
g1=tf.Graph()
with g1.as_default():
a=tf.get_variable("a",[2],initializer=tf.ones_initializer())
b=tf.get_variable("b",[2],initializer=tf.zeros_initializer())
g2=tf.Graph()
with g2.as_default():
a=tf.get_variable("a",[2],initializer=tf.zeros_initializer())
b=tf.get_variable("b",[2],initializer=tf.ones_initializer())
with tf.Session(graph=g1) as sees:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sees.run(tf.getvariable("a")))
print(sees.run(tf.getvariable("b")))
#這裏輸出[1,1]
# [0,0]
with tf.Session(graph=g2) as sees:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sees.run(tf.getvariable("a")))
print(sees.run(tf.getvariable("b")))
#這裏輸出[0,0]
# [1,1]
可以看到,代碼中使用了函數Graph()生成了兩個計算圖以及使用as_default()函數將生成的計算圖設定爲默認圖,在計算圖g1中,a是一個1x2維的矩陣[1,1],b是一個1x2維的矩陣[0,0],而在計算圖g2中,a是一個1x2維的矩陣[0,0],b是一個1x2維的矩陣[1,1]。
由此,我們不難得出一個結論,名字相同的張量在不同的計算圖中的值是不一樣的,而且兩個張量之間是互不干擾的。另外,不同的計算圖上的張量和運算都不會共享的,也就是說,我們不能在某一計算圖中調用其它計算圖中的成員。
參考書籍:《TensorFlow深度學習算法原理與編程實戰》 蔣子陽 著