TensorFlow 變量作用域 變量管理 共享變量
阿新 • • 發佈:2017-12-14
共享變量 設置 我們 www 中大 bsp spa 文章 init
當我們的神經網絡擁有很復雜的模塊時,我們使用TensorFlow提供的變量作用域(tf.variable_scope)來管理這些變量。
變量作用域的兩個核心方法:
tf.get_variable(<name>, <shape>, <initializer>): 通過所給的名字創建或是返回一個變量.
tf.variable_scope(<scope_name>): 通過 tf.get_variable()為變量名指定命名空間.
在上一篇文章中,我們已經有用到這兩個方法,這一篇我們聚焦在這兩方法的具體說明上。
tf.get_variable方法在創建初始化變量的時候與tf.Variable是完全一樣的。
不過tf.get_variable可以通過tf.variable_scope生成的上下文管理器獲取已經生成的變量值。
eg1:
import tensorflow as tf with tf.variable_scope("foo"): v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) with tf.variable_scope("foo"): v=tf.get_variable("v",[1])
執行這段代碼,會報錯。因為在命名空間foo中,name為v的變量已經存在。
在聲明命名空間的時候,將reuse設置為True,這樣tf.get_variable將直接獲取已經聲明的變量。
eg2:
import tensorflow as tf with tf.variable_scope("foo"): v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) with tf.variable_scope("foo", reuse=True): v1=tf.get_variable("v",[1]) print(v==v1);
執行這段代碼,輸出為True
不過,reuse定義為True的時候,tf.get_variable只能獲取已經擁有的變量。如果命名空間中沒有定義這個變量就會報錯。
比如講上面代碼的第二個命名空間名字改為bar再次執行就會報錯。
eg3:
import tensorflow as tf with tf.variable_scope("foo"): v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) with tf.variable_scope("bar", reuse=True): v1=tf.get_variable("v",[1]) print(v==v1);
執行這段代碼會報錯。
變量管理器還可以通過名稱輕松訪問變量。
eg4:
import tensorflow as tf with tf.variable_scope("foo"): v = tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) print(v.name) with tf.variable_scope("foo"): with tf.variable_scope("bar"): v1 = tf.get_variable("v",[1]) print(v1.name); with tf.variable_scope("",reuse=True): v2 = tf.get_variable("foo/v"); print(v2==v) print(v2==v1) v3 = tf.get_variable("foo/bar/v") print(v3==v) print(v3==v1)
輸出結果:
foo/v:0 foo/bar/v:0 True False False True
靈活的使用變量管理器我們可以在復雜的神經網絡結構中大大的提高代碼的可讀性。
了解了tf.variable_scope 和 tf.get_variable的作用和用法以後,再回過頭讀讀之前的代碼,領悟一下他們在神經網絡結構中發揮了怎樣的作用。
參考鏈接
http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/variable_scope.html
《Tensorflow+實戰Google深度學習框架》5.3節
TensorFlow 變量作用域 變量管理 共享變量