Die Daten bestehen aus 21.367 fachmännisch kommentierten Fotos, die während einer Untersuchung in den landwirtschaftlichen Gebieten Ugandas aufgenommen wurden. Die Sammlung stellt tatsächliche Feldszenarien dar, da die meisten Bilder von Landwirten stammen, die Fotos von ihren Farmen gemacht haben, und die Bilder von Forschern des Nationwide Crops Sources Analysis Institute (NaCRRI) in Zusammenarbeit mit dem Labor für künstliche Intelligenz der Makerere-Universität kommentiert wurden.
CNN-Modell
Die Architektur des verwendeten Modells besteht aus 4 Faltungsschichten und 2 vollständig verbundenen Schichten. Die erste Faltungsschicht verfügt über 32 3×3-Kernel, die auf das Eingabebild mit der Dimension 224x224x3 für das Characteristic-Lernen mit Relu-Aktivierung und maximalem Pooling mit einer gepoolten Größe von 2×2 angewendet werden. Die zweite Schicht besteht aus 64 3×3-Kerneln mit Relu-Aktivierung und maximalem Pooling mit einer Poolgröße von 2×2. Die dritte und vierte Schicht bestehen jeweils aus einer Faltungsschicht mit 128 3×3-Kerneln mit Relu-Aktivierung und maximalem Pooling mit einer Poolgröße von 2×2.
def create_model():# Instantiate mannequin
mannequin = fashions.Sequential()
# Add Convolution layer
mannequin.add(layers.Conv2D(filters=32, kernel_size=(3,3), input_shape=(224, 224, 3), activation="relu"))
mannequin.add(layers.MaxPool2D(pool_size=(2,2)))
# Add Convolution layer
mannequin.add(layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu"))
mannequin.add(layers.MaxPool2D(pool_size=(2,2)))
# Add Convolution layer
mannequin.add(layers.Conv2D(filters=128, kernel_size=(3,3), activation="relu"))
mannequin.add(layers.MaxPool2D(pool_size=(2,2)))
# Add Convolution layer
mannequin.add(layers.Conv2D(filters=128, kernel_size=(3,3), activation="relu"))
mannequin.add(layers.MaxPool2D(pool_size=(2,2)))
# Flatten out the mannequin
mannequin.add(layers.Flatten())
# Add Dense layer
mannequin.add(layers.Dense(128, activation='relu'))
mannequin.add(layers.Dropout(0.5))
# Add output layer
mannequin.add(layers.Dense(5, activation='softmax'))
# Compile the mannequin
mannequin.compile(optimizer='adam', loss = "categorical_crossentropy", metrics = ["accuracy"])
return mannequin
base_model = create_model()
Während des Modelltrainings wird das Coaching vorzeitig gestoppt, wenn der Validierungsgenauigkeitswert nach drei Epochen nicht ansteigt. Das Modell profitiert auch von der Reduzierung der Lernrate um den Faktor 1, wenn das Lernen nach 5 Epochen stagniert.
callback_list = [callbacks.EarlyStopping(monitor='val_accuracy', patience=3, mode='max', restore_best_weights=True),
callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, mode='min'),]
Unter Verwendung einer Bildstapelgröße von 32 wird das Modell über fünf Faltungen trainiert, wobei die Trainingsdaten vier Faltungen und die Validierungsdaten eine Faltung umfassen. Diese Faltungen werden fünfmal gedreht. Die erste Epoche der ersten Faltung hatte eine Genauigkeit von 0,6181 und eine Validierungsgenauigkeit von 0,6355, bis zur letzten Epoche der fünften Faltung waren die Genauigkeit und die Validierungsgenauigkeit um 0,7877 bzw. 0,795 gestiegen.
In der fünften Epoche scheint es über die gesamte Epoche hinweg gewisse Schwankungen in der Modellleistung zu geben, was darauf hindeutet, dass das Modell hier möglicherweise überangepasst ist. Das Modell erreichte eine Genauigkeit von 81 %, die Verwirrungsmatrix ist unten dargestellt.
Transferlernen – VGG 16-Modell
Transferlernen ist ein Ansatz des maschinellen Lernens, bei dem das aus einem vorab trainierten Modell gewonnene Wissen genutzt wird, um die Entwicklung eines neuen Modells für eine andere Aufgabe anzustoßen. Anstatt ein Modell von Grund auf neu zu erstellen, dient das vorab trainierte Modell als Grundlage und liefert wertvolle Erkenntnisse und verallgemeinerbare Funktionen, die an die neue Aufgabe angepasst und verfeinert werden können.
Um Transferlernen für diese Aufgabe zu implementieren, wird das ResNet101-v2-Modell ausgewählt. ResNet ist die Kurzform von Residual Community. Residual Community ähnelt Netzwerken mit vollständig verknüpften, Faltungs-, Pooling- und Aktivierungsschichten, die quick genau übereinander gestapelt sind. Ein ResNet101-Modell verfügt über 104 Faltungsschichten, die aus 33 Schichtblöcken bestehen, von denen 29 direkt in früheren Blöcken verwendet werden. In dieser Arbeit werden nach der Initialisierung des Modells die letzten dreizehn Schichten eingefroren und neue trainierbare Schichten hinzugefügt. Die erste Schicht ist die globale Pooling-Durchschnittsschicht, gefolgt von zwei vollständig verbundenen Schichten mit jeweils Relu-Aktivierungen, einer Dropout-Schicht mit einer Charge von 0,2 und dann einer ReLU-Schicht und schließlich einer Dropout-Schicht.
def create_model():# import mannequin
restnet101 = functions.ResNet101V2(include_top = False, weights = 'imagenet',
input_tensor = keras.Enter(form=(224, 224, 3)))
# freeze some convolution blocks
for layer in restnet101.layers[:-13]:
layer.trainable = False
# outline inputs
inputs = layers.Enter(form=(224, 224, 3))
# name the bottom mannequin on x
x = restnet101(inputs)
# Tremendous-tuning
x = layers.GlobalAveragePooling2D(identify="avg_pool")(x)
x = layers.Dense(256, activation = "relu")(x)
x = layers.Dense(256, activation = "relu")(x)
x = layers.Dropout(0.2)(x)
x = layers.ReLU()(x)
# Output layer
outputs = layers.Dense(5, activation="softmax", identify="pred")(x)
# Put the mannequin collectively
mannequin = keras.Mannequin(inputs, outputs, identify="EfficientNet")
# Compile
mannequin.compile(optimizer='adam', loss = "categorical_crossentropy", metrics = ["accuracy"])
return mannequin
resnet_model = create_model()
callback_list = [callbacks.EarlyStopping(monitor='val_accuracy', patience=3, mode='max', restore_best_weights=True),
callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, mode='min'),]
Unter Verwendung einer Bildstapelgröße von 32 und einer Bildeingabegröße für das Modell von 224 x 224 wird das Modell über fünf Faltungen trainiert, wobei die Trainingsdaten vier Faltungen und die Validierungsdaten eine Faltung umfassen. Diese Faltungen werden fünfmal gedreht. Die erste Epoche der ersten Faltung hatte eine Genauigkeit von 0,6922 und eine Validierungsgenauigkeit von 0,6902, bis zur letzten Epoche der fünften Faltung waren die Genauigkeit und die Validierungsgenauigkeit um 0,8339 bzw. 0,8212 gestiegen.
Das Modell erreichte eine Genauigkeit von 83 %, was eine Verbesserung gegenüber der Genauigkeit des vorherigen CNN-Modells darstellt. Die Verwirrungsmatrix ist unten dargestellt.
Um diese Modelle zu verbessern und bei dieser Aufgabe bessere Ergebnisse zu erzielen, können verschiedene Methoden in Betracht gezogen werden – diese können von der Erhöhung der Epoche über die Änderung der Eingabebatchgröße bis hin zur Optimierung anderer Parameter wie dem Optimierer und der Lernrate sowie der Verwendung verschiedener Regularisierungen im reichen dichte Schicht.
Angesichts der Verteilung des Datensatzes würde ein Ausgleich der Daten über alle Krankheitsklassen vor der Modellierung möglicherweise auch die Modellleistung verbessern.