1. 程式人生 > >tensorflow學習筆記(二十三):variable與get_variable

tensorflow學習筆記(二十三):variable與get_variable

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)

區別

  1. 使用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?
  1. 基於這兩個函式的特性,當我們需要共享變數的時候,需要使用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)