De code in Jupyter notebook geplakt

 

De code in Jupyter notebook geplakt

 

 

 

 

MobileNet  kan deze bloem niet classificeren

 
Het voor  opnieuw getrainde MobileNet model
kan deze passiebloem wel classificeren
 
 
 
 
 
 
 
 
waterlelie
 
Het mobileNet model
heeft voor deze waterlelie
een speciale training ondergaan

mobilenet model aanpassen en trainen voor classes met bloemen.               terug naar de inleiding

Zie stap 5:  er worden 5 lagen verwijdert en een outputlaag  met 2 nodi (2 classes) toegevoegd

De schets is een python 3.7.6  schets. De pakketten zijn in anaconda binnen een virtuele omgeving geinstalleerd.
De schets maakt gebruik van keras versie 2.3.1, numpy versie 1.18.1 en tensorflow versie 2.1.0

Stap 1, De benodigde pakketten importeren

 
 
import numpy as np 
import keras 
from keras.layers.core import Dense 
from keras.optimizers import Adam 
from keras.metrics import categorical_crossentropy 
from keras.preprocessing.image import ImageDataGenerator 
from keras.preprocessing import image 
from keras.models import Model 
from keras.applications import imagenet_utils 


Stap 2,
variabelen met paden naar de mappen met de afbeeldingen
De map train bevat de map passiebloem met 20 passiebloemen, en de map waterlelie, met 20 waterlelies
De map valid bevat de map passiebloem met 10 passiebloemen, en de map waterlelie met 10 waterlelies
Om het model te trainen met 4 classes, de mappen cyclaam en hibiscus toevoegen met submappen en afbeeldingen
De datasets dataset images gedownload van de site Visual Geometry Group

 

 
 
train_path = 'bloemen/train' 
valid_path = 'bloemen/valid' 


Stap 3,

ImageDataGenererator maakt batches van de afbeeldingen om het model te trainen en te valideren, zie stap 7
zie https://keras.io/preprocessing/image/

 
 
train_batches = ImageDataGenerator(preprocessing_function=keras.applications.mobilenet.preprocess_input).flow_from_directory(train_path, target_size=(224,224),batch_size=10) 
valid_batches = ImageDataGenerator(preprocessing_function=keras.applications.mobilenet.preprocess_input).flow_from_directory(valid_path, target_size=(224,224),batch_size=10) 

 
Stap 4,
Het mobileNet model downloaden


 
 
mobile = keras.applications.mobilenet.MobileNet()
mobile.summary() 


Stap 5,  Het model aanpassen dit gaat in 3 stappen
regel 2, Vanaf de outputlaag worden 5 lagen verwijdert
regel 3, De laag "predictions" wordt aangemaakt
regel 4, De predictions laag wordt als outputlaag ,met 2 neuronen, aan het model toegevoegd
Om 4 classes te trainen moet het model 4 output neuronen hebben, dus in regel 3 Dens(2 vervangen door Dense4

 
 
x = mobile.layers[-6].output 
predictions = Dense(2, activation='softmax')(x) 
model = Model(inputs=mobile.input, outputs=predictions) 
model.summary() 


Stap 6, Het model compileren waardoor de waarden van de gewichten tijdens de training worden genormalizeerd.
Stap 7, Het model trainen

Voor de train_batches: batch_size=10 aantal afbeeldingen = 40 -> 40/10 = 4 --> het aantal steps_per_epoch=4
Voor de valid_batches: batch_size=4 aantal afbeeldingen = 16 -> 16/4 = 4 --> het aantal validation_steps=4

 
 
model.compile(Adam(lr=.0001), loss='categorical_crossentropy', metrics=['accuracy'])
 
model.fit_generator(train_batches, steps_per_epoch=4, 
                   validation_data=valid_batches, validation_steps=4, epochs=10, verbose=2) 


Stap 8, Het model opslaan

 
 
model.save('bloem_model.h5') 

 

Het training en validatie resultaat

Epoch 1/10
 - 68s - loss: 0.5220 - accuracy: 0.7250 - val_loss: 0.7205 - val_accuracy: 0.5625
Epoch 2/10
 - 29s - loss: 0.0419 - accuracy: 1.0000 - val_loss: 0.6072 - val_accuracy: 0.8125
Epoch 3/10
 - 29s - loss: 0.0041 - accuracy: 1.0000 - val_loss: 0.0573 - val_accuracy: 0.8750
Epoch 4/10
 - 29s - loss: 3.9406e-04 - accuracy: 1.0000 - val_loss: 0.3819 - val_accuracy: 0.8750
Epoch 5/10
 - 29s - loss: 0.0056 - accuracy: 1.0000 - val_loss: 0.0138 - val_accuracy: 0.8750
Epoch 6/10
 - 29s - loss: 0.0042 - accuracy: 1.0000 - val_loss: 0.1404 - val_accuracy: 0.9375
Epoch 7/10
 - 29s - loss: 0.0018 - accuracy: 1.0000 - val_loss: 0.0065 - val_accuracy: 1.0000
Epoch 8/10
 - 29s - loss: 0.0357 - accuracy: 1.0000 - val_loss: 0.0414 - val_accuracy: 1.0000
Epoch 9/10
 - 29s - loss: 0.0011 - accuracy: 1.0000 - val_loss: 0.0184 - val_accuracy: 1.0000
Epoch 10/10
 - 30s - loss: 3.1709e-05 - accuracy: 1.0000 - val_loss: 0.0048 - val_accuracy: 1.0000