TensorFlow with方法和tf.variable_scope聯合使用的原理

提示:如果您能安心的讀完下文,我相信您會對with用法又會有一個新的認識


實例代碼

with tf.variable_scope(get_name("abc")) as scope1:
	v2 = tf.get_variable('v2', shape=[4,9],initializer=tf.constant_initializer())
	with tf.variable_scope(get_name("efg")) as scope2:
	v3 = tf.get_variable('v3', shape=[4,9],initializer=tf.constant_initializer())

對於上述代碼僅僅是一個演示(想要運行是不可能的)

在這裏,我僅僅想說明的是關於with 和 tf.variable_scope聯合時 取出變量名字是如何定義的。


對於變量名v2的提取:其名稱應該爲:abc/v2
對於變量名v3的提取:其名稱應該爲:abc/efg/v3


得到的這個結果的原因是什麼呢?

其實,和with方法是有關係的

with方法,在我們看來僅僅是用於拋出異常的,但是它的這種操作也相當於進展出棧的過程

比如,我們定義了一個Session會話,變量在調用的過程就是一個進棧出棧的過程

當在調用變量v2的時候,我們首先會進入with的__enter__方法,這也就是進棧的過程

此時也就相當於是scope1進入棧中

當執行完變量名的定義後

我們會進入with的__exit__的方法,這也就是彈棧的過程

這樣獲取的變量名稱就是:abc/v2

對於變量v3,同樣的道理

scope1進棧,隨後scope2進棧,當獲取變量後,再執行彈棧操作,最終獲取到了變量的名稱爲:abc/efg/v3


依據目前的學習,我將with總結爲以下三種使用的工具

  1. 拋出異常(常見)
  2. 作用域(類似於本文的應用)
  3. 線程鎖(類似於Lock的上鎖和解鎖)

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