提示:如果您能安心的讀完下文,我相信您會對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總結爲以下三種使用的工具
- 拋出異常(常見)
- 作用域(類似於本文的應用)
- 線程鎖(類似於Lock的上鎖和解鎖)