Einführung in Variablen

Auf TensorFlow.org ansehen In Google Colab ausführen Quelle auf GitHub anzeigen Notizbuch herunterladen

Ein TensorFlow Variable ist der empfohlene Weg, persistenter Zustand Ihres Programm manipuliert repräsentieren geteilt. Dieser Leitfaden behandelt , wie zum Erstellen, Aktualisieren und Verwalten von Instanzen von tf.Variable in TensorFlow.

Variablen erstellt und über die Ketten tf.Variable Klasse. Ein tf.Variable stellt einen Tensor , dessen Wert durch Ausführen ops auf ihm geändert werden. Bestimmte Operationen ermöglichen es Ihnen, die Werte dieses Tensors zu lesen und zu ändern. Higher level Bibliotheken wie tf.keras verwenden tf.Variable zum Speichern von Modellparametern.

Aufstellen

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

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

Um eine Variable zu erstellen, geben Sie einen Anfangswert an. Die tf.Variable das gleiche hat dtype als 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 Aussehen und wirkt wie ein Tensor, und in der Tat ist eine Datenstruktur von einem gesicherten tf.Tensor . Wie Tensoren haben sie eine dtype und eine Form und kann auf 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 funktionieren wie erwartet 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 neu zuweisen tf.Variable.assign . Der Aufruf assign nicht ( in der Regel) einen neuen Tensor zuteilen; 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: Cannot assign to variable Variable:0 due to variable shape (2,) and value shape (3,) are incompatible

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

Beim Erstellen neuer Variablen aus vorhandenen Variablen werden die Stütztensoren dupliziert. Zwei Variablen teilen sich nicht denselben 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 Ansehen

In Python-basierte TensorFlow, tf.Variable haben etwa die gleiche Lebensdauer wie andere Python - Objekte. Wenn keine Verweise auf eine Variable vorhanden sind, wird die Zuordnung automatisch aufgehoben.

Variablen können auch benannt werden, um sie zu verfolgen und zu debuggen. 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 Steigungen für eine Variable deaktivieren , indem Sie trainable auf false bei der Schöpfung. Ein Beispiel für eine Variable, die keine Gradienten benötigt, ist ein Trainingsschrittzähler.

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

Platzieren von Variablen und Tensoren

Für eine bessere Leistung wird TensorFlow auf dem schnellsten Gerät Platz Tensoren und Variablen versuchen kompatibel mit dtype . Dies bedeutet, dass die meisten Variablen auf einer GPU platziert werden, falls 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 Einschalten Gerät Platzierung Protokollierung (siehe Setup - ) können Sie sehen , wo die Variable gesetzt wird.

Wenn Sie dieses Notebook auf verschiedenen Backends mit und ohne GPU ausführen, sehen Sie unterschiedliche Protokollierungen. Beachten Sie, dass die Platzierung von Protokollierungsgeräten 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-Worker haben, aber nur eine Kopie der Variablen wünschen.

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 über verteilte Ausbildung finden Sie unser Führer .

Nächste Schritte

Um zu verstehen , wie Variablen der Regel verwendet werden, finden Sie in unserem Leitfaden zur automatischen Differenzierung .