TensorFlow學習記錄:計算圖

前一段時間在學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深度學習算法原理與編程實戰》 蔣子陽 著

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