znajdę dwie główne różnice między jednym a drugim:
pierwsze, tf.Variable
zawsze utworzyć nową zmienną, czy tf.get_variable
dostaje z wykresu istniejącą zmienną z tych parametrów, a jeśli nie istnieje, tworzy nowy.
tf.Variable
wymaga podania wartości początkowej.
Ważne jest, aby wyjaśnić, że funkcja tf.get_variable
prefiksy nazwie pod bieżącym zakresie zmiennej o przeprowadzenie kontroli wykorzystania. Na przykład:
with tf.variable_scope("one"):
a = tf.get_variable("v", [1]) #a.name == "one/v:0"
with tf.variable_scope("one"):
b = tf.get_variable("v", [1]) #ValueError: Variable one/v already exists
with tf.variable_scope("one", reuse = True):
c = tf.get_variable("v", [1]) #c.name == "one/v:0"
with tf.variable_scope("two"):
d = tf.get_variable("v", [1]) #d.name == "two/v:0"
e = tf.Variable(1, name = "v", expected_shape = [1]) #e.name == "two/v_1:0"
assert(a is c) #Assertion is true, they refer to the same object.
assert(a is d) #AssertionError: they are different objects
assert(d is e) #AssertionError: they are different objects
Ostatni błąd asercji jest interesujący: dwie zmienne o tej samej nazwie w tym samym zakresie mają być tą samą zmienną.Ale jeśli przetestować nazwy zmiennych d
i e
zdasz sobie sprawę, że Tensorflow zmienił nazwę zmiennej e
:
d.name #d.name == "two/v:0"
e.name #e.name == "two/v_1:0"
get_variable jest nowy sposób, zmienna jest stary sposób (który może być obsługiwany na zawsze), jak mówi Łukasz (PS : napisał dużo zmiennej o nazwie scoping w TF) –