Bildklassifizierung mit CNN: Python-Implementierung

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

Hallo Leute! In diesem Blog, Ich werde alles über die Bildklassifizierung besprechen.

In den vergangenen Jahren, Deep Learning hat sich aufgrund seiner Fähigkeit, große Datenmengen zu verarbeiten, als sehr leistungsfähiges Werkzeug erwiesen. Die Verwendung versteckter Schichten geht über traditionelle Techniken hinaus, speziell zur Mustererkennung. Eines der beliebtesten tiefen neuronalen Netze sind konvolutionelle neuronale Netze (CNN).

46151deep_learning_software_de_1380x735px_1150x_-8179956

Ein konvolutionelles neuronales Netzwerk (CNN) es ist eine Art Rote neuronale künstliche (ANN) verwendet in der Bilderkennung und -verarbeitung, die speziell auf die Verarbeitung von Daten ausgelegt ist (Pixel).

87612082918_1325_convnetconv1-3625425

Bildquelle: Google.com

Bevor es weitergeht, wir müssen verstehen, was das neuronale Netz ist. Lass uns gehen…

Rotes Neuron:

Ein neuronales Netz besteht aus mehreren miteinander verbundenen Knoten, genannt “Neuronen”. Neuronen sind angeordnet in Eingabeschicht, versteckte Schicht und Ausgabeschicht. Die Eingabeschicht entspricht unseren Prädiktoren / Eigenschaften und die Ausgabeschicht zu unseren Antwortvariablen.

27250neuronales-netzwerk-1719512

Bildquelle: Google.com

Mehrschichtiges Perzeptron (MLP):

Das neuronale Netz mit einer Eingabeschicht, eine oder mehrere versteckte Schichten und eine Ausgabeschicht wird aufgerufen mehrschichtiges Perzeptron (MLP). MLP wird erfunden von Frank Rosenblatt Im Jahr von 1957. Das unten gezeigte MLP hat 5 Eingabeknoten, 5 Hidden Nodes mit zwei Hidden Layern und einem Exit Node

49705nn-7229061

Bildquelle: Google.com

Wie funktioniert dieses neuronale Netz?

– Die Neuronen der Eingabeschicht erhalten eingehende Informationen aus den Daten, die sie verarbeiten und an die versteckte Schichten.

– Diese Informationen, zur selben Zeit, wird von versteckten Layern verarbeitet und an die Ausgabe übergeben. Neuronen.

– Die Informationen aus diesem künstlichen neuronalen Netz (ANN) wird im Sinne von a . verarbeitet Weckfunktion. Diese Funktion ahmt tatsächlich Neuronen im Gehirn nach.

– Jedes Neuron enthält einen Wert von Triggerfunktionen und ein Schwellwert.

– Das Schwellwert ist der Mindestwert, den der Eingang haben muss, damit er aktiviert wird.

– Die Aufgabe des Neurons besteht darin, eine gewichtete Summe aller Eingangssignale durchzuführen und die Aktivierungsfunktion auf die Summe anzuwenden, bevor sie an die nächste Schicht übergeben wird. (versteckt oder verlassen).

Lassen Sie uns verstehen, was die Gewichtungssumme ist.

Nehmen wir an, wir haben Werte 𝑎1, 𝑎2, 3, 𝑎4 für Eingabe und Gewichte als 𝑤1, 𝑤2, 3, 𝑤4 als Eingabe für eines der Neuronen der versteckten Schicht, sagen wir, dann wird die gewichtete Summe dargestellt als

𝑆𝑗 = σ 𝑖 = 1bis4 𝑤𝑖 * ai + 𝑏𝑗

wo: Verzerrung durch Knoten

33975ws-2271857

Bildquelle: Google.com

Was sind die Aktivierungsfunktionen?

Diese Funktionen sind notwendig, um eine Nichtlinearität in das Netzwerk einzuführen. Die Triggerfunktion wird angewendet und diese Ausgabe wird an die nächste Schicht übergeben.

* Mögliche Funktionen *

• Sigmoide: Sigmoidfunktion ist differenzierbar. Erzeugt eine Ausgabe zwischen 0 Ja 1.

• Hyperbolischer Tangens: Der hyperbolische Tangens ist auch differenzierbar. Dies erzeugt eine Ausgabe zwischen -1 Ja 1.

• ReLU: ReLU ist die beliebteste Funktion. ReLU wird häufig im Deep Learning verwendet.

• Softmax: Die Softmax-Funktion wird für Klassifikationsprobleme mit mehreren Klassen verwendet. Es ist eine Verallgemeinerung der Sigmoidfunktion. Es erzeugt auch eine Ausgabe zwischen 0 Ja 1

Jetzt, Los geht's mit unserem CNN-Thema …

CNN:

Stellen Sie sich nun vor, es gibt ein Bild von einem Vogel, und du willst es identifizieren, ob es wirklich ein Vogel oder etwas anderes ist. Als erstes müssen Sie die Bildpixel in Form von Arrays in die Eingabeschicht des neuronalen Netzes einspeisen (MLP-Netzwerke werden verwendet, um solche Dinge zu klassifizieren). Ausgeblendete Layer tragen Feature-Extraktion durch Ausführen verschiedener Berechnungen und Operationen. Es gibt mehrere versteckte Schichten wie Faltung, die ReLU und die Gruppierungsebene, die die Merkmalsextraktion aus Ihrem Bild durchführt. Dann, Schließlich, es gibt eine vollständig verbundene Ebene, die Sie sehen können, die das genaue Objekt im Bild identifiziert. Sie können sehr leicht aus der folgenden Abbildung verstehen:

20451cnn3-7880418

Bildquelle: Google.com

Faltung:-

Die Faltungsoperation beinhaltet Matrixarithmetikoperationen und jedes Bild wird als ein Array von Werten dargestellt (Pixel).

Lass uns das Beispiel verstehen:

a = [2,5,8,4,7,9]

b = [1,2,3]

In der Faltungsoperation, Matrizen werden eins zu eins in Bezug auf die Elemente multipliziert, und das Produkt wird gruppiert oder summiert, um eine neue Matrix zu erstellen, die darstellt ein * B.

Die ersten drei Elemente des Arrays ein jetzt mit den Elementen des Arrays multiplizieren B. Das Produkt wird addiert, um das Ergebnis zu erhalten und wird in einer neuen Matrix von gespeichert ein * B.

Dieser Vorgang bleibt kontinuierlich, bis der Vorgang abgeschlossen ist..

29760cnn-2359666

Bildquelle: Google.com

Gruppierung:

Nach der Faltung, es gibt eine andere Operation namens Gruppierung. Dann, In der Kette, Faltung und Gruppierung werden sequentiell auf die Daten angewendet, um einige Merkmale aus den Daten zu extrahieren. Nach sequentiellen Cluster- und Faltungsschichten, Daten werden abgeflacht
in einem rückgekoppelten neuronalen Netz, das auch als mehrschichtiges Perzeptron bezeichnet wird.

80513Verstehen20Convolutional20neural20Networks20through20visualizations20pytorch20image20classifier-9877439

Bildquelle: Google.com

Bisher, Wir haben Konzepte gesehen, die für unser CNN-Gebäudemodell wichtig sind.

Jetzt werden wir weitermachen, um eine CNN-Fallstudie zu sehen.

1) Hier importieren wir die notwendigen Bibliotheken, die zum Ausführen von CNN-Aufgaben erforderlich sind..

import NumPy as np
%matplotlib inline
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import TensorFlow as tf
tf.compat.v1.set_random_seed(2019)

2) Hier benötigen wir den folgenden Code, um das CNN-Modell zu bilden

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16,(3,3),Aktivierung = "Lebenslauf" , input_shape = (180,180,3)) ,
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(32,(3,3),Aktivierung = "Lebenslauf") ,  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64,(3,3),Aktivierung = "Lebenslauf") ,  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128,(3,3),Aktivierung = "Lebenslauf"),  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(), 
    tf.harte.Schichten.Dense(550,Aktivierung="Lebenslauf"),      #Adding the Hidden layer
    tf.keras.layers.Dropout(0.1,Samen = 2019),
    tf.harte.Schichten.Dense(400,Aktivierung ="Lebenslauf"),
    tf.keras.layers.Dropout(0.3,Samen = 2019),
    tf.harte.Schichten.Dense(300,Aktivierung="Lebenslauf"),
    tf.keras.layers.Dropout(0.4,Samen = 2019),
    tf.harte.Schichten.Dense(200,Aktivierung ="Lebenslauf"),
    tf.keras.layers.Dropout(0.2,Samen = 2019),
    tf.harte.Schichten.Dense(5,Aktivierung = "softmax")   #Hinzufügen der Ausgabeebene
])

Ein verworrenes Bild kann zu groß sein und, Daher, Schrumpft ohne Verlust von Features oder Mustern, Die Gruppierung ist also erledigt.

Hier, Um ein neuronales Netzwerk zu erstellen, wird das Netzwerk mit dem sequenziellen Keras-Modell initialisiert.

Abflachen (): Durch das Reduzieren wird ein zweidimensionales Array von Features in einen Vektor von Features umgewandelt..

3) Schauen wir uns nun eine Zusammenfassung des CNN-Modells an

Modell.Zusammenfassung()

Sie drucken die folgende Ausgabe

Modell: "sequenziell"
________________________________________________________________________________
Schicht (Typ)                 Parameter der Ausgabeform #   
=================================================================
conv2d (Conv2D)              (Keiner, 178, 178, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (Keiner, 89, 89, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (Keiner, 87, 87, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (Keiner, 43, 43, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (Keiner, 41, 41, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (Keiner, 20, 20, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (Keiner, 18, 18, 128)       73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (Keiner, 9, 9, 128)         0         
_________________________________________________________________
flatten (Ebnen)            (Keiner, 10368)             0         
_________________________________________________________________
dense (Dicht)                (Keiner, 550)               5702950   
_________________________________________________________________
dropout (Aussteigen)            (Keiner, 550)               0         
_________________________________________________________________
dense_1 (Dicht)              (Keiner, 400)               220400    
________________________________________________________________________________
dropout_1 (Aussteigen)          (Keiner, 400)               0         
________________________________________________________________________________
dicht_2 (Dicht)              (Keiner, 300)               120300    
_________________________________________________________________
dropout_2 (Aussteigen)          (Keiner, 300)               0         
________________________________________________________________________________
dicht_3 (Dicht)              (Keiner, 200)               60200     
_________________________________________________________________
dropout_3 (Aussteigen)          (Keiner, 200)               0         
_________________________________________________________________
dense_4 (Dicht)              (Keiner, 5)                 1005      
================================================ ===============
Gesamtparameter: 6,202,295
Trainierbare Parameter: 6,202,295
Nicht trainierbare Parameter: 0

4) Jetzt sind wir verpflichtet, Optimierer anzugeben.

Importieren Sie RMSprop von tensorflow.keras.optimizers,SGD,Adam
adam=Adam(lr=0,001)
model.compile(Optimierer="Adam", Verlust="kategoriale_Kreuzentropie", Metriken = ['bezüglich'])

Der Optimierer wird verwendet, um die berechneten Kosten pro Kreuzentropie zu reduzieren

Die Verlustfunktion wird verwendet, um den Fehler zu berechnen.

Der Begriff Metriken wird verwendet, um die Effizienz des Modells darzustellen.

5) In diesem Schritt, Wir werden sehen, wie Sie das Datenverzeichnis konfigurieren und Bilddaten generieren.

bs=30         #Setting batch size
train_dir = "D:/Data Science/Bilddatensätze/FastFood/Zug/"   #Setting training directory
validation_dir = "D:/Data Science/Bilddatensätze/FastFood/Test/"   #Setting testing directory
from tensorflow.keras.preprocessing.image import ImageDataGenerator 
# Alle Bilder werden neu skaliert von 1./255.
train_datagen = ImageDataGenerator( neu skalieren = 1.0/255. )
test_datagen = ImageDataGenerator( neu skalieren = 1.0/255. )
# Flow-Trainingsbilder in Stapeln von 20 using train_datagen generator
#Flow_from_directory function lets the classifier directly identify the labels from the name of the directories the image lies in
train_generator=train_datagen.flow_from_directory(train_dir,batch_size=bs,class_mode="kategorisch",target_size=(180,180))
# Flow-Validierungsbilder in Stapeln von 20 using test_datagen generator
validation_generator =  test_datagen.flow_from_directory(validation_dir,
                                                         batch_size=bs,
                                                         class_mode="kategorisch",
                                                         target_size=(180,180))

La salida será:

Gefunden 1465 Bilder, die zu 5 Klassen.
Gefunden 893 Bilder, die zu 5 Klassen.

6) Paso final del modelo de ajuste.

Geschichte = model.fit(train_generator,
                    validation_data=validation_generator,
                    steps_per_epoch=150 // Bs,
                    Epochen=30,
                    validation_steps=50 // Bs,
                    ausführlich=2)

La salida será:

Epoche 1/30
5/5 - 4S - Verlust: 0.8625 - acc: 0.6933 - Wertverlust: 1.1741 - val_acc: 0.5000
Epoche 2/30
5/5 - 3S - Verlust: 0.7539 - acc: 0.7467 - Wertverlust: 1.2036 - val_acc: 0.5333
Epoche 3/30
5/5 - 3S - Verlust: 0.7829 - acc: 0.7400 - Wertverlust: 1.2483 - val_acc: 0.5667
Epoche 4/30
5/5 - 3S - Verlust: 0.6823 - acc: 0.7867 - Wertverlust: 1.3290 - val_acc: 0.4333
Epoche 5/30
5/5 - 3S - Verlust: 0.6892 - acc: 0.7800 - Wertverlust: 1.6482 - val_acc: 0.4333
Epoche 6/30
5/5 - 3S - Verlust: 0.7903 - acc: 0.7467 - Wertverlust: 1.0440 - val_acc: 0.6333
Epoche 7/30
5/5 - 3S - Verlust: 0.5731 - acc: 0.8267 - Wertverlust: 1.5226 - val_acc: 0.5000
Epoche 8/30
5/5 - 3S - Verlust: 0.5949 - acc: 0.8333 - Wertverlust: 0.9984 - val_acc: 0.6667
Epoche 9/30
5/5 - 3S - Verlust: 0.6162 - acc: 0.8069 - Wertverlust: 1.1490 - val_acc: 0.5667
Epoche 10/30
5/5 - 3S - Verlust: 0.7509 - acc: 0.7600 - Wertverlust: 1.3168 - val_acc: 0.5000
Epoche 11/30
5/5 - 4S - Verlust: 0.6180 - acc: 0.7862 - Wertverlust: 1.1918 - val_acc: 0.7000
Epoche 12/30
5/5 - 3S - Verlust: 0.4936 - acc: 0.8467 - Wertverlust: 1.0488 - val_acc: 0.6333
Epoche 13/30
5/5 - 3S - Verlust: 0.4290 - acc: 0.8400 - Wertverlust: 0.9400 - val_acc: 0.6667
Epoche 14/30
5/5 - 3S - Verlust: 0.4205 - acc: 0.8533 - Wertverlust: 1.0716 - val_acc: 0.7000
Epoche 15/30
5/5 - 4S - Verlust: 0.5750 - acc: 0.8067 - Wertverlust: 1.2055 - val_acc: 0.6000
Epoche 16/30
5/5 - 4S - Verlust: 0.4080 - acc: 0.8533 - Wertverlust: 1.5014 - val_acc: 0.6667
Epoche 17/30
5/5 - 3S - Verlust: 0.3686 - acc: 0.8467 - Wertverlust: 1.0441 - val_acc: 0.5667
Epoche 18/30
5/5 - 3S - Verlust: 0.5474 - acc: 0.8067 - Wertverlust: 0.9662 - val_acc: 0.7333
Epoche 19/30
5/5 - 3S - Verlust: 0.5646 - acc: 0.8138 - Wertverlust: 0.9151 - val_acc: 0.7000
Epoche 20/30
5/5 - 4S - Verlust: 0.3579 - acc: 0.8800 - Wertverlust: 1.4184 - val_acc: 0.5667
Epoche 21/30
5/5 - 3S - Verlust: 0.3714 - acc: 0.8800 - Wertverlust: 2.0762 - val_acc: 0.6333
Epoche 22/30
5/5 - 3S - Verlust: 0.3654 - acc: 0.8933 - Wertverlust: 1.8273 - val_acc: 0.5667
Epoche 23/30
5/5 - 3S - Verlust: 0.3845 - acc: 0.8933 - Wertverlust: 1.0199 - val_acc: 0.7333
Epoche 24/30
5/5 - 3S - Verlust: 0.3356 - acc: 0.9000 - Wertverlust: 0.5168 - val_acc: 0.8333
Epoche 25/30
5/5 - 3S - Verlust: 0.3612 - acc: 0.8667 - Wertverlust: 1.7924 - val_acc: 0.5667
Epoche 26/30
5/5 - 3S - Verlust: 0.3075 - acc: 0.8867 - Wertverlust: 1.0720 - val_acc: 0.6667
Epoche 27/30
5/5 - 3S - Verlust: 0.2820 - acc: 0.9400 - Wertverlust: 2.2798 - val_acc: 0.5667
Epoche 28/30
5/5 - 3S - Verlust: 0.3606 - acc: 0.8621 - Wertverlust: 1.2423 - val_acc: 0.8000
Epoche 29/30
5/5 - 3S - Verlust: 0.2630 - acc: 0.9000 - Wertverlust: 1.4235 - val_acc: 0.6333
Epoche 30/30
5/5 - 3S - Verlust: 0.3790 - acc: 0.9000 - Wertverlust: 0.6173 - val_acc: 0.8000

La función anterior entrena la red neuronal utilizando el conjunto de entrenamiento y evalúa su rendimiento en el conjunto de prueba. Las funciones devuelven dos métricas para cada época 'acc’ y 'val_acc’ das sind die Genauigkeit der im Trainingssatz erhaltenen Vorhersagen und die im Testsatz erreichte Genauigkeit, beziehungsweise.

Fazit:

Deswegen, wir sehen, dass es mit ausreichender Genauigkeit getroffen wurde. Aber trotzdem, Jeder kann dieses Modell ausführen, indem er die Anzahl der Epochen oder einen anderen Parameter erhöht.

Ich hoffe dir hat mein Artikel gefallen. Teile mit deinen Freunden, Kollegen.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.