Что такое локальная переменная в тензорном потоке?
Tensorflow имеет этот API:
tf.local_variables()
Возвращает все переменные, созданные с помощью collection=[LOCAL_VARIABLES]
.
Возврат:
Список локальных объектов Variable.
Что такое локальная переменная в TensorFlow? Может ли кто-нибудь дать мне пример?
Ответы
Ответ 1
Это то же самое, что и обычная переменная, но в другой коллекции, чем по умолчанию (GraphKeys.VARIABLES
). Эта коллекция используется заставкой для инициализации списка сохраняемых по умолчанию списков переменных, поэтому присвоение local
имеет эффект не сохранения этой переменной по умолчанию.
Я вижу только одно место, которое использует его в кодовой базе, это limit_epochs
with ops.name_scope(name, "limit_epochs", [tensor]) as name:
zero64 = constant_op.constant(0, dtype=dtypes.int64)
epochs = variables.Variable(
zero64, name="epochs", trainable=False,
collections=[ops.GraphKeys.LOCAL_VARIABLES])
Ответ 2
Короткий ответ: локальная переменная в TF - это любая переменная, которая была создана с помощью collections=[tf.GraphKeys.LOCAL_VARIABLES]
. Например:
e = tf.Variable(6, name='var_e', collections=[tf.GraphKeys.LOCAL_VARIABLES])
LOCAL_VARIABLES: подмножество объектов Variable, которые являются локальными для каждого машина. Обычно используется для временных переменных, например счетчиков. Заметка: используйте tf.contrib.framework.local_variable для добавления в эту коллекцию.
Обычно они не сохраняются/не восстанавливаются на контрольную точку и не используются для временных или промежуточных значений.
Длинный ответ:, это тоже путаница для меня. Вначале я думал, что локальные переменные означают то же, что и локальная переменная практически на любом языке программирования, но это не одно и то же:
import tensorflow as tf
def some_func():
z = tf.Variable(1, name='var_z')
a = tf.Variable(1, name='var_a')
b = tf.get_variable('var_b', 2)
with tf.name_scope('aaa'):
c = tf.Variable(3, name='var_c')
with tf.variable_scope('bbb'):
d = tf.Variable(3, name='var_d')
some_func()
some_func()
print [str(i.name) for i in tf.global_variables()]
print [str(i.name) for i in tf.local_variables()]
Независимо от того, что я пробовал, я всегда получал только глобальные переменные:
['var_a:0', 'var_b:0', 'aaa/var_c:0', 'bbb/var_d:0', 'var_z:0', 'var_z_1:0']
[]
Документация для tf.local_variables
не предоставила много деталей:
Локальные переменные - для переменных процесса, обычно не сохраняемых/восстановленных контрольной точки и используется для временных или промежуточных значений. Например, они могут использоваться как счетчики для вычисления показателей или количества эпох, эта машина прочитала данные. Локальный_переменный() автоматически добавляет новую переменную в GraphKeys.LOCAL_VARIABLES. Это удобство функция возвращает содержимое этой коллекции.
Но прочитав docs для метода init в классе tf.Variable, я обнаружил, что при создании переменной, вы можете указать, какую переменную вы хотите, назначив список collections
.
Список возможных элементов коллекции здесь. Поэтому для создания локальной переменной вам нужно сделать что-то вроде этого. Вы увидите его в списке local_variables
:
e = tf.Variable(6, name='var_e', collections=[tf.GraphKeys.LOCAL_VARIABLES])
print [str(i.name) for i in tf.local_variables()]
Ответ 3
Думаю, здесь требуется понимание коллекций TensorFlow.
TensorFlow предоставляет коллекции, которые называются списками тензоров или других объектов, например tf.Variable
экземпляры.
Ниже приведены коллекции в сборке:
tf.GraphKeys.GLOBAL_VARIABLES #=> 'variables'
tf.GraphKeys.LOCAL_VARIABLES #=> 'local_variables'
tf.GraphKeys.MODEL_VARIABLES #=> 'model_variables'
tf.GraphKeys.TRAINABLE_VARIABLES #=> 'trainable_variables'
В общем, во время создания переменной он может быть добавлен в данный сбор, явно передавая этот сбор в качестве одного из коллекций, переданных аргументу collections
.
Теоретически переменная может быть в любой комбинации встроенных или пользовательских коллекций. Но коллекции в сборке используются для конкретных целей:
-
tf.GraphKeys.GLOBAL_VARIABLES
: - Конструктор
Variable()
или get_variable()
автоматически добавляет новые переменные в набор графов GraphKeys.GLOBAL_VARIABLES
, если аргумент collections
явно не передан и не включает GLOBAL_VARIABLE
. - По соглашению эти переменные распределяются между распределенными средами (модельные переменные являются их подмножествами).
- Дополнительную
tf.global_variables()
см. В разделе tf.global_variables()
.
-
tf.GraphKeys.TRAINABLE_VARIABLES
: - При передаче
trainable=True
(по умолчанию это поведение) конструктор Variable()
и get_variable()
автоматически добавляет новые переменные в эту коллекцию графов. Но, конечно, вы можете использовать аргумент collections
чтобы добавить переменную к любой требуемой коллекции. - По соглашению, это переменные, которые будут обучены оптимизатором.
- Дополнительную
tf.trainable_variables()
см. В разделе tf.trainable_variables()
.
-
tf.GraphKeys.LOCAL_VARIABLES
: - Вы можете использовать
tf.contrib.framework.local_variable()
для добавления в эту коллекцию. Но, конечно, вы можете использовать аргумент collections
для добавления переменной в любую нужную коллекцию. - По соглашению, это переменные, которые являются локальными для каждой машины. Они относятся к переменным процесса, обычно не сохраняются/не восстанавливаются до контрольной точки и не используются для временных или промежуточных значений. Например, они могут использоваться как счетчики для вычисления показателей или количества эпох, которые эта машина считывала.
- Дополнительную
tf.local_variables()
см. В разделе tf.local_variables()
.
-
tf.GraphKeys.MODEL_VARIABLES
:
Вы также можете использовать свои собственные коллекции. Любая строка является допустимым именем коллекции, и нет необходимости явно создавать коллекцию. Чтобы добавить переменную (или любой другой объект) в коллекцию после создания переменной, вызовите tf.add_to_collection()
.
Например,
tf.__version__ #=> '1.9.0'
# initializing using a Tensor
my_variable01 = tf.get_variable("var01", dtype=tf.int32, initializer=tf.constant([23, 42]))
# initializing using a convenient initializer
my_variable02 = tf.get_variable("var02", shape=[1, 2, 3], dtype=tf.int32, initializer=tf.zeros_initializer)
my_variable03 = tf.get_variable("var03", dtype=tf.int32, initializer=tf.constant([1, 2]), trainable=None)
my_variable04 = tf.get_variable("var04", dtype=tf.int32, initializer=tf.constant([3, 4]), trainable=False)
my_variable05 = tf.get_variable("var05", shape=[1, 2, 3], dtype=tf.int32, initializer=tf.ones_initializer, trainable=True)
my_variable06 = tf.get_variable("var06", dtype=tf.int32, initializer=tf.constant([5, 6]), collections=[tf.GraphKeys.LOCAL_VARIABLES], trainable=None)
my_variable07 = tf.get_variable("var07", dtype=tf.int32, initializer=tf.constant([7, 8]), collections=[tf.GraphKeys.LOCAL_VARIABLES], trainable=True)
my_variable08 = tf.get_variable("var08", dtype=tf.int32, initializer=tf.constant(1), collections=[tf.GraphKeys.MODEL_VARIABLES], trainable=None)
my_variable09 = tf.get_variable("var09", dtype=tf.int32, initializer=tf.constant(2), collections=[tf.GraphKeys.GLOBAL_VARIABLES, tf.GraphKeys.LOCAL_VARIABLES, tf.GraphKeys.MODEL_VARIABLES, tf.GraphKeys.TRAINABLE_VARIABLES, "my_collectio
n"])
my_variable10 = tf.get_variable("var10", dtype=tf.int32, initializer=tf.constant(3), collections=["my_collection"], trainable=True)
[var.name for var in tf.global_variables()] #=> ['var01:0', 'var02:0', 'var03:0', 'var04:0', 'var05:0', 'var09:0']
[var.name for var in tf.local_variables()] #=> ['var06:0', 'var07:0', 'var09:0']
[var.name for var in tf.trainable_variables()] #=> ['var01:0', 'var02:0', 'var05:0', 'var07:0', 'var09:0', 'var10:0']
[var.name for var in tf.model_variables()] #=> ['var08:0', 'var09:0']
[var.name for var in tf.get_collection("trainable_variables")] #=> ['var01:0', 'var02:0', 'var05:0', 'var07:0', 'var09:0', 'var10:0']
[var.name for var in tf.get_collection("my_collection")] #=> ['var09:0', 'var10:0']