Переменные TensorFlow

Переменная TensorFlow является лучшим способом представления совместно используемого постоянного состояния, которым манипулирует ваша программа.

Переменные обрабатываются с помощью класса tf.Variable. Tf.Variable представляет тензор, значение которого можно изменить, запустив на нем операции. Определенные операции позволяют вам читать и изменять значения этого тензора. Библиотеки более высокого уровня, такие как tf.keras, используют tf.Variable для хранения параметров модели. В этом руководстве рассказывается, как создавать, обновлять и управлять перемменными tf.Variable в TensorFlow.

Созадние переменной

Чтобы создать переменную просто задайте начальное значение

my_variable = tf.Variable(tf.zeros([1., 2., 3.]))

Это создаст переменную являющуюся трехмерным тензором с размерностью [1, 2, 3] заполненную нулями. Эта переменная по умолчанию имеет dtype tf.float32. Если dtype не указан, то он выводится из исходного значения.

Если имеется активная область действия tf.device, переменная будет помещена на это устройство; в противном случае переменная будет помещена в «самое быстрое» устройство, совместимое с его dtype (это означает, что большинство переменных автоматически помещаются на GPU, если таковое имеется). Например, следующий фрагмент кода создает переменную с именем v и помещает ее на второе GPU устройство:

with tf.device("/device:GPU:1"):
  v = tf.Variable(tf.zeros([10, 10]))

В идеале, вам необходимо использовать API tf.distribute, так как это дает вам возможность написать свой код один раз так, что он будет работать во многих различных распределенных системах.

Использование переменной

Чтобы использовать значение tf.Variable в графе TensorFlow, просто обработайте его как обычный tf.Tensor:

v = tf.Variable(0.0)
w = v + 1  # w это tf.Tensor который вычисляется на базе значения v.
           # Каждый раз когда в выражении используется переменная она автоматически
           # конвертируется в tf.Tensor представляющи его значение.

Чтобы присвоить значение переменной, используйте методы assign, assign_add в классе tf.Variable. Например, вот как вы можете вызвать эти методы:

v = tf.Variable(0.0)
v.assign_add(1)

У большинство оптимизаторов TensorFlow есть специализированные операции которые эффективно обновляют значения переменных в соотвествии с алгоритмами подобными градиентному спуску. См. tf.keras.optimizers.Optimizer для объяснения того, как использовать оптимизаторы.

Вы также можете явно прочитать текущее значение переменной, используя read_value:

v = tf.Variable(0.0)
v.assign_add(1)
v.read_value()  # 1.0

Когда последняя ссылка на tf.Variable выходит из области видимости, ее память освобождается.

Отслеживание переменных

Variable в TensorFlow это объект Python. Поскольку вы строите свои слои, модели, оптимизаторы, и другие связанные инструменты, вы, вероятно, захотите получить список всех переменных в (скажем) модели.

Типичный пример использования реализация подклассов Layer. Класс Layer рекурсивно отслеживает набор переменных как аттрибуты экземпляра:

class MyLayer(tf.keras.layers.Layer):

  def __init__(self):
    super(MyLayer, self).__init__()
    self.my_var = tf.Variable(1.0)
    self.my_var_list = [tf.Variable(x) for x in range(10)]

class MyOtherLayer(tf.keras.layers.Layer):

  def __init__(self):
    super(MyOtherLayer, self).__init__()
    self.sublayer = MyLayer()
    self.my_other_var = tf.Variable(10.0)

m = MyOtherLayer()
print(len(m.variables))  # 12 (11 с MyLayer, плюс my_other_var)

Если вы не разрабатываете новый Layer, у TensorFlow также есть более общий базовый класс tf.Module, который только реализует отслеживание переменных. У экземпляров tf.Module есть свойства variable и trainable_variables, которые возвращают все (обучаемые) переменные, достижимые из этой модели, потенциально перемещаясь через другие модули (во многом как отслеживание, выполняемое классом Layer).