Statt ein CNN von Grund auf zu trainieren, nutzt du Transfer Learning: Ein Modell, das bereits auf Millionen von Bildern trainiert wurde, wird für deine Pizza-Aufgabe angepasst. Erwartete Dauer: ca. 45 Minuten.
Stell dir vor, du stellst einen Koch ein. Option A: Du nimmst jemanden, der noch nie gekocht hat, und bringst ihm alles von Grund auf bei — vom Messerhalten bis zur Saucenherstellung. Option B: Du stellst einen erfahrenen Koch ein, der bereits jahrelang in verschiedenen Küchen gearbeitet hat, und zeigst ihm nur, wie deine speziellen Pizzarezepte funktionieren.
Transfer Learning ist Option B: Du nimmst ein Modell, das bereits gelernt hat, visuelle Merkmale zu erkennen, und passt es an deine spezifische Aufgabe an. In Aufgabe 1 hast du TinyVGG von Grund auf trainiert (Option A). Jetzt nutzt du ein vortrainiertes Modell (Option B).
ResNet18 ist ein Convolutional Neural Network mit 18 Schichten. Es wurde auf ImageNet vortrainiert — einem Datensatz mit 1,2 Millionen Bildern in 1.000 Kategorien (Hunde, Autos, Lebensmittel usw.). Das Modell hat ~11,2 Millionen Parameter und kennt bereits visuelle Konzepte wie Kanten, Texturen, Formen und Objekte.
Pretrained Backbone (Layers 1-17) New Classifier Head +-----------------------------------------+ +---------------------+ | | | | | Layer 1-4: Low-level features | | Linear: 512 -> 256 | | (edges, colors, textures) | | ReLU | | | | Dropout(0.3) | | Layer 5-10: Mid-level features | | Linear: 256 -> 1 | | (shapes, patterns) | | Sigmoid | | | | | | Layer 11-17: High-level features | | Output: | | (objects, scenes) | | 0 = not pizza | | | | 1 = pizza | +-----------------------------------------+ +---------------------+ Frozen (pretrained on ImageNet) Trained on your data
Fine-Tuning besteht aus drei Schritten:
Aktiviere die virtuelle Umgebung und prüfe, ob alle Abhängigkeiten installiert sind:
cd pizza-ml .venv\Scripts\activate python check_environment.py
Trainiere vier ResNet18-Modelle mit verschiedenen Kombinationen aus Datenqualität und Trainingsdauer:
Modell 1: Datensatz v1, 10 Epochs
python train-pizza-finetuning.py --data-dir ./data/v1 --epochs 10 --output pizza_resnet18_v1_10.pth
Modell 2: Datensatz v1, 50 Epochs
python train-pizza-finetuning.py --data-dir ./data/v1 --epochs 50 --output pizza_resnet18_v1_50.pth
Modell 3: Datensatz v2, 10 Epochs
python train-pizza-finetuning.py --data-dir ./data/v2 --epochs 10 --output pizza_resnet18_v2_10.pth
Modell 4: Datensatz v2, 50 Epochs
python train-pizza-finetuning.py --data-dir ./data/v2 --epochs 50 --output pizza_resnet18_v2_50.pth
Notiere deine Trainingsergebnisse:
| Modell | Daten | Epochs | Trainingsdauer | Testgenauigkeit |
|---|---|---|---|---|
pizza_resnet18_v1_10.pth |
v1 | 10 | ___ | ___% |
pizza_resnet18_v1_50.pth |
v1 | 50 | ___ | ___% |
pizza_resnet18_v2_10.pth |
v2 | 10 | ___ | ___% |
pizza_resnet18_v2_50.pth |
v2 | 50 | ___ | ___% |
Sage für jedes Modell alle 4 Testbilder vorher. Notiere die Ergebnisse und die Konfidenz.
Modell 1: v1 + 10 Epochs
python train-pizza-finetuning.py --predict test_images/pizza_margherita.jpg --output pizza_resnet18_v1_10.pth python train-pizza-finetuning.py --predict test_images/pizza_supreme.jpg --output pizza_resnet18_v1_10.pth python train-pizza-finetuning.py --predict test_images/ice.jpg --output pizza_resnet18_v1_10.pth python train-pizza-finetuning.py --predict test_images/flammkuchen.jpg --output pizza_resnet18_v1_10.pth
Modell 2: v1 + 50 Epochs
python train-pizza-finetuning.py --predict test_images/pizza_margherita.jpg --output pizza_resnet18_v1_50.pth python train-pizza-finetuning.py --predict test_images/pizza_supreme.jpg --output pizza_resnet18_v1_50.pth python train-pizza-finetuning.py --predict test_images/ice.jpg --output pizza_resnet18_v1_50.pth python train-pizza-finetuning.py --predict test_images/flammkuchen.jpg --output pizza_resnet18_v1_50.pth
Modell 3: v2 + 10 Epochs
python train-pizza-finetuning.py --predict test_images/pizza_margherita.jpg --output pizza_resnet18_v2_10.pth python train-pizza-finetuning.py --predict test_images/pizza_supreme.jpg --output pizza_resnet18_v2_10.pth python train-pizza-finetuning.py --predict test_images/ice.jpg --output pizza_resnet18_v2_10.pth python train-pizza-finetuning.py --predict test_images/flammkuchen.jpg --output pizza_resnet18_v2_10.pth
Modell 4: v2 + 50 Epochs
python train-pizza-finetuning.py --predict test_images/pizza_margherita.jpg --output pizza_resnet18_v2_50.pth python train-pizza-finetuning.py --predict test_images/pizza_supreme.jpg --output pizza_resnet18_v2_50.pth python train-pizza-finetuning.py --predict test_images/ice.jpg --output pizza_resnet18_v2_50.pth python train-pizza-finetuning.py --predict test_images/flammkuchen.jpg --output pizza_resnet18_v2_50.pth
Trage deine Ergebnisse in die folgende Tabelle ein:
| Metrik | v1+10 Ep. | v1+50 Ep. | v2+10 Ep. | v2+50 Ep. |
|---|---|---|---|---|
| Testgenauigkeit | ___% | ___% | ___% | ___% |
| pizza_margherita.jpg | ___ | ___ | ___ | ___ |
| pizza_supreme.jpg | ___ | ___ | ___ | ___ |
| ice.jpg | ___ | ___ | ___ | ___ |
| flammkuchen.jpg | ___ | ___ | ___ | ___ |
🖨️ Leere Vergleichstabelle zum Ausdrucken
Kombiniere deine Ergebnisse aus Aufgabe 1 (TinyVGG, von Grund auf) und Aufgabe 2 (ResNet18, Fine-Tuning):
| Metrik | TinyVGG (Aufgabe 1) | ResNet18 (Aufgabe 2) | ||||||
|---|---|---|---|---|---|---|---|---|
| v1+10 | v1+50 | v2+10 | v2+50 | v1+10 | v1+50 | v2+10 | v2+50 | |
| Architektur | TinyVGG (~8,6M) | ResNet18 (~11,2M) | ||||||
| Ansatz | Von Grund auf | Fine-Tuning | ||||||
| Daten | v1 | v1 | v2 | v2 | v1 | v1 | v2 | v2 |
| Epochs | 10 | 50 | 10 | 50 | 10 | 50 | 10 | 50 |
| Testgenauigkeit | ___% | ___% | ___% | ___% | ___% | ___% | ___% | ___% |
| pizza_margherita.jpg | ___ | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| pizza_supreme.jpg | ___ | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| ice.jpg | ___ | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| flammkuchen.jpg | ___ | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| TinyVGG | ResNet18 | |||||||
|---|---|---|---|---|---|---|---|---|
| v1+10 | v1+50 | v2+10 | v2+50 | v1+10 | v1+50 | v2+10 | v2+50 | |
| Testgenauigkeit | 68.00% | 72.40% | 81.80% | 85.60% | 85.60% | 84.80% | 95.00% | 95.40% |
| TinyVGG | ResNet18 | |||||||
|---|---|---|---|---|---|---|---|---|
| v1+10 | v1+50 | v2+10 | v2+50 | v1+10 | v1+50 | v2+10 | v2+50 | |
| pizza_margherita.jpg | PIZZA 67% | PIZZA 59% | PIZZA 87% | PIZZA 92% | PIZZA 76% | PIZZA 78% | PIZZA 98% | PIZZA 100% |
| pizza_supreme.jpg | PIZZA 65% | PIZZA 53% | PIZZA 87% | PIZZA 78% | PIZZA 78% | PIZZA 77% | PIZZA 71% | PIZZA 94% |
| ice.jpg | NOT PIZZA 69% | NOT PIZZA 65% | NOT PIZZA 75% | NOT PIZZA 93% | NOT PIZZA 84% | NOT PIZZA 67% | NOT PIZZA 100% | NOT PIZZA 100% |
| flammkuchen.jpg | NOT PIZZA 53% | NOT PIZZA 52% | NOT PIZZA 57% | PIZZA 56% | PIZZA 61% | PIZZA 74% | NOT PIZZA 74% | PIZZA 64% |
| Modell | Erwartete Genauigkeit |
|---|---|
| ResNet18 v1+10 | ~80–85% |
| ResNet18 v1+50 | ~82–88% |
| ResNet18 v2+10 | ~92–96% |
| ResNet18 v2+50 | ~94–98% |
| Modell | TinyVGG (Aufgabe 1) | ResNet18 (Aufgabe 2) |
|---|---|---|
| v1+10 (unsauber, wenig Training) | ~65–70% | ~80–85% |
| v1+50 (unsauber, mehr Training) | ~65–75% | ~82–88% |
| v2+10 (sauber, wenig Training) | ~75–80% | ~92–96% |
| v2+50 (sauber, mehr Training) | ~80–90% | ~94–98% |
Bereits mit 10 Epochs und sauberen Daten erreicht ResNet18 (~92–96%) bessere Ergebnisse als TinyVGG mit 50 Epochs (~80–90%). Transfer Learning kompensiert fehlende Trainingszeit massiv.
Selbst mit unsauberen Daten schlägt ResNet18 das TinyVGG mit sauberen Daten. Aber der Sprung von v1 zu v2 ist bei beiden Modellen signifikant. Transfer Learning macht schlechte Daten nicht irrelevant — es verschiebt nur die Baseline nach oben.