Datensatz und Trainings-Skript sind vorbereitet. Deine Aufgabe: Trainiere ein Modell, das entscheidet „Pizza oder nicht Pizza?“ Erwartete Dauer: ca. 45 Minuten.
Datensatz und Trainings-Skript liegen bereit. Deine Aufgabe: Trainiere ein Modell, das entscheidet „Pizza oder nicht Pizza?“
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.
Ein kleines CNN im VGG-Stil mit folgender Pipeline:
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
Ö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
Es stehen 4 Testbilder bereit:
pizza_margherita.jpgpizza_supreme.jpgice.jpgflammkuchen.jpgStarte 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
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
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
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
Denke über mögliche Ursachen nach:
Durchsuche data/v1/train/pizza/ — findest du verunreinigte Labels? (Nicht-Pizza-Bilder, die als Pizza gekennzeichnet sind)
Trainiere erneut mit dem v2-Datensatz:
python train-pizza-creation.py --data-dir ./data/v2 --epochs 10 --output pizza_tinyvgg_v2_10.pth
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
Trainiere den v2-Datensatz mit 50 Epochs:
python train-pizza-creation.py --data-dir ./data/v2 --epochs 50 --output pizza_tinyvgg_v2_50.pth
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
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 | ___ | ___ | ___ | ___ |
| 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%) |
| Modell | Erwartete Genauigkeit |
|---|---|
| Unsauber+10 | ~65–70% |
| Unsauber+50 | ~65–75% |
| Sauber+10 | ~75–80% |
| Sauber+50 | ~80–90% |
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).
v1: 75% → 76% nach 5× mehr Training. Bei sauberen Daten auch nur marginale Gains — Modell konvergiert schnell.
Eine „Flatbread/Flammkuchen“-Klasse oder Negativbeispiele dieser Kategorie im Trainingsset.