Cursusinhoud
Essentiële Computervisie
Essentiële Computervisie
Uitdaging: Het Bouwen van een CNN
Convolutionele neurale netwerken (CNN's) worden veel gebruikt bij beeldclassificatie vanwege hun vermogen om hiërarchische kenmerken te extraheren. In deze opdracht implementeer en train je een VGG-achtige CNN met TensorFlow en Keras op de CIFAR-10
dataset. De dataset bestaat uit 60.000 afbeeldingen (32×32×3
) die behoren tot 10 verschillende klassen, waaronder vliegtuigen, auto's, vogels, katten en meer.
Dit project begeleidt je bij het laden van de dataset, het preprocessen van de afbeeldingen, het definiëren van het CNN-model, het trainen ervan en het evalueren van de prestaties.
1. Gegevensvoorverwerking voor CNN's
Voor het trainen van een CNN is het preprocessen van de gegevens een cruciale stap om betere prestaties en snellere convergentie te waarborgen. Veelgebruikte preprocessingsmethoden zijn:
Normalisatie: deze methode houdt in dat de pixelwaarden van afbeeldingen worden geschaald van een bereik tussen 0 en 255 naar een bereik tussen 0 en 1. Dit wordt vaak geïmplementeerd als
x_train / 255.0, x_test / 255.0
;One-hot encoding: labels worden vaak omgezet in one-hot gecodeerde vectoren voor classificatietaken. Dit gebeurt doorgaans met de functie
keras.utils.to_categorical
, die gehele labels (bijv. 0, 1, 2, enz.) omzet in een one-hot gecodeerde vector, zoals[1, 0, 0, 0]
voor een classificatieprobleem met 4 klassen.
2. Het bouwen van de CNN-architectuur
Een CNN-architectuur bestaat uit meerdere lagen die verschillende taken uitvoeren om kenmerken te extraheren en voorspellingen te doen. Je kunt belangrijke CNN-lagen implementeren door:
Convolutionele laag (Conv2D)
Opmerking
input_shape
parameter, hoeft u alleen op te geven in de invoerlaag.
Poolinglaag (MaxPooling2D)
Flatten-laag
Dense-laag
Opmerking
De laatste dense-laag heeft doorgaans een aantal units gelijk aan het aantal klassen en gebruikt een softmax activatiefunctie om een waarschijnlijkheidsverdeling over de klassen te genereren.
3. Modelcompilatie
Na het definiëren van de architectuur moet het model worden gecompileerd. In deze stap worden de verliesfunctie, optimizer en metriek gespecificeerd die het model tijdens het trainen zullen sturen. De volgende methoden worden vaak gebruikt bij CNN's:
Optimizer (Adam)
De optimizer past de gewichten van het model aan om de verliesfunctie te minimaliseren. De Adam-optimizer is populair vanwege zijn efficiëntie en het vermogen om het leerproces tijdens de training aan te passen.
Verliesfunctie (Categorical Crossentropy)
Voor multi-class classificatie wordt doorgaans categorical crossentropy gebruikt als verliesfunctie. Dit kan als volgt worden geïmplementeerd:
Metrieken
De modelprestaties worden gevolgd met behulp van metriekwaarden voor classificatietaken, zoals nauwkeurigheid, precisie, recall, enzovoort. Deze kunnen als volgt worden gedefinieerd:
Compileren
4. Het trainen van het model
Het trainen van een CNN omvat het aanbieden van de invoergegevens aan het netwerk, het berekenen van het verlies en het bijwerken van de gewichten met behulp van backpropagation. Het trainingsproces wordt aangestuurd door de volgende kernmethoden:
Model trainen: de
fit()
-methode wordt gebruikt om het model te trainen. Deze methode neemt de trainingsgegevens, het aantal epochs en de batchgrootte als invoer. Er is ook een optionele validatiesplit om de prestaties van het model op niet eerder geziene gegevens tijdens de training te evalueren:
Batchgrootte en epochs: de batchgrootte bepaalt het aantal voorbeelden dat wordt verwerkt voordat de modelgewichten worden bijgewerkt, en het aantal epochs verwijst naar hoe vaak de volledige dataset door het model wordt gehaald.
5. Evaluatie
Classificatierapport
sklearn.metrics.classification_report()
vergelijkt ware en voorspelde waarden uit de testdataset. Het bevat precisie, recall en F1-score voor elke klasse. De methoden vereisen echter alleen klassenlabels, dus vergeet niet deze terug te converteren van vectoren ([0,0,1,0]
-> 2
):
Evalueren
Zodra het model is getraind, wordt het geëvalueerd op de testdataset om het generalisatievermogen te beoordelen. De evaluatie levert metriek op, die werden genoemd in de .compile()
-methode. De evaluatie wordt uitgevoerd met behulp van .evaluate()
:
Confusiematrix
Om meer inzicht te krijgen in de prestaties van het model, kunnen we de confusiematrix visualiseren, die de true positive, false positive, true negative en false negative voorspellingen voor elke klasse toont. De confusiematrix kan worden berekend met TensorFlow:
Deze matrix kan vervolgens worden gevisualiseerd met behulp van heatmaps om te observeren hoe goed het model presteert op elke klasse:
1. Dataset laden en preprocessen
Importeer de CIFAR-10 dataset vanuit Keras;
Normaliseer de pixelwaarden naar het bereik
[0,1]
voor betere convergentie;Zet de klasse-labels om naar
one-hot encoded
formaat voor categorische classificatie.
2. Definieer het CNN-model
Implementeer een VGG-achtige CNN-architectuur met de volgende kernlagen:
Convolutionele lagen:
Kernelgrootte:
3×3
;Activatiefunctie:
ReLU
;Padding:
'same'
.
Pooling-lagen:
Poolingtype:
max pooling
;Poolinggrootte:
2×2
.
Dropout-lagen (Voorkom overfitting door willekeurig neuronen uit te schakelen):
Dropout-percentage:
25%
.
Flatten-laag - zet 2D feature maps om naar een 1D vector voor classificatie.
Volledig verbonden lagen - dense lagen voor uiteindelijke classificatie, met een relu- of softmax-uitvoerlaag.
Compileer het model met:
Adam optimizer
(voor efficiënte training);Categorical cross-entropy
verliesfunctie (voor multi-class classificatie);Accuracy metric
om prestaties te meten (klassen zijn gebalanceerd, en je kunt zelf andere metrics toevoegen).
3. Train het model
Specificeer
epochs
enbatch_size
parameters voor training (bijv.epochs=20, batch_size=64
);Specificeer de
validation_split
parameter om het percentage trainingsdata dat validatie wordt te bepalen, zodat de modelprestaties op ongeziene afbeeldingen gevolgd kunnen worden;Sla de trainingsgeschiedenis op om nauwkeurigheid en verliestrends te visualiseren.
4. Evalueer en visualiseer resultaten
Test het model op CIFAR-10 testdata en toon de nauwkeurigheid;
Plot trainingsverlies versus validatieverlies om overfitting te controleren;
Plot trainingsnauwkeurigheid versus validatienauwkeurigheid om de leervoortgang te waarborgen.
Bedankt voor je feedback!