tensorflow scope命名方法(variable_scope()與name_scope()解析)
學習資料:
不同 scope 對比代碼
reuse variable RNN 代碼
sharing variable tensorflow 官網介紹
scope 能讓你命名變量的時候輕鬆很多. 同時也會在 reusing variable 代碼中常常見到. 所以今天我們會來討論下 tensorflow 當中的兩種定義 scope 的方式. 最後並附加一個 RNN 運用 reuse variable 的例子.
tf.name_scope()
tf.variable_scope()
RNN應用例子
tf.name_scope()
在 Tensorflow 當中有兩種途徑生成變量 variable, 一種是 tf.get_variable(), 另一種是 tf.Variable(). 如果在 tf.name_scope() 的框架下使用這兩種方式, 結果會如下.
import tensorflow as tf
with tf.name_scope("a_name_scope"):
initializer = tf.constant_initializer(value=1)
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initializer=initializer)
var2 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
var21 = tf.Variable(name='var2', initial_value=[2.1], dtype=tf.float32)
var22 = tf.Variable(name='var2', initial_value=[2.2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(var1.name) # var1:0
print(sess.run(var1)) # [ 1.]
print(var2.name) # a_name_scope/var2:0
print(sess.run(var2)) # [ 2.]
print(var21.name) # a_name_scope/var2_1:0
print(sess.run(var21)) # [ 2.0999999]
print(var22.name) # a_name_scope/var2_2:0
print(sess.run(var22)) # [ 2.20000005]
可以看出使用 tf.Variable() 定義的時候, 雖然 name 都一樣, 但是爲了不重複變量名, Tensorflow 輸出的變量名並不是一樣的. 所以, 本質上 var2, var21, var22 並不是一樣的變量. 而另一方面, 使用tf.get_variable()定義的變量不會被tf.name_scope()當中的名字所影響.
tf.variable_scope()
如果想要達到重複利用變量的效果, 我們就要使用 tf.variable_scope(), 並搭配 tf.get_variable() 這種方式產生和提取變量. 不像 tf.Variable() 每次都會產生新的變量, tf.get_variable() 如果遇到了同樣名字的變量時, 它會單純的提取這個同樣名字的變量(避免產生新變量). 而在重複使用的時候, 一定要在代碼中強調 scope.reuse_variables(), 否則系統將會報錯, 以爲你只是單純的不小心重複使用到了一個變量.
with tf.variable_scope("a_variable_scope") as scope:
initializer = tf.constant_initializer(value=3)
var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer)
scope.reuse_variables()
var3_reuse = tf.get_variable(name='var3',)
var4 = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
var4_reuse = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var3.name) # a_variable_scope/var3:0
print(sess.run(var3)) # [ 3.]
print(var3_reuse.name) # a_variable_scope/var3:0
print(sess.run(var3_reuse)) # [ 3.]
print(var4.name) # a_variable_scope/var4:0
print(sess.run(var4)) # [ 4.]
print(var4_reuse.name) # a_variable_scope/var4_1:0
print(sess.run(var4_reuse)) # [ 4.]
RNN 應用例子
RNN 例子的代碼在這裏, 整個 RNN 的結構已經在這裏定義好了. 在 training RNN 和 test RNN 的時候, RNN 的 time_steps 會有不同的取值, 這將會影響到整個 RNN 的結構, 所以導致在 test 的時候, 不能單純地使用 training 時建立的那個 RNN. 但是 training RNN 和 test RNN 又必須是有同樣的 weights biases 的參數. 所以, 這時, 就是使用 reuse variable 的好時機.
首先定義training 和 test 的不同參數.
class TrainConfig:
batch_size = 20
time_steps = 20
input_size = 10
output_size = 2
cell_size = 11
learning_rate = 0.01
class TestConfig(TrainConfig):
time_steps = 1
train_config = TrainConfig()
test_config = TestConfig()
然後讓 train_rnn 和 test_rnn 在同一個 tf.variable_scope('rnn') 之下. 並且定義 scope.reuse_variables(), 使我們能把 train_rnn 的所有 weights, biases 參數全部綁定到 test_rnn 中. 這樣, 不管兩者的 time_steps 有多不同, 結構有多不同, train_rnnW, b 參數更新成什麼樣, test_rnn 的參數也更新成什麼樣.
with tf.variable_scope('rnn') as scope:
sess = tf.Session()
train_rnn = RNN(train_config)
scope.reuse_variables()
test_rnn = RNN(test_config)
sess.run(tf.global_variables_initializer())
原文:http://www.360doc.com/content/17/0426/16/42378447_648845201.shtml
不同 scope 對比代碼
reuse variable RNN 代碼
sharing variable tensorflow 官網介紹
scope 能讓你命名變量的時候輕鬆很多. 同時也會在 reusing variable 代碼中常常見到. 所以今天我們會來討論下 tensorflow 當中的兩種定義 scope 的方式. 最後並附加一個 RNN 運用 reuse variable 的例子.
tf.name_scope()
tf.variable_scope()
RNN應用例子
tf.name_scope()
在 Tensorflow 當中有兩種途徑生成變量 variable, 一種是 tf.get_variable(), 另一種是 tf.Variable(). 如果在 tf.name_scope() 的框架下使用這兩種方式, 結果會如下.
import tensorflow as tf
with tf.name_scope("a_name_scope"):
initializer = tf.constant_initializer(value=1)
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initializer=initializer)
var2 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
var21 = tf.Variable(name='var2', initial_value=[2.1], dtype=tf.float32)
var22 = tf.Variable(name='var2', initial_value=[2.2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(var1.name) # var1:0
print(sess.run(var1)) # [ 1.]
print(var2.name) # a_name_scope/var2:0
print(sess.run(var2)) # [ 2.]
print(var21.name) # a_name_scope/var2_1:0
print(sess.run(var21)) # [ 2.0999999]
print(var22.name) # a_name_scope/var2_2:0
print(sess.run(var22)) # [ 2.20000005]
可以看出使用 tf.Variable() 定義的時候, 雖然 name 都一樣, 但是爲了不重複變量名, Tensorflow 輸出的變量名並不是一樣的. 所以, 本質上 var2, var21, var22 並不是一樣的變量. 而另一方面, 使用tf.get_variable()定義的變量不會被tf.name_scope()當中的名字所影響.
tf.variable_scope()
如果想要達到重複利用變量的效果, 我們就要使用 tf.variable_scope(), 並搭配 tf.get_variable() 這種方式產生和提取變量. 不像 tf.Variable() 每次都會產生新的變量, tf.get_variable() 如果遇到了同樣名字的變量時, 它會單純的提取這個同樣名字的變量(避免產生新變量). 而在重複使用的時候, 一定要在代碼中強調 scope.reuse_variables(), 否則系統將會報錯, 以爲你只是單純的不小心重複使用到了一個變量.
with tf.variable_scope("a_variable_scope") as scope:
initializer = tf.constant_initializer(value=3)
var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer)
scope.reuse_variables()
var3_reuse = tf.get_variable(name='var3',)
var4 = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
var4_reuse = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var3.name) # a_variable_scope/var3:0
print(sess.run(var3)) # [ 3.]
print(var3_reuse.name) # a_variable_scope/var3:0
print(sess.run(var3_reuse)) # [ 3.]
print(var4.name) # a_variable_scope/var4:0
print(sess.run(var4)) # [ 4.]
print(var4_reuse.name) # a_variable_scope/var4_1:0
print(sess.run(var4_reuse)) # [ 4.]
RNN 應用例子
RNN 例子的代碼在這裏, 整個 RNN 的結構已經在這裏定義好了. 在 training RNN 和 test RNN 的時候, RNN 的 time_steps 會有不同的取值, 這將會影響到整個 RNN 的結構, 所以導致在 test 的時候, 不能單純地使用 training 時建立的那個 RNN. 但是 training RNN 和 test RNN 又必須是有同樣的 weights biases 的參數. 所以, 這時, 就是使用 reuse variable 的好時機.
首先定義training 和 test 的不同參數.
class TrainConfig:
batch_size = 20
time_steps = 20
input_size = 10
output_size = 2
cell_size = 11
learning_rate = 0.01
class TestConfig(TrainConfig):
time_steps = 1
train_config = TrainConfig()
test_config = TestConfig()
然後讓 train_rnn 和 test_rnn 在同一個 tf.variable_scope('rnn') 之下. 並且定義 scope.reuse_variables(), 使我們能把 train_rnn 的所有 weights, biases 參數全部綁定到 test_rnn 中. 這樣, 不管兩者的 time_steps 有多不同, 結構有多不同, train_rnnW, b 參數更新成什麼樣, test_rnn 的參數也更新成什麼樣.
with tf.variable_scope('rnn') as scope:
sess = tf.Session()
train_rnn = RNN(train_config)
scope.reuse_variables()
test_rnn = RNN(test_config)
sess.run(tf.global_variables_initializer())
原文:http://www.360doc.com/content/17/0426/16/42378447_648845201.shtml
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.