Zapisz datę! Google I / O powraca w dniach 18-20 maja Zarejestruj się teraz
Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Wprowadzenie do zmiennych

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło w serwisie GitHub Pobierz notatnik

Zmienna TensorFlow to zalecany sposób reprezentowania współużytkowanego, trwałego stanu, którym manipuluje program. W tym przewodniku opisano sposób tworzenia i aktualizowania wystąpień tf.Variable w TensorFlow oraz zarządzania nimi.

Zmienne są tworzone i śledzone za pomocą klasy tf.Variable . tf.Variable reprezentuje tensor, którego wartość można zmienić, uruchamiając na nim tf.Variable . Poszczególne operacje pozwalają odczytywać i modyfikować wartości tego tensora. Biblioteki wyższego poziomu, takie jak tf.keras używają tf.Variable do przechowywania parametrów modelu.

Ustawiać

W tym notatniku omówiono rozmieszczenie zmiennych. Jeśli chcesz zobaczyć, na jakim urządzeniu są umieszczone twoje zmienne, odkomentuj tę linię.

import tensorflow as tf

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

Utwórz zmienną

Aby utworzyć zmienną, podaj wartość początkową. tf.Variable będą miały taką samą dtype jako wartość inicjalizacji.

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])

Zmienna wygląda i działa jak tensor i faktycznie jest strukturą danych wspieraną przez tf.Tensor . Podobnie jak tensory, mają one dtype i kształt i można je wyeksportować do 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.]]

Większość operacji tensorowych działa na zmiennych zgodnie z oczekiwaniami, chociaż zmienne nie mogą być przekształcane.

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)

Jak wspomniano powyżej, zmienne są wspierane przez tensory. Możesz ponownie przypisać tensor za pomocą tf.Variable.assign . tf.Variable.assign . Wywołanie assign (zwykle) nie przydziela nowego tensora; zamiast tego ponownie wykorzystuje się pamięć istniejącego tensora.

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: Shapes (2,) and (3,) are incompatible

Jeśli w operacjach używasz zmiennej, takiej jak tensor, zwykle będziesz operować na tensorze zapasowym.

Tworzenie nowych zmiennych z istniejących zmiennych powoduje powielenie tensorów zapasowych. Dwie zmienne nie będą współdzielić tej samej pamięci.

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.]

Cykle życia, nazywanie i oglądanie

W opartym na Pythonie tf.Variable instancja tf.Variable ma taki sam cykl życia, jak inne obiekty Pythona. Gdy nie ma odniesień do zmiennej, jest ona automatycznie zwalniana.

Zmiennym można również nadawać nazwy, które mogą pomóc w ich śledzeniu i debugowaniu. Możesz nadać dwóm zmiennym tę samą nazwę.

# 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)

Nazwy zmiennych są zachowywane podczas zapisywania i wczytywania modeli. Domyślnie zmienne w modelach automatycznie uzyskują unikalne nazwy zmiennych, więc nie musisz ich przypisywać samodzielnie, chyba że chcesz.

Chociaż zmienne są ważne dla różnicowania, niektóre zmienne nie będą wymagały różnicowania. Możesz wyłączyć gradienty dla zmiennej, ustawiając trainable na fałsz podczas tworzenia. Przykładem zmiennej, która nie wymagałaby gradientów, jest licznik kroków treningowych.

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

Umieszczanie zmiennych i tensorów

Aby uzyskać lepszą wydajność, TensorFlow spróbuje umieścić tensory i zmienne w najszybszym urządzeniu zgodnym z jego dtype . Oznacza to, że większość zmiennych jest umieszczana na GPU, jeśli jest dostępny.

Możesz jednak to zmienić. W tym fragmencie umieść tensor typu float i zmienną na procesorze, nawet jeśli GPU jest dostępny. Włączając rejestrowanie rozmieszczenia urządzeń (patrz Konfiguracja ), można zobaczyć, gdzie jest umieszczona zmienna.

Jeśli uruchomisz ten notebook na różnych backendach z GPU i bez niego, zobaczysz inne rejestrowanie. Należy pamiętać, że na początku sesji należy włączyć rejestrowanie rozmieszczenia urządzeń.

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)

Możliwe jest ustawienie lokalizacji zmiennej lub tensora na jednym urządzeniu i wykonanie obliczeń na innym urządzeniu. Spowoduje to opóźnienie, ponieważ dane muszą być kopiowane między urządzeniami.

Możesz to jednak zrobić, jeśli masz wielu procesorów graficznych, ale chcesz mieć tylko jedną kopię zmiennych.

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)

Więcej informacji na temat szkoleń rozproszonych można znaleźć w naszym przewodniku .

Następne kroki

Aby zrozumieć, jak zwykle używane są zmienne, zapoznaj się z naszym przewodnikiem po automatycznym różnicowaniu .