Разница между переменной и получить переменную в Тензорном потоке
насколько я знаю, 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"