Насколько мне известно, Variable
это операция по умолчанию для создания переменной и get_variable
в основном используется для распределения веса.
С одной стороны, некоторые люди предлагают использовать get_variable
вместо примитивной Variable
операции всякий раз, когда вам нужна переменная. С другой стороны, я просто вижу любое использование get_variable
TensorFlow в официальных документах и демонстрациях.
Таким образом, я хочу знать несколько практических правил о том, как правильно использовать эти два механизма. Есть какие-то «стандартные» принципы?
python
tensorflow
Лифу Хуанг
источник
источник
Ответы:
Я бы рекомендовал всегда использовать
tf.get_variable(...)
- это упростит рефакторинг вашего кода, если вам нужно поделиться переменными в любое время, например, в настройке с несколькими графическими процессорами (см. Пример CIFAR с несколькими графическими процессорами). В этом нет недостатков.Чистый
tf.Variable
- низший уровень; в какой-то моментtf.get_variable()
не существовало, поэтому некоторый код все еще использует низкоуровневый способ.источник
tf.Variable
наtf.get_variable
везде. То есть, когда я хочу инициализировать переменную массивом numpy, я не могу найти чистый и эффективный способ сделать это, как я делаю сtf.Variable
. Как решить эту проблему? Спасибо.tf.Variable - это класс, и есть несколько способов создать tf.Variable, включая
tf.Variable.__init__
иtf.get_variable
.tf.Variable.__init__
: Создает новую переменную с начальным_значением .tf.get_variable
: Получает существующую переменную с этими параметрами или создает новую. Вы также можете использовать инициализатор.Очень полезно использовать такие инициализаторы, как
xavier_initializer
:Больше информации здесь .
источник
Variable
самом деле я имею в виду его использование__init__
. Посколькуget_variable
это так удобно, мне интересно, почему большая часть кода TensorFlow, которую я видел, использовалаVariable
вместоget_variable
. Есть ли какие-либо условности или факторы, которые следует учитывать при выборе между ними. Спасибо!tf.Variable()
мы можем инициализировать его как случайное значение из усеченного нормального распределения. Вот мой примерw1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Что бы это было эквивалентно? как мне сказать, что я хочу усеченный нормальный? Я должен просто сделатьw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
для получения желаемого результата.Я могу найти два основных различия между одним и другим:
Во-первых,
tf.Variable
это всегда будет создавать новую переменную, тогда какtf.get_variable
получает существующую переменную с указанными параметрами из графика, а если она не существует, создает новую.tf.Variable
требует указания начального значения.Важно уточнить, что функция
tf.get_variable
ставит перед именем префикс текущей области видимости переменной для выполнения проверок повторного использования. Например:Интересна последняя ошибка утверждения: две переменные с одинаковыми именами в одной области видимости должны быть одной и той же переменной. Но если вы проверите имена переменных
d
иe
поймете, что Tensorflow изменил имя переменнойe
:источник
d.name
иe.name
, я только что наткнулся на этот документIf the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Другое отличие состоит в том, что один находится в
('variable_store',)
коллекции, а другой нет.Пожалуйста, посмотрите исходный код :
Позвольте мне проиллюстрировать это:
Выход:
источник