TensorFlow Tensoroperationen
Tensoren sind die zentrale Datenstruktur in TensorFlow und können als Erweiterung des Konzepts mehrdimensionaler Arrays verstanden werden.
Im maschinellen Lernen werden fast alle Daten letztlich in Tensorform zur Verarbeitung repräsentiert.
Grundlegende Eigenschaften von Tensoren
- Datentyp (dtype): Jeder Tensor hat einen bestimmten Datentyp, wie tf.float32, tf.int64 usw.
- Form: Repräsentiert die Größe jeder Dimension des Tensors, z. B. (2,3) repräsentiert eine Matrix mit 2 Zeilen und 3 Spalten.
- Geräteposition: Gibt an, ob der Tensor auf CPU oder GPU gespeichert ist.
Dimensionen von Tensoren
- 0-dimensionaler Tensor: Skalar, z. B.
tf.constant(5) - 1-dimensionaler Tensor: Vektor, z. B.
tf.constant([1,2,3]) - 2-dimensionaler Tensor: Matrix, z. B.
tf.constant([[1,2],[3,4]]) - 3-dimensional und höher: Tensoren höherer Ordnung, z. B.
tf.ones((2,3,4))repräsentiert zwei 3×4-Matrizen
Gängige Methoden zum Erstellen von Tensoren
1. Erstellen aus Python-Listen/NumPy-Arrays
Beispiel
import tensorflow as tf
import numpy as np
# Aus einer Python-Liste erstellen
tensor_from_list = tf.constant([[1, 2], [3, 4]])
# Aus einem NumPy-Array erstellen
numpy_array = np.array([[5, 6], [7, 8]])
tensor_from_numpy = tf.constant(numpy_array)
import numpy as np
# Aus einer Python-Liste erstellen
tensor_from_list = tf.constant([[1, 2], [3, 4]])
# Aus einem NumPy-Array erstellen
numpy_array = np.array([[5, 6], [7, 8]])
tensor_from_numpy = tf.constant(numpy_array)
2. Erstellen von Tensoren mit speziellen Werten
Beispiel
# Tensor aus lauter Nullen
zeros = tf.zeros((2, 3)) # Matrix aus lauter Nullen mit 2 Zeilen und 3 Spalten
# Tensor aus lauter Einsen
ones = tf.ones((3, 2)) # Matrix aus lauter Einsen mit 3 Zeilen und 2 Spalten
# Einheitsmatrix
eye = tf.eye(3) # 3×3-Einheitsmatrix
# Mit einem bestimmten Wert füllen
filled = tf.fill((2, 2), 7) # 2×2-Matrix, alle Elemente sind 7
zeros = tf.zeros((2, 3)) # Matrix aus lauter Nullen mit 2 Zeilen und 3 Spalten
# Tensor aus lauter Einsen
ones = tf.ones((3, 2)) # Matrix aus lauter Einsen mit 3 Zeilen und 2 Spalten
# Einheitsmatrix
eye = tf.eye(3) # 3×3-Einheitsmatrix
# Mit einem bestimmten Wert füllen
filled = tf.fill((2, 2), 7) # 2×2-Matrix, alle Elemente sind 7
3. Zufällige Tensoren erstellen
Beispiel
# Gleichverteilte Zufallszahlen
uniform = tf.random.uniform((2, 2), minval=0, maxval=1)
# Normalverteilte Zufallszahlen
normal = tf.random.normal((3, 3), mean=0, stddev=1)
# Zufällige Permutation
shuffled = tf.random.shuffle(tf.constant([1, 2, 3, 4, 5]))
uniform = tf.random.uniform((2, 2), minval=0, maxval=1)
# Normalverteilte Zufallszahlen
normal = tf.random.normal((3, 3), mean=0, stddev=1)
# Zufällige Permutation
shuffled = tf.random.shuffle(tf.constant([1, 2, 3, 4, 5]))
Grundlegende Operationen mit Tensoren
1. Mathematische Operationen
Beispiel
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])
# Elementweise Addition
add = tf.add(a, b) # Oder verwende Operatorüberladung a + b
# Elementweise Multiplikation
mul = tf.multiply(a, b) # Oder a * b
# Matrizenmultiplikation
matmul = tf.matmul(a, b) # Oder a @ b
# Weitere mathematische Operationen
sqrt = tf.sqrt(tf.cast(a, tf.float32)) # Quadratwurzel (erfordert Konvertierung in den Float-Typ)
b = tf.constant([[5, 6], [7, 8]])
# Elementweise Addition
add = tf.add(a, b) # Oder verwende Operatorüberladung a + b
# Elementweise Multiplikation
mul = tf.multiply(a, b) # Oder a * b
# Matrizenmultiplikation
matmul = tf.matmul(a, b) # Oder a @ b
# Weitere mathematische Operationen
sqrt = tf.sqrt(tf.cast(a, tf.float32)) # Quadratwurzel (erfordert Konvertierung in den Float-Typ)
2. Formoperationen
Beispiel
tensor = tf.constant([[1, 2, 3], [4, 5, 6]])
# Form abrufen
shape = tensor.shape # Gibt (2, 3) zurück
# Form ändern (reshape)
reshaped = tf.reshape(tensor, (3, 2)) # In 3 Zeilen und 2 Spalten ändern
# Transponieren
transposed = tf.transpose(tensor) # In 3 Zeilen und 2 Spalten ändern
# Dimensionen erweitern (expand_dims)
expanded = tf.expand_dims(tensor, axis=0) # Form ändert sich von (2,3) zu (1,2,3)
# Form abrufen
shape = tensor.shape # Gibt (2, 3) zurück
# Form ändern (reshape)
reshaped = tf.reshape(tensor, (3, 2)) # In 3 Zeilen und 2 Spalten ändern
# Transponieren
transposed = tf.transpose(tensor) # In 3 Zeilen und 2 Spalten ändern
# Dimensionen erweitern (expand_dims)
expanded = tf.expand_dims(tensor, axis=0) # Form ändert sich von (2,3) zu (1,2,3)
3. Indizierung und Slicing
Beispiel
tensor = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Ein einzelnes Element abrufen
elem = tensor[1, 2] # Element in Zeile 2, Spalte 3 abrufen (Wert ist 6)
# Slicing-Operation
row = tensor[1, :] # Alle Elemente in der 2. Zeile abrufen [4,5,6]
col = tensor[:, 1] # Alle Elemente in der 2. Spalte abrufen [2,5,8]
sub = tensor[0:2, 1:] # Zeilen 1-2, Spalten 2-3 abrufen [[2,3],[5,6]]
# Ein einzelnes Element abrufen
elem = tensor[1, 2] # Element in Zeile 2, Spalte 3 abrufen (Wert ist 6)
# Slicing-Operation
row = tensor[1, :] # Alle Elemente in der 2. Zeile abrufen [4,5,6]
col = tensor[:, 1] # Alle Elemente in der 2. Spalte abrufen [2,5,8]
sub = tensor[0:2, 1:] # Zeilen 1-2, Spalten 2-3 abrufen [[2,3],[5,6]]
Tensor-Broadcasting-Mechanismus
Broadcasting ist ein wichtiger Mechanismus in TensorFlow zur Handhabung von Operationen auf Tensoren unterschiedlicher Formen. Es erweitert automatisch den kleineren Tensor, um ihn an die Form des größeren Tensors anzupassen.
Broadcasting-Regeln
- Vergleiche die Dimensionen von der letzten Dimension ausgehend und arbeite dich vorwärts.
- Zwei Dimensionen sind kompatibel, wenn sie gleich sind, oder eine von ihnen 1 ist, oder eine von ihnen nicht existiert.
- Führe die Erweiterung durch Kopieren entlang fehlender Dimensionen oder Dimensionen der Größe 1 durch.
Broadcasting-Beispiele
Beispiel
# Addiere einen Vektor (3,) und einen Skalar ()
a = tf.constant([1, 2, 3])
b = tf.constant(2)
c = a + b # Das Ergebnis ist [3,4,5]; b wird auf [2,2,2] gebroadcastet
# Addiere eine Matrix (3,1) und einen Vektor (3,)
d = tf.constant([[1], [2], [3]])
e = tf.constant([10, 20, 30])
f = d + e # d wird auf [[1,1,1],[2,2,2],[3,3,3]] gebroadcastet
# Das Ergebnis ist [[11,21,31],[12,22,32],[13,23,33]]
a = tf.constant([1, 2, 3])
b = tf.constant(2)
c = a + b # Das Ergebnis ist [3,4,5]; b wird auf [2,2,2] gebroadcastet
# Addiere eine Matrix (3,1) und einen Vektor (3,)
d = tf.constant([[1], [2], [3]])
e = tf.constant([10, 20, 30])
f = d + e # d wird auf [[1,1,1],[2,2,2],[3,3,3]] gebroadcastet
# Das Ergebnis ist [[11,21,31],[12,22,32],[13,23,33]]
Tensor-Aggregationsoperationen
Häufige Aggregationsfunktionen
Beispiel
tensor = tf.constant([[1, 2, 3], [4, 5, 6]])
# Summe
sum_all = tf.reduce_sum(tensor) # Summe aller Elemente → 21
sum_axis0 = tf.reduce_sum(tensor, 0) # Summe entlang der Dimension 0 (Zeilen) → [5,7,9]
sum_axis1 = tf.reduce_sum(tensor, 1) # Summe entlang Dimension 1 (Spalten) → [6,15]
# Mittelwert berechnen
mean_all = tf.reduce_mean(tensor) # Mittelwert aller Elemente → 3.5
# Maximum/Minimum
max_val = tf.reduce_max(tensor) # Maximum → 6
min_val = tf.reduce_min(tensor) # Minimum → 1
# Logische Operationen
any_true = tf.reduce_any(tensor > 4) # Ob irgendein Element > 4 ist → True
all_true = tf.reduce_all(tensor > 0) # Ob alle Elemente > 0 sind → True
# Summe
sum_all = tf.reduce_sum(tensor) # Summe aller Elemente → 21
sum_axis0 = tf.reduce_sum(tensor, 0) # Summe entlang der Dimension 0 (Zeilen) → [5,7,9]
sum_axis1 = tf.reduce_sum(tensor, 1) # Summe entlang Dimension 1 (Spalten) → [6,15]
# Mittelwert berechnen
mean_all = tf.reduce_mean(tensor) # Mittelwert aller Elemente → 3.5
# Maximum/Minimum
max_val = tf.reduce_max(tensor) # Maximum → 6
min_val = tf.reduce_min(tensor) # Minimum → 1
# Logische Operationen
any_true = tf.reduce_any(tensor > 4) # Ob irgendein Element > 4 ist → True
all_true = tf.reduce_all(tensor > 0) # Ob alle Elemente > 0 sind → True
Praktische Übung
Übung 1: Tensoren erstellen und manipulieren
Beispiel
# 1. Erstelle eine 3×3-Zufallsmatrix mit Elementwerten zwischen 0 und 10
random_matrix = tf.random.uniform((3, 3), minval=0, maxval=10, dtype=tf.int32)
# 2. Berechne die Transponierte der Matrix
transposed_matrix = tf.transpose(random_matrix)
# 3. Berechne das Produkt der Matrix und ihrer Transponierten
product = tf.matmul(random_matrix, transposed_matrix)
# 4. Berechne die Summe der Diagonalelemente der Produktmatrix
diag_sum = tf.reduce_sum(tf.linalg.diag_part(product))
random_matrix = tf.random.uniform((3, 3), minval=0, maxval=10, dtype=tf.int32)
# 2. Berechne die Transponierte der Matrix
transposed_matrix = tf.transpose(random_matrix)
# 3. Berechne das Produkt der Matrix und ihrer Transponierten
product = tf.matmul(random_matrix, transposed_matrix)
# 4. Berechne die Summe der Diagonalelemente der Produktmatrix
diag_sum = tf.reduce_sum(tf.linalg.diag_part(product))
Übung 2: Anwendung des Broadcasting-Mechanismus
Beispiel
# 1. Erstelle eine 4×1-Matrix und einen 1×4-Vektor
matrix = tf.constant([[1], [2], [3], [4]])
vector = tf.constant([10, 20, 30, 40])
# 2. Verwende den Broadcasting-Mechanismus, um ihre Summe zu berechnen
broadcast_sum = matrix + vector
# 3. Form und Werte des Ergebnisses überprüfen
print("Shape:", broadcast_sum.shape) # Sollte (4,4) sein
print("Result:", broadcast_sum.numpy())
matrix = tf.constant([[1], [2], [3], [4]])
vector = tf.constant([10, 20, 30, 40])
# 2. Verwende den Broadcasting-Mechanismus, um ihre Summe zu berechnen
broadcast_sum = matrix + vector
# 3. Form und Werte des Ergebnisses überprüfen
print("Shape:", broadcast_sum.shape) # Sollte (4,4) sein
print("Result:", broadcast_sum.numpy())