In diesem Notebook vergleichen wir verschiedene neuronale Netzarchitekturen zur Klassifikation von Bildern aus dem MNIST- und Fashion-MNIST-Datensatz.
Bibliotheken importieren
import keras as Kimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
2025-08-15 16:16:55.350334: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.
2025-08-15 16:16:55.395656: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2025-08-15 16:16:56.952808: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.
MNIST-Datensatz laden und vorbereiten
Laden des Fashion-MNIST-Datensatzes aus Keras (10 Klassen, z. B. Schuhe, Pullover, Taschen)
Normalisierung der Bilddaten auf Werte im Bereich [0, 1]
Ursprünglich liegen die Grauwerte im Bereich [0, 255]
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
0/11490434━━━━━━━━━━━━━━━━━━━━0s 0s/step
9199616/11490434━━━━━━━━━━━━━━━━━━━━0s 0us/step
11490434/11490434━━━━━━━━━━━━━━━━━━━━0s 0us/step
One-Hot-Encoding der Zielvariablen
One-Hot-Encoding der Zielvariable (10 Klassen -> Vektor mit 10 Einträgen)
2025-08-15 16:16:57.815219: E external/local_xla/xla/stream_executor/cuda/cuda_platform.cc:51] failed call to cuInit: INTERNAL: CUDA error: Failed call to cuInit: UNKNOWN ERROR (303)
Training des Feedforward-Netzes
30 Epochen
Batch-Größe 128
30 % der Trainingsdaten werden für Validierung verwendet
history = model.fit( x_train, y_train, epochs=30, batch_size=128, validation_split=0.3, verbose=2)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
0/29515━━━━━━━━━━━━━━━━━━━━0s 0s/step
29515/29515━━━━━━━━━━━━━━━━━━━━0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
0/26421880━━━━━━━━━━━━━━━━━━━━0s 0s/step
6021120/26421880━━━━━━━━━━━━━━━━━━━━0s 0us/step
13066240/26421880━━━━━━━━━━━━━━━━━━━━0s 0us/step
22061056/26421880━━━━━━━━━━━━━━━━━━━━0s 0us/step
26421880/26421880━━━━━━━━━━━━━━━━━━━━0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
0/5148━━━━━━━━━━━━━━━━━━━━0s 0s/step
5148/5148━━━━━━━━━━━━━━━━━━━━0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
0/4422102━━━━━━━━━━━━━━━━━━━━0s 0s/step
4422102/4422102━━━━━━━━━━━━━━━━━━━━0s 0us/step
CNN-Architektur definieren
Der erste Layer ist ein Conv2D-Layer:
32 Filter mit einer Kerneldimension von 3×3
ReLU-Aktivierung
input_shape=(28, 28, 1): Eingabebilder sind 28×28 Pixel mit 1 Kanal (grau)
Anschließend reduziert ein **MaxPooling2D-Layer* die räumliche Dimension der Featuremaps
Der Flatten-Layer wandelt die 2D-Ausgabe in einen 1D-Vektor um, sodass dieser an vollverbundene (Dense) Schichten übergeben werden kann
Eine Dense-Schicht mit 100Neuronen und **ReLU-Aktivierung* als Hidden-Layer
Ausgabeschicht für 10Klassen (z. B. Ziffern oder Kleidungsstücke), Softmax-Aktivierung liefert Wahrscheinlichkeiten
/opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/keras/src/layers/convolutional/base_conv.py:113: UserWarning:
Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
Kompilierung des CNN-Modells
Optimierer: Adam (effizient, adaptiv)
Verlustfunktion: categorical_crossentropy (geeignet für mehrklassige Klassifikation mit One-Hot-Labels)
Metrik: accuracy
model2.compile( optimizer ='adam', loss ='categorical_crossentropy', metrics = ['accuracy'])
Er verwendet 32 Filter mit einer Kernelgröße von 3x3
Diese extrahieren lokale Bildmerkmale (z. B. Kanten, Texturen)
Die erste Zahl (32) gibt die Anzahl der Filter (= Ausgabekanäle) an
Eine höhere Anzahl an Filtern erhöht die Modellkapazität, aber auch den Rechenaufwand
In empirischen Tests zeigt sich: - Bereits einfache CNNs erreichen ~99 % Trainingsgenauigkeit und ~91 % Testgenauigkeit - Dies entspricht einem signifikanten Fortschritt gegenüber klassischen Feedforward-Netzen
Für eine bessere Generalisierbarkeit wurden zusätzliche Experimente durchgeführt: - Variation der Anzahl der Filter im ersten Conv2D-Layer (z. B. 32, 40, 48, 56) - Das Modell mit 48 Filtern schnitt im Mittel am besten auf den Testdaten ab
Eine weitere bewährte Technik zur Vermeidung von Overfitting ist der Einsatz eines Dropout-Layers: - Während des Trainings werden zufällig ausgewählte Neuronen deaktiviert - Dies verhindert eine zu starke Abhängigkeit von einzelnen Aktivierungen - Ziel: bessere Generalisierbarkeit auf unbekannte Daten
CNN mit Dropout zur Vermeidung von Overfitting
Ein Dropout-Layer deaktiviert während des Trainings zufällig 10 % der Neuronen im vorherigen Layer. Ziel: Netz soll robuster gegen Überanpassung werden und besser auf neuen Daten generalisieren
model = Sequential()model.add(Conv2D(32, (3, 3), activation ='relu', input_shape=(28, 28, 1)))model.add(MaxPooling2D((2, 2)))model.add(Dropout(0.1)) # 10 % der Neuronen werden zufällig deaktiviertmodel.add(Flatten())model.add(Dense(100, activation ='relu'))model.add(Dense(10, activation ='softmax'))