tensorflow學習筆記(二十三):variable與get_variable
阿新 • • 發佈:2019-01-28
Variable
tensorflow中有兩個關於variable的op,tf.Variable()
與tf.get_variable()
下面介紹這兩個的區別
tf.Variable與tf.get_variable()
tf.Variable(initial_value=None, trainable=True, collections=None, validate_shape=True,
caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None,
import_scope=None )
tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None,
trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True,
custom_getter=None)
區別
- 使用
tf.Variable
時,如果檢測到命名衝突,系統會自己處理。使用tf.get_variable()
時,系統不會處理衝突,而會報錯
import tensorflow as tf
w_1 = tf.Variable(3 ,name="w_1")
w_2 = tf.Variable(1,name="w_1")
print w_1.name
print w_2.name
#輸出
#w_1:0
#w_1_1:0
import tensorflow as tf
w_1 = tf.get_variable(name="w_1",initializer=1)
w_2 = tf.get_variable(name="w_1",initializer=2)
#錯誤資訊
#ValueError: Variable w_1 already exists, disallowed. Did
#you mean to set reuse=True in VarScope?
- 基於這兩個函式的特性,當我們需要共享變數的時候,需要使用
tf.get_variable()
。在其他情況下,這兩個的用法是一樣的
get_variable()與Variable的實質區別
來看下面一段程式碼:
import tensorflow as tf
with tf.variable_scope("scope1"):
w1 = tf.get_variable("w1", shape=[])
w2 = tf.Variable(0.0, name="w2")
with tf.variable_scope("scope1", reuse=True):
w1_p = tf.get_variable("w1", shape=[])
w2_p = tf.Variable(1.0, name="w2")
print(w1 is w1_p, w2 is w2_p)
#輸出
#True False
看到這,就可以明白官網上說的引數複用的真面目了。由於tf.Variable()
每次都在建立新物件,所有reuse=True
和它並沒有什麼關係。對於get_variable()
,來說,如果已經建立的變數物件,就把那個物件返回,如果沒有建立變數物件的話,就建立一個新的。
random Tensor
可用於賦值給tf.Variable()
的第一個引數
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
tf.random_shuffle(value, seed=None, name=None)
tf.random_crop(value, size, seed=None, name=None)
tf.multinomial(logits, num_samples, seed=None, name=None)
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)
tf.set_random_seed(seed)
constant value tensor
tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(tensor, dtype=None, name=None)
tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(tensor, dtype=None, name=None)
tf.fill(dims, value, name=None)
tf.constant(value, dtype=None, shape=None, name='Const')
initializer
tf.constant_initializer(value=0, dtype=tf.float32)
tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
tf.truncated_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
tf.random_uniform_initializer(minval=0, maxval=None, seed=None, dtype=tf.float32)
tf.uniform_unit_scaling_initializer(factor=1.0, seed=None, dtype=tf.float32)
tf.zeros_initializer(shape, dtype=tf.float32, partition_info=None)
tf.ones_initializer(dtype=tf.float32, partition_info=None)
tf.orthogonal_initializer(gain=1.0, dtype=tf.float32, seed=None)