Разница между переменной и получить переменную в Тензорном потоке


насколько я знаю, Variable - Это операция по умолчанию для создания переменной, и get_variable главным образом использовано для разделения веса.

С одной стороны, есть некоторые люди, предлагающие использовать get_variable вместо примитивного Variable операция всякий раз, когда вам нужна переменная. С другой стороны, я просто вижу какую-то пользу get_variable в официальных документах и демо TensorFlow.

Я хочу знать некоторые правила о том, как правильно использовать эти два механизма. Являются есть какие-то" стандартные " принципы?
3 87

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.

Я могу найти два основных различия между одним и другим:

  1. первый заключается в том, что tf.Variable всегда будет создавать новую переменную, будь то tf.get_variable получает из графика существующую переменную с этими параметрами, а если она не существует, то создает новую.

  2. 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"