O Dia da Comunidade de ML é dia 9 de novembro! Junte-nos para atualização de TensorFlow, JAX, e mais Saiba mais

Introdução às Variáveis

Ver no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

A TensorFlow variável é a maneira recomendada para representar compartilhada, estado persistente seus manipula programa. Este guia aborda como criar, atualizar e gerenciar instâncias de tf.Variable em TensorFlow.

As variáveis são criadas e controladas através do tf.Variable classe. A tf.Variable representa um tensor cujo valor pode ser alterado através da execução ops nele. Operações específicas permitem que você leia e modifique os valores deste tensor. Bibliotecas de alto nível como tf.keras usar tf.Variable aos parâmetros de loja modelo.

Configurar

Este caderno discute o posicionamento variável. Se você deseja ver em qual dispositivo suas variáveis ​​são colocadas, descomente esta linha.

import tensorflow as tf

# Uncomment to see where your variables get placed (see below)
# tf.debugging.set_log_device_placement(True)

Crie uma variável

Para criar uma variável, forneça um valor inicial. O tf.Variable terá o mesmo dtype como o valor de inicialização.

my_tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
my_variable = tf.Variable(my_tensor)

# Variables can be all kinds of types, just like tensors
bool_variable = tf.Variable([False, False, False, True])
complex_variable = tf.Variable([5 + 4j, 6 + 1j])

A aparência variáveis e age como um tensor, e, na verdade, é uma estrutura de dados apoiado por uma tf.Tensor . Como tensores, eles têm uma dtype e uma forma, e podem ser exportados para NumPy.

print("Shape: ", my_variable.shape)
print("DType: ", my_variable.dtype)
print("As NumPy: ", my_variable.numpy())
Shape:  (2, 2)
DType:  <dtype: 'float32'>
As NumPy:  [[1. 2.]
 [3. 4.]]

A maioria das operações de tensor funcionam em variáveis ​​conforme o esperado, embora as variáveis ​​não possam ser remodeladas.

print("A variable:", my_variable)
print("\nViewed as a tensor:", tf.convert_to_tensor(my_variable))
print("\nIndex of highest value:", tf.argmax(my_variable))

# This creates a new tensor; it does not reshape the variable.
print("\nCopying and reshaping: ", tf.reshape(my_variable, [1,4]))
A variable: <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>

Viewed as a tensor: tf.Tensor(
[[1. 2.]
 [3. 4.]], shape=(2, 2), dtype=float32)

Index of highest value: tf.Tensor([1 1], shape=(2,), dtype=int64)

Copying and reshaping:  tf.Tensor([[1. 2. 3. 4.]], shape=(1, 4), dtype=float32)

Conforme observado acima, as variáveis ​​são apoiadas por tensores. Pode atribuir novamente o tensor usando tf.Variable.assign . Chamando assign não (normalmente) alocar um novo tensor; em vez disso, a memória do tensor existente é reutilizada.

a = tf.Variable([2.0, 3.0])
# This will keep the same dtype, float32
a.assign([1, 2]) 
# Not allowed as it resizes the variable: 
try:
  a.assign([1.0, 2.0, 3.0])
except Exception as e:
  print(f"{type(e).__name__}: {e}")
ValueError: Cannot assign to variable Variable:0 due to variable shape (2,) and value shape (3,) are incompatible

Se você usar uma variável como um tensor em operações, normalmente operará no tensor de apoio.

A criação de novas variáveis ​​a partir de variáveis ​​existentes duplica os tensores de apoio. Duas variáveis ​​não compartilharão a mesma memória.

a = tf.Variable([2.0, 3.0])
# Create b based on the value of a
b = tf.Variable(a)
a.assign([5, 6])

# a and b are different
print(a.numpy())
print(b.numpy())

# There are other versions of assign
print(a.assign_add([2,3]).numpy())  # [7. 9.]
print(a.assign_sub([7,9]).numpy())  # [0. 0.]
[5. 6.]
[2. 3.]
[7. 9.]
[0. 0.]

Ciclos de vida, nomenclatura e observação

Em TensorFlow baseado em Python, tf.Variable exemplo têm o mesmo ciclo de vida como outros objectos Python. Quando não há referências a uma variável, ela é desalocada automaticamente.

As variáveis ​​também podem ser nomeadas, o que pode ajudá-lo a rastreá-las e depurá-las. Você pode dar o mesmo nome a duas variáveis.

# Create a and b; they will have the same name but will be backed by
# different tensors.
a = tf.Variable(my_tensor, name="Mark")
# A new variable with the same name, but different value
# Note that the scalar add is broadcast
b = tf.Variable(my_tensor + 1, name="Mark")

# These are elementwise-unequal, despite having the same name
print(a == b)
tf.Tensor(
[[False False]
 [False False]], shape=(2, 2), dtype=bool)

Os nomes das variáveis ​​são preservados ao salvar e carregar modelos. Por padrão, as variáveis ​​em modelos irão adquirir nomes de variáveis ​​exclusivos automaticamente, então você não precisa atribuí-los você mesmo, a menos que queira.

Embora as variáveis ​​sejam importantes para a diferenciação, algumas variáveis ​​não precisarão ser diferenciadas. Você pode desligar gradientes para uma variável, definindo trainable como false na criação. Um exemplo de uma variável que não precisaria de gradientes é um contador de passos de treinamento.

step_counter = tf.Variable(1, trainable=False)

Colocando variáveis ​​e tensores

Para um melhor desempenho, TensorFlow tentará tensores lugar e variáveis sobre o dispositivo mais rápido compatível com a sua dtype . Isso significa que a maioria das variáveis ​​são colocadas em uma GPU, se houver uma disponível.

No entanto, você pode substituir isso. Neste trecho, coloque um tensor flutuante e uma variável na CPU, mesmo se uma GPU estiver disponível. Ao transformar o registo de colocação do dispositivo (ver Setup ), você pode ver onde a variável é colocado.

Se você executar este notebook em diferentes back-ends com e sem uma GPU, verá logs diferentes. Observe que o posicionamento do dispositivo de registro deve ser ativado no início da sessão.

with tf.device('CPU:0'):

  # Create some tensors
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
  c = tf.matmul(a, b)

print(c)
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

É possível definir a localização de uma variável ou tensor em um dispositivo e fazer o cálculo em outro dispositivo. Isso introduzirá atrasos, pois os dados precisam ser copiados entre os dispositivos.

Você pode fazer isso, no entanto, se tiver vários trabalhos de GPU, mas quiser apenas uma cópia das variáveis.

with tf.device('CPU:0'):
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.Variable([[1.0, 2.0, 3.0]])

with tf.device('GPU:0'):
  # Element-wise multiply
  k = a * b

print(k)
tf.Tensor(
[[ 1.  4.  9.]
 [ 4. 10. 18.]], shape=(2, 3), dtype=float32)

Para saber mais sobre o treinamento distribuídos, consulte o nosso guia .

Próximos passos

Para entender como as variáveis são normalmente usados, consulte o nosso guia sobre a diferenciação automática .