Подтвердить что ты не робот

Что такое локальная переменная в тензорном потоке?

Tensorflow имеет этот API:

tf.local_variables()

Возвращает все переменные, созданные с помощью collection=[LOCAL_VARIABLES].

Возврат:

Список локальных объектов Variable.

Что такое локальная переменная в TensorFlow? Может ли кто-нибудь дать мне пример?

4b9b3361

Ответ 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.contrib.framework.model_variable() для добавления в эту коллекцию. Но, конечно, вы можете использовать аргумент collections для добавления переменной в любую нужную коллекцию.
    • По соглашению, это переменные, которые используются в модели для вывода (вперед).
    • Дополнительную tf.model_variables() см. В разделе tf.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']