Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

LeNet-5 mit PyTorch trainieren: Schritt-für-Schritt-Anleitung für MNIST, Fashion-MNIST und CIFAR-10

Lerne, wie du das klassische LeNet-5 CNN mit PyTorch implementierst und auf MNIST, Fashion-MNIST und CIFAR-10 trainierst. Inklusive Tipps zur Hyperparameter-Optimierung und Overfitting-Vermeidung.

LeNet-5 PyTorch CNN Training MNIST Klassifikation Fashion-MNIST CIFAR-10 Convolutional Neural Network Overfitting vermeiden Hyperparameter Optimierung Deep Learning Bilderkennung PyTorch Tutorial Neuronale Netze Maschinelles Lernen ReLU Aktivierungsfunktion Softmax Data Augmentation Negative Bilder erkennen

Einführung in Convolutional Neural Networks (CNNs)

Convolutional Neural Networks (CNNs) sind tiefe Lernmodelle, die besonders für Bilderkennungsaufgaben geeignet sind. Ähnlich wie ein Gamer, der Muster in einem Spiel erkennt, lernen CNNs hierarchische Merkmale aus Bildern. In dieser Anleitung trainierst du den legendären LeNet-5 – einen der ersten CNNs, entwickelt von Yann LeCun. Du wendest ihn auf drei Datensätze an: MNIST (handgeschriebene Ziffern), Fashion-MNIST (Kleidungsstücke) und CIFAR-10 (Farbbilder von Alltagsobjekten). Das Ziel ist es, die Architektur zu verstehen und die Klassifikationsgenauigkeit zu optimieren.

Was ist LeNet-5?

LeNet-5 besteht aus zwei Convolutional-Layern, gefolgt von Max-Pooling, und drei Fully-Connected-Layern. Die erste Convolution hat 6 Filter der Größe 5×5, die zweite 16 Filter. Nach jedem Conv-Layer kommt ein Max-Pooling mit 2×2 Fenster. Die FC-Layer haben 120, 84 und 10 Neuronen. Als Aktivierungsfunktion wird ReLU verwendet, außer im Output-Layer, wo Softmax die Wahrscheinlichkeiten berechnet.

CNN-Komponenten verstehen

Fully Connected Layer

Ein Fully-Connected-Layer (FC) verbindet jedes Neuron des vorherigen Layers mit jedem Neuron des aktuellen Layers. Er dient als Klassifikator, der die extrahierten Merkmale in Klassenwahrscheinlichkeiten umwandelt. In LeNet-5 sind die letzten drei Layer FCs.

Convolutional Layer

Der Convolutional-Layer wendet Filter (Kernel) auf das Eingabebild an, um Merkmale wie Kanten oder Texturen zu erkennen. Die Filter werden während des Trainings gelernt. Die Faltungsoperation (Convolution) verschiebt den Filter über das Bild und berechnet das Skalarprodukt.

Max Pooling Layer

Max Pooling reduziert die räumliche Dimension, indem es das Maximum in einem 2×2 Fenster nimmt. Dies macht das Modell translationsinvariant und reduziert die Parameteranzahl, was Overfitting entgegenwirkt.

Aktivierungsfunktion

ReLU (Rectified Linear Unit) ist die Standard-Aktivierung: f(x) = max(0, x). Sie ist einfach zu berechnen und vermeidet das Verschwinden des Gradienten. Alternativen sind LeakyReLU (kleiner negativer Slope) und ELU (exponentiell negativ), die das Problem toter Neuronen mildern.

Softmax-Funktion

Softmax wandelt die Logits in Wahrscheinlichkeiten um, die sich zu 1 summieren. Sie wird im letzten Layer für Mehrklassenklassifikation verwendet.

Overfitting und Regularisierung

Overfitting tritt auf, wenn das Modell die Trainingsdaten auswendig lernt, aber auf neuen Daten schlecht abschneidet. Eine gängige Technik dagegen ist Dropout, bei dem zufällig Neuronen während des Trainings deaktiviert werden. Auch Data Augmentation (Drehen, Spiegeln der Bilder) hilft, die Generalisierung zu verbessern.

Loss-Funktionen im Vergleich

Verschiedene Loss-Funktionen eignen sich für unterschiedliche Aufgaben:

  • L1Loss (Mean Absolute Error): Robust gegen Ausreißer, wird z.B. bei Regression verwendet.
  • MSELoss (Mean Squared Error): Bestraft große Fehler stärker, typisch für lineare Regression.
  • BCELoss (Binary Cross Entropy): Für binäre Klassifikation, z.B. Ja/Nein-Entscheidungen.

Teil (a): Architektur und Konzepte erklären

In deinem Bericht solltest du die oben genannten Komponenten in eigenen Worten beschreiben. Erkläre Overfitting und nenne Dropout als Gegenmaßnahme. Vergleiche ReLU, LeakyReLU und ELU. Liste dann Anwendungen für L1Loss, MSELoss und BCELoss auf – zum Beispiel MSELoss für die Vorhersage von Aktienkursen oder BCELoss für die Spam-Erkennung.

Teil (b): Klassifikationsleistung vergleichen

Implementierung mit PyTorch

Du implementierst LeNet-5 in PyTorch. Hier ein minimales Code-Gerüst:

import torch
import torch.nn as nn
import torch.nn.functional as F

class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)  # 1 Kanal für Graustufen
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16*5*5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

Hyperparameter und Training

Für MNIST erreichst du mit folgenden Einstellungen über 99% Testgenauigkeit:

  • Lernrate: 0.001
  • Optimierer: Adam
  • Batch-Größe: 64
  • Epochen: 10
  • Initialisierung: Kaiming Normal

Probiere fünf verschiedene Initialisierungen aus (z.B. unterschiedliche Lernraten, Gewichtsinitialisierungen wie Xavier oder Kaiming) und zeichne die Genauigkeitskurven für Training und Test. Diskutiere, wie sich die Einstellungen auswirken. Für Fashion-MNIST sollte die beste Genauigkeit über 90% liegen, für CIFAR-10 über 65%. CIFAR-10 ist schwieriger, weil die Bilder farbig und vielfältiger sind – ähnlich wie ein komplexeres Spiel mehr Übung erfordert.

Teil (c): Negative Bilder erkennen

Negative erzeugen

Ein Negativ eines Bildes erhältst du durch 255 - pixel (bei Graustufen). In PyTorch: negatives = 1.0 - images (da Werte auf [0,1] normalisiert). Zeige mit Statistiken und Beispielbildern, dass die Umkehrung korrekt ist.

Genauigkeit auf Negativen

Das trainierte LeNet-5 wird auf den Negativen getestet. Die Genauigkeit sinkt drastisch, da das Modell die Helligkeitsverteilung nicht kennt. Das liegt daran, dass die gelernten Filter auf die ursprünglichen Intensitäten abgestimmt sind.

Neues Netz für Originale und Negative

Entwickle ein neues Netz, das beide Versionen erkennt. Ein einfacher Ansatz: Füge einen Preprocessing-Layer hinzu, der das Bild entweder normalisiert oder beide Versionen als separate Kanäle einfüttert. Trainiere das Netz auf einem gemischten Datensatz aus Originalen und Negativen. Berichte die Genauigkeit.

Fazit

LeNet-5 ist ein hervorragendes Einstiegsmodell, um CNNs zu verstehen. Mit PyTorch kannst du es schnell implementieren und auf verschiedenen Datensätzen testen. Die Herausforderungen bei CIFAR-10 zeigen, dass komplexere Daten tiefere Netze erfordern. Viel Erfolg bei deiner Hausaufgabe!