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

  1. Datentyp (dtype): Jeder Tensor hat einen bestimmten Datentyp, wie tf.float32, tf.int64 usw.
  2. Form: Repräsentiert die Größe jeder Dimension des Tensors, z. B. (2,3) repräsentiert eine Matrix mit 2 Zeilen und 3 Spalten.
  3. 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)

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

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

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)

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)

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

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

  1. Vergleiche die Dimensionen von der letzten Dimension ausgehend und arbeite dich vorwärts.
  2. Zwei Dimensionen sind kompatibel, wenn sie gleich sind, oder eine von ihnen 1 ist, oder eine von ihnen nicht existiert.
  3. 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]]

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

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

Ü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())
Andere Erweiterungen