Разница между переменной и получить переменную в Тензорном потоке
насколько я знаю, Variable
- Это операция по умолчанию для создания переменной, и get_variable
главным образом использовано для разделения веса.
С одной стороны, есть некоторые люди, предлагающие использовать get_variable
вместо примитивного Variable
операция всякий раз, когда вам нужна переменная. С другой стороны, я просто вижу какую-то пользу get_variable
в официальных документах и демо TensorFlow.
3 ответа:
Я бы рекомендовал всегда использовать
tf.get_variable(...)
-- Это упростит рефакторинг вашего кода, если вам нужно поделиться переменными в любое время, например, в настройках с несколькими gpu (см. Пример CIFAR с несколькими gpu). В этом нет никакого недостатка.чисто
tf.Variable
является более низким уровнем; в какой-то моментtf.get_variable()
не существует, поэтому некоторый код все еще использует низкоуровневый способ.
tf.Переменная-это класс, и существует несколько способов создания tf.Переменной, включая ТФ.Переменная.__ init__ и tf.get_variable.
tf.Переменная.__init__: создает новую переменную с помощью initial_value.
W = tf.Variable(<initial-value>, name=<optional-name>)
tf.get_variable: возвращает существующую переменную с этими параметрами или создает новую. Вы также можете использовать инициализатор.
W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None, regularizer=None, trainable=True, collections=None)
очень полезно использовать инициализаторы, такие как xavier_initializer:
W = tf.get_variable("W", shape=[784, 256], initializer=tf.contrib.layers.xavier_initializer())
дополнительная информация на https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable.
Я могу найти два основных различия между одним и другим:
первый заключается в том, что
tf.Variable
всегда будет создавать новую переменную, будь тоtf.get_variable
получает из графика существующую переменную с этими параметрами, а если она не существует, то создает новую.
tf.Variable
требуется указать начальное значение.важно уточнить, что функция
tf.get_variable
префиксы имя с текущая область переменных для выполнения проверок повторного использования. Например: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
последняя ошибка утверждения интересна: две переменные с одинаковым именем в одной и той же области должны быть одной и той же переменной. Но если вы проверяете имена переменных
d
иe
вы поймете, что Tensorflow изменил имя переменнойe
:d.name #d.name == "two/v:0" e.name #e.name == "two/v_1:0"