Aufgabe 1

Ein CNN von Grund auf trainieren

Datensatz und Trainings-Skript sind vorbereitet. Deine Aufgabe: Trainiere ein Modell, das entscheidet „Pizza oder nicht Pizza?“ Erwartete Dauer: ca. 45 Minuten.

Aufgabe 1 Aufgabe 2 Aufgabe 3 Aufgabe 4 Aufgabe 5 Aufgabe 6

Das Szenario

Datensatz und Trainings-Skript liegen bereit. Deine Aufgabe: Trainiere ein Modell, das entscheidet „Pizza oder nicht Pizza?“

Was ist ein CNN?

Ein Convolutional Neural Network (CNN) verarbeitet Bilder mithilfe von Filtern, die visuelle Muster erkennen. Warum ein CNN und kein LLM für Bilder? Bilder haben eine räumliche Struktur — Pixelraster mit Nachbarschaftsbeziehungen. CNNs nutzen geteilte Gewichte (Shared Weights), um lokale Muster wie Kanten, Texturen und Formen effizient zu erkennen. Ein LLM arbeitet mit Textsequenzen und hat keinen Begriff von räumlicher Nachbarschaft in einem Pixelraster.

Das Modell: TinyVGG

Ein kleines CNN im VGG-Stil mit folgender Pipeline:

  • Conv Block 1: 64 Filter (3×3), erkennt Grundmuster (Kanten, Farben). Pooling 64→32px
  • Conv Block 2: 128 Filter, komplexere Merkmale (Käse-Textur, Krustenränder). Pooling 32→16px
  • Classifier: Flatten 16×16×128=32768 → 256 Neuronen → 1 Ausgang (0=keine Pizza, 1=Pizza)
  • ~8,6M Parameter, komplett von Grund auf trainiert
Input Image (3x64x64)
        |
  [Conv Block 1]  64 filters 3x3, ReLU, MaxPool(2)
        |
  Feature Maps (64x32x32)
        |
  [Conv Block 2]  128 filters 3x3, ReLU, MaxPool(2)
        |
  Feature Maps (128x16x16)
        |
  [Flatten]  128*16*16 = 32768
        |
  [Linear]  32768 -> 256 -> ReLU
        |
  [Linear]  256 -> 1 (sigmoid)
        |
  Output: 0 = not pizza, 1 = pizza
0

Umgebung prüfen

Öffne das Windows Terminal (PowerShell) und navigiere zum Projektverzeichnis. Aktiviere die virtuelle Umgebung und prüfe, ob alle Abhängigkeiten installiert sind:

cd pizza-ml
.venv\Scripts\activate
python check_environment.py
1

Testbilder

Es stehen 4 Testbilder bereit:

  • pizza_margherita.jpg
  • pizza_supreme.jpg
  • ice.jpg
  • flammkuchen.jpg
2

Trainieren (10 Epochs, Datensatz v1)

Starte das Training mit 10 Epochs auf dem v1-Datensatz:

python train-pizza-creation.py --data-dir ./data/v1 --epochs 10 --output pizza_tinyvgg_v1_10.pth
Notiere: Trainingsdauer, Trainingsgenauigkeit, Testgenauigkeit.
3

Testen (10 Epochs)

Sage für alle 4 Testbilder vorher. Notiere die Ergebnisse und die Konfidenz.

python train-pizza-creation.py --predict test_images/pizza_margherita.jpg --output pizza_tinyvgg_v1_10.pth
python train-pizza-creation.py --predict test_images/pizza_supreme.jpg --output pizza_tinyvgg_v1_10.pth
python train-pizza-creation.py --predict test_images/ice.jpg --output pizza_tinyvgg_v1_10.pth
python train-pizza-creation.py --predict test_images/flammkuchen.jpg --output pizza_tinyvgg_v1_10.pth
4

Mehr Training (50 Epochs, Datensatz v1)

Vielleicht hilft mehr Training? Trainiere mit 50 Epochs:

python train-pizza-creation.py --data-dir ./data/v1 --epochs 50 --output pizza_tinyvgg_v1_50.pth
5

Testen (50 Epochs)

Sage für alle 4 Bilder mit dem v1_50-Modell vorher:

python train-pizza-creation.py --predict test_images/pizza_margherita.jpg --output pizza_tinyvgg_v1_50.pth
python train-pizza-creation.py --predict test_images/pizza_supreme.jpg --output pizza_tinyvgg_v1_50.pth
python train-pizza-creation.py --predict test_images/ice.jpg --output pizza_tinyvgg_v1_50.pth
python train-pizza-creation.py --predict test_images/flammkuchen.jpg --output pizza_tinyvgg_v1_50.pth
6

Was ist schiefgelaufen?

Denke über mögliche Ursachen nach:

  • Datenqualität?
  • Datenmenge?
  • Modell-Architektur?
  • Trainingsprozess?
  • Input-Pipeline?
Hinweis: Du hast mehr Epochs versucht und es hat nicht geholfen. Schau dir die Daten an!
7

Trainingsdaten inspizieren

Durchsuche data/v1/train/pizza/ — findest du verunreinigte Labels? (Nicht-Pizza-Bilder, die als Pizza gekennzeichnet sind)

8

Trainieren (10 Epochs, Datensatz v2)

Trainiere erneut mit dem v2-Datensatz:

python train-pizza-creation.py --data-dir ./data/v2 --epochs 10 --output pizza_tinyvgg_v2_10.pth
9

v2-Modell testen (10 Epochs)

Sage für alle 4 Bilder vorher:

python train-pizza-creation.py --predict test_images/pizza_margherita.jpg --output pizza_tinyvgg_v2_10.pth
python train-pizza-creation.py --predict test_images/pizza_supreme.jpg --output pizza_tinyvgg_v2_10.pth
python train-pizza-creation.py --predict test_images/ice.jpg --output pizza_tinyvgg_v2_10.pth
python train-pizza-creation.py --predict test_images/flammkuchen.jpg --output pizza_tinyvgg_v2_10.pth
10

Datensatz v2 + mehr Training (50 Epochs)

Trainiere den v2-Datensatz mit 50 Epochs:

python train-pizza-creation.py --data-dir ./data/v2 --epochs 50 --output pizza_tinyvgg_v2_50.pth
11

Bestes Modell testen

Sage für alle 4 Bilder mit dem v2_50-Modell vorher:

python train-pizza-creation.py --predict test_images/pizza_margherita.jpg --output pizza_tinyvgg_v2_50.pth
python train-pizza-creation.py --predict test_images/pizza_supreme.jpg --output pizza_tinyvgg_v2_50.pth
python train-pizza-creation.py --predict test_images/ice.jpg --output pizza_tinyvgg_v2_50.pth
python train-pizza-creation.py --predict test_images/flammkuchen.jpg --output pizza_tinyvgg_v2_50.pth
12

Alle vier Modelle vergleichen

Trage deine Ergebnisse in die folgende Tabelle ein:

Metrik v1+10 v1+50 v2+10 v2+50
Modelldatei v1_10.pth v1_50.pth v2_10.pth v2_50.pth
Testgenauigkeit ___%___%___%___%
pizza_margherita.jpg ____________
pizza_supreme.jpg ____________
ice.jpg ____________
flammkuchen.jpg ____________
Lösung — Erst öffnen wenn alle Aufgaben erledigt sind
TinyVGG Inferenz-Ergebnisse
Bild v1+10ep v1+50ep v2+10ep v2+50ep
pizza_margherita PIZZA (75.07%) PIZZA (76.84%) PIZZA (99.82%) PIZZA (99.96%)
pizza_supreme PIZZA (75.03%) PIZZA (76.19%) PIZZA (94.65%) PIZZA (96.61%)
ice NOT PIZZA (42%) NOT PIZZA (42%) NOT PIZZA (12%) NOT PIZZA (2%)
flammkuchen NOT PIZZA (52%) NOT PIZZA (57%) NOT PIZZA (63%) PIZZA (63%)
Erwartete Genauigkeit (Trainingsläufe)
Modell Erwartete Genauigkeit
Unsauber+10 ~65–70%
Unsauber+50 ~65–75%
Sauber+10 ~75–80%
Sauber+50 ~80–90%
Erkenntnisse
Erkenntnis 1: v2 ist deutlich besser

Saubere Trainingsdaten zahlen sich aus. Confidence bei echten Pizzen springt von ~75% auf ~99%. Eis wird mit nur ~2% Pizza-Wahrscheinlichkeit sauber abgelehnt (vs. ~42% bei v1).

Erkenntnis 2: Das Flammkuchen-Problem — Grenzfall für das Modell
  • Flammkuchen sieht aus wie Pizza: flacher Teig, Belag, runde/rechteckige Form
  • Mit schlechten Daten (v1) ist das Modell unsicher (~52-57%) und tendiert zu NOT PIZZA
  • Mit sauberen Daten und mehr Training (v2+50) kippt es zu PIZZA (63%) — das Modell wird „sicherer“ in der falschen Richtung
  • Das zeigt: Dem Modell fehlt eine Klasse für „pizza-ähnlich aber nicht Pizza“ (Flammkuchen, Focaccia, etc.)
Erkenntnis 3: Epochs bringen wenig bei schlechten Daten

v1: 75% → 76% nach 5× mehr Training. Bei sauberen Daten auch nur marginale Gains — Modell konvergiert schnell.

Erkenntnis 4: Was fehlt

Eine „Flatbread/Flammkuchen“-Klasse oder Negativbeispiele dieser Kategorie im Trainingsset.

Kernaussage: Datenqualität ist wichtiger als Trainingsdauer. „Garbage in, garbage out.“