Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Einführung in Variablen

Ansicht auf TensorFlow.org Führen Sie in Google Colab aus Quelle auf GitHub anzeigen Notizbuch herunterladen

Eine TensorFlow- Variable ist die empfohlene Methode, um den von Ihrem Programm manipulierten gemeinsamen, dauerhaften Status darzustellen. In diesem Handbuch wird beschrieben, wie Sie Instanzen von tf.Variable in TensorFlow erstellen, aktualisieren und verwalten.

Variablen werden über die Klasse tf.Variable erstellt und verfolgt. Eine tf.Variable stellt einen Tensor dar, dessen Wert durch Ausführen von ops geändert werden kann. Mit bestimmten Operationen können Sie die Werte dieses Tensors lesen und ändern. Übergeordnete Bibliotheken wie tf.keras verwenden tf.Variable zum Speichern von Modellparametern.

Konfiguration

In diesem Notizbuch wird die variable Platzierung erläutert. Wenn Sie sehen möchten, auf welchem ​​Gerät Ihre Variablen platziert sind, kommentieren Sie diese Zeile aus.

import tensorflow as tf

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

Erstellen Sie eine Variable

Geben Sie zum Erstellen einer Variablen einen Anfangswert an. Die tf.Variable hat denselben dtype wie der Initialisierungswert.

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

Eine Variable sieht aus und tf.Tensor wie ein Tensor und ist in der Tat eine Datenstruktur, die von einem tf.Tensor unterstützt wird. Wie Tensoren haben sie einen d- dtype und eine Form und können nach NumPy exportiert werden.

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

Die meisten Tensoroperationen arbeiten erwartungsgemäß mit Variablen, obwohl Variablen nicht umgeformt werden können.

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)

Wie oben erwähnt, werden Variablen durch Tensoren unterstützt. Sie können den Tensor mit tf.Variable.assign neu tf.Variable.assign . Das Aufrufen von assign weist (normalerweise) keinen neuen Tensor zu. Stattdessen wird der Speicher des vorhandenen Tensors wiederverwendet.

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

Wenn Sie in Operationen eine Variable wie einen Tensor verwenden, arbeiten Sie normalerweise mit dem Backing-Tensor.

Durch das Erstellen neuer Variablen aus vorhandenen Variablen werden die Backing-Tensoren dupliziert. Zwei Variablen teilen sich nicht den gleichen Speicher.

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

Lebenszyklen, Benennen und Beobachten

In Python-basiertem TensorFlow hat die tf.Variable Instanz denselben Lebenszyklus wie andere Python-Objekte. Wenn keine Verweise auf eine Variable vorhanden sind, wird die Zuordnung automatisch aufgehoben.

Es können auch Variablen benannt werden, mit denen Sie sie verfolgen und debuggen können. Sie können zwei Variablen denselben Namen geben.

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

Variablennamen bleiben beim Speichern und Laden von Modellen erhalten. Standardmäßig erhalten Variablen in Modellen automatisch eindeutige Variablennamen, sodass Sie sie nicht selbst zuweisen müssen, es sei denn, Sie möchten.

Obwohl Variablen für die Differenzierung wichtig sind, müssen einige Variablen nicht differenziert werden. Sie können Farbverläufe für eine Variable trainable , indem Sie trainable bei der Erstellung auf false setzen. Ein Beispiel für eine Variable, die keine Farbverläufe benötigt, ist ein Trainingsschrittzähler.

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

Variablen und Tensoren platzieren

Um eine bessere Leistung zu erzielen, versucht TensorFlow, Tensoren und Variablen auf dem schnellsten Gerät zu platzieren, das mit seinem dtype kompatibel ist. Dies bedeutet, dass die meisten Variablen auf einer GPU platziert werden, sofern eine verfügbar ist.

Sie können dies jedoch überschreiben. Platzieren Sie in diesem Snippet einen Float-Tensor und eine Variable auf der CPU, auch wenn eine GPU verfügbar ist. Durch Aktivieren der Geräteplatzierungsprotokollierung (siehe Setup ) können Sie sehen, wo die Variable platziert ist.

Wenn Sie dieses Notebook auf verschiedenen Backends mit und ohne GPU ausführen, wird eine unterschiedliche Protokollierung angezeigt. Beachten Sie, dass die Platzierung des Protokollierungsgeräts zu Beginn der Sitzung aktiviert sein muss.

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)

Es ist möglich, die Position einer Variablen oder eines Tensors auf einem Gerät festzulegen und die Berechnung auf einem anderen Gerät durchzuführen. Dies führt zu Verzögerungen, da Daten zwischen den Geräten kopiert werden müssen.

Sie können dies jedoch tun, wenn Sie mehrere GPU-Mitarbeiter hatten, aber nur eine Kopie der Variablen möchten.

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)

Weitere Informationen zu verteilten Schulungen finden Sie in unserem Leitfaden .

Nächste Schritte

Um zu verstehen, wie Variablen normalerweise verwendet werden, lesen Sie unseren Leitfaden zur automatischen Differenzierung .