In der sich ständig weiterentwickelnden Landschaft der künstlichen Intelligenz haben sich Convolutional Neural Networks (CNNs) als revolutionäre Kraft erwiesen, insbesondere im Bereich der Bilderkennung und Computer Vision. Diese fortschrittlichen Lernmodelle ahmen die Fähigkeit des menschlichen Gehirns nach, visuelle Informationen zu verarbeiten, und sind daher äußerst effektiv für Aufgaben wie Gesichtserkennung und autonomes Fahren.
Das Verständnis der grundlegenden Prinzipien von Convolutional Neural Networks (CNNs) ist aus mehreren Gründen wichtig: Das Erfassen der Grundlagen dient als Sprungbrett zu komplexeren Konzepten in der künstlichen Intelligenz und dem Deep Learning. Das Wissen über die Architektur von CNNs ermöglicht es, neuronale Netzwerke zu entwerfen und anzupassen, die für spezifische Aufgaben wie Bildklassifizierung oder Objekterkennung optimiert sind, und bietet darüber hinaus weitere Vorteile.
Grundkonzepte
Convolutional Neural Networks (CNNs) stehen an der Spitze der Fortschritte in der Bilderkennung und -verarbeitung. Sie sind so konzipiert, dass sie dynamisch strukturelle Schichten von Merkmalen aus visuellen Daten erwerben. Die beiden zentralen Komponenten von CNNs sind die Convolutional Layer und die Fully Connected Layer, die zusammenarbeiten, um Bilddaten zu verarbeiten und zu klassifizieren und in diesem Artikel im Detail beschrieben werden. Bevor die Daten in die Fully Connected Layer eingespeist werden können, müssen sie von einer 2D-Merkmalskarte in einen 1D-Vektor umgewandelt werden. Dieser Vorgang wird als Flattening bezeichnet. Flattening rollt die Merkmalskarten zu einem einzigen langen Vektor auf und bereitet die Daten auf die nächste Verarbeitungsphase vor. Das Verständnis dieser drei Hauptkomponenten bildet die Grundlage für das weitere Studium von Convolutional Neural Networks.
Convolutional Layer (Faltungsschicht)
Um das Funktionsprinzip der Schlüsselkomponente der Convolutional Layer im Convolutional Neural Network besser zu verstehen, stellen wir uns die Frage: Was unterscheidet eine Vier von einer Acht?
Die Vier besteht hauptsächlich aus horizontalen und vertikalen Linien, während die Acht diagonale Linien aufweist.
Um diese Idee auf neuronale Netzwerke zu übertragen, betrachten wir die folgende Abbildung. Jede Zahl von 0 bis 9, die im MNIST-Datensatz dargestellt ist, wird als quadratische Matrix der Größe 32 dargestellt, wobei der Wert jedes Elements zwischen 0 und 255 liegt.
Nun müssen wir das Konzept der Convolution und des Kernels (Filters) einführen. Der Kernel (Filter) in neuronalen Netzwerken ist eine Gewichtsmatrix, die in Convolutional Layers verwendet wird, um bestimmte Merkmale aus den Eingangsdaten zu extrahieren. Der Convolution-Kern (Filter) ist wie eine Glühbirne, die je nach benötigtem Muster aufleuchtet (reagiert auf Linien). Die Convolution-Operation in neuronalen Netzwerken ist ein Prozess, bei dem die Filterelemente Element für Element mit den Elementen des Bildes multipliziert werden, auf dem sich der Filter befindet. Die Aktivierungsfunktion (act) wird nach jeder Convolutional Layer oder Fully Connected Layer auf die Aktivierungskarte für jedes Element in der zweidimensionalen Matrix angewendet. Der Parameter „Stride“ bestimmt, wie weit sich der Kern bei jeder Iteration bewegt. Zum Beispiel führt die Verwendung des Kernels zur Erkennung von vertikalen und horizontalen Linien bei einer Vier(4)-Bildmatrix zu einer Aktivierungskarte mit hohen Koeffizienten.
Weiter vorausblickend wird die Auswahl der Matrixkoeffizienten (Gewichte) von einer Deep-Learning-Bibliothek wie TensorFlow, Keras oder PyTorch durchgeführt. Der Mechanismus zur Auswahl der Matrixkoeffizienten (Gewichte) ist derselbe wie bei der Fully Connected Layer und wird im entsprechenden Abschnitt weiter erläutert.
Verwendung mehrerer Convolutional Layers
Für reale Bilder reicht eine einzelne Convolution-Operation nicht aus, um alle notwendigen Informationen aus dem Bild zu extrahieren.
Im echten Leben bestehen Figuren nicht nur aus vertikalen und horizontalen Linien, sondern enthalten komplexere Strukturen. Zum Beispiel handgeschriebene Zahlen, Automodelle und menschliche Gesichter. Um dies klarer zu erklären, müssen wir eine so komplexe Struktur wie das menschliche Gesicht betrachten. In diesem Fall hilft es nicht, nur eine Convolution und einen Filter zu verwenden, der auf horizontale Linien reagiert, um zu verstehen, zu welcher Person das Gesicht gehört. Daher sind mehrere Schichten von Convolutions nützlich. Für diese Aufgabe besteht das Convolutional Neural Network aus folgenden Schichten:
1. Muster auf niedriger Ebene
2. Muster von einzelnen Teilen des Gesichts
3. Bildmuster, die für die Aufgabe wichtig sind
Fully Connected Layer
Das Funktionsprinzip der Fully Connected Layer ähnelt stark der zuvor besprochenen Convolutional Layer. Eine schematische Darstellung der Fully Connected Layer ist in der Abbildung zu sehen.
Die Verwechslung zwischen Fully Connected Layers (FC) und Convolutional Layers ist aufgrund unterschiedlicher schematischer Darstellungen häufig. Wie wir sehen können, zeigt das Diagramm Neuronen anstelle von quadratischen Matrizen. Aber das Funktionsprinzip ist dasselbe wie bei der oben diskutierten Convolutional Layer. Der erste Eingang ist ein Bild der Größe 28 mal 28. Das bedeutet, dass es 784 Pixel hat. Jedes Pixel ist eine separate Variable. Jeder Eingang geht mit seinem eigenen Gewicht zu jedem der 128 Ausgänge. Das ergibt 100.352 Gewichte. Die Zahl 128 wurde zufällig gewählt, da sie in Bezug auf Leistung und Qualität für die versteckte Schicht optimal ist. Wir werden auch 128 freie Terme (Konstanten) für jeden der Neuronen der ersten Schicht trainieren. Insgesamt gibt es 100.480 Parameter. Für die zweite Schicht ist die Anzahl der Ausgänge bekannt – 10 Ziffern von 0 bis 9. Daher ergibt 128 x 10 + 10 gleich 1290 Gewichte. Schauen wir uns nun die Hauptunterschiede zwischen Fully Connected Layers (FC) und Convolutional Layers an.
Unterschiede zwischen Fully Connected Layer und Convolutional Layer:
1. Funktionalität:
– Convolutional Layer: Konzentriert sich hauptsächlich auf die Identifizierung lokaler Muster in den Eingangsdaten durch die Verwendung von Filtern. Sie ist geschickt in der räumlichen Merkmalsextraktion und bewahrt die räumliche Hierarchie des Eingangs.
– Fully Connected Layer: Zielt darauf ab, die von der Convolutional Layer identifizierten lokalen Merkmale zu integrieren, um globale Muster zu lernen, die bei Aufgaben wie der Klassifizierung helfen.
2. Konnektivität:
– Convolutional Layer: Neuronen in dieser Schicht sind nur mit einem lokalen Bereich des Eingangs verbunden, was die räumliche Struktur bewahrt.
– Fully Connected Layer: Neuronen hier sind mit allen Aktivierungen aus der vorherigen Schicht verbunden, daher der Name „vollständig verbunden“.
3. Parameter Sharing:
– Convolutional Layer: Verwendet Parameter-Sharing, was bedeutet, dass derselbe Filter über den gesamten Eingang hinweg angewendet wird, wodurch die Anzahl der Parameter erheblich reduziert wird.
– Fully Connected Layer: Verwendet kein Parameter-Sharing; jedes Gewicht ist einzigartig für eine bestimmte Verbindung zwischen Neuronen.
4. Ausgabe-Darstellung:
– Convolutional Layer: Erzeugt eine 2D-Aktivierungskarte, die verschiedene Merkmale der Eingangsdaten darstellt.
– Fully Connected Layer: Gibt einen 1D-Vektor aus, der hochgradige Merkmale darstellt, die nach dem Flattening der 2D-Aktivierungskarten aus den Eingangsdaten abgeleitet wurden.
5. Rolle im Netzwerk:
– Convolutional Layer: Dient als Merkmalsextraktor, der wichtige Merkmale unabhängig von ihrer Position im Eingang identifiziert.
– Fully Connected Layer: Dient als Klassifikator, der die extrahierten Merkmale verwendet, um eine endgültige Vorhersage oder Entscheidung zu treffen.
6. Präsenz im Netzwerk:
– Convolutional Layer: Spezifisch für CNNs und in anderen Arten von neuronalen Netzwerken nicht zu finden.
– Fully Connected Layer: Häufig in vielen Arten von neuronalen Netzwerken, nicht nur in CNNs.
Das Verständnis dieser Unterschiede ist entscheidend für die Gestaltung und Implementierung effektiver neuronaler Netzwerkarchitekturen für verschiedene maschinelle Lernaufgaben.
TensorFlow, Keras und MNIST Datensatz
Die einfachste Form zum Aufbau eines neuronalen Netzwerks zur Identifizierung von handgeschriebenen Ziffern von 0 bis 9, wie in diesem Artikel diskutiert – die Eingangs- und Ausgangsschichten. Da die Größe des Quellbildes 28×28 Pixel beträgt, hat die Eingangsschicht 28×28=784 Neuronen. Jedes Neuron ist mit einem Pixel im Bild verbunden. Die Ausgangsschicht enthält 10 Neuronen, da es 10 Ziffern von 0 bis 9 gibt.
MNIST ist eines der klassischen Datensätze, auf denen es üblich ist, verschiedene Ansätze zur Klassifizierung (und nicht nur) von Bildern auszuprobieren. Der Datensatz enthält 60.000 (Trainingsdaten) und 10.000 (Testdaten) Schwarz-Weiß-Bilder der Größe 28×28 Pixel von handgeschriebenen Zahlen von 0 bis 9. TensorFlow bietet ein Standard-Skript zum Herunterladen und Bereitstellen dieses Datensatzes sowie zum Laden der Daten in Tensoren, was sehr praktisch ist.
Das Laden des MNIST Datensatzes mit Beispielen und die Aufteilung in Trainings- und Testdaten sind in der Abbildung dargestellt:
Auf der Abbildung sind Beispiele von zufälligen 20 Elementen aus dem MNIST Datensatz dargestellt.
Es wird die Transformation der Werte von 255 auf 1 angezeigt, um mit der TensorFlow-Bibliothek zu arbeiten.
Als nächstes betrachten wir den Aufbau des Faltungsnetzwerks selbst. Sequential dient zur Beschreibung eines neuronalen Netzwerkmodells, das eine Eingabe-, versteckte und Ausgangsschicht hat. Flatten konvertiert ein mehrdimensionales Array in eine eindimensionale Eingabe. Zunächst wird eine Eingangsschicht mit 128 Neuronen erstellt. Die Haupt-Faltungsschicht enthält 128 „Neuronen“. Als Aktivierungsfunktion wird die mathematische Funktion tf.nn.ReLU verwendet. ReLU ist die Standard-Aktivierungsfunktion für Faltungsschichten. Der Bereich von ReLU liegt zwischen Null und Unendlich. Dies vereinfacht das Training und verbessert die Leistung.
Die Ausgangsschicht entspricht den 10 erkannten Ziffern. Diese Schicht hilft dem Netzwerk, Vorhersagen zu treffen. In diesem Schritt wird eine softmax-Aktivierungsfunktion verwendet: Es handelt sich dabei um ein Abstimmungssystem für die 10 Neuronen in der zweiten Schicht. Das System wandelt Neuronausgaben in Wahrscheinlichkeiten um, die das Vertrauen des Netzwerks in 10 mögliche Optionen widerspiegeln. Diese Zahlen könnten wie folgt aussehen: [48,3, 18,3, 4,3, 0,7, 13,2, 1,0, 2,0, 0,1, 1,5, 9,7]. Wenn wir softmax verwenden, werden diese Zahlen verständlicher gemacht. Es komprimiert die Werte, um sicherzustellen, dass ihre Summe 1 ergibt. Es ist wie zu sagen: „Wie sicher ist sich das Netzwerk bei jeder Option?“ Nach softmax werden die Zahlen zu diesem Array: [0,483, 0,183, 0,043, 0,007, 0,132, 0,010, 0,020, 0,001, 0,015, 0,097]. Diese neuen Zahlen geben nun die Wahrscheinlichkeiten an. Zum Beispiel ist das Netzwerk am sichersten (48,3%) bei der ersten Option (0,483).
Um ein einfaches Faltungsnetzwerk zu erstellen und handgeschriebene Zahlen mit TensorFlow zu erkennen, müssen Sie nur vier Schritte ausführen:
1. Erstellen Sie ein Objekt der Sequential-Klasse, um ein sequentielles Netzwerkmodell zu erstellen.
2. Flatten Sie die Schicht, um die Matrix in ein einzelnes Array zu konvertieren.
3. Versteckte vollständig verbundene Schicht mit 128 Neuronen, in der die Hauptarbeit im Zusammenhang mit dem Netzwerktraining stattfindet.
4. Ausgangs vollständig verbundene Schicht mit 10 Neuronen, wobei jedes Neuron einer Zahl von 0 bis 9 entspricht.
Diese Abfolge von Aktionen ist in der Abbildung dargestellt:
Hier ist der Prozess der Kompilierung und des Trainings unseres neuronalen Netzwerks dargestellt.
Im nächsten Schritt müssen wir die Leistung eines Deep-Learning-Modells an einem Testdatensatz mit Keras bewerten. Ziel dieser Aussage ist es, zu messen, wie gut das Modell nicht gesehene Daten generalisiert, und die Ergebnisse mit den Trainings- und Validierungsdatensätzen zu vergleichen. Ein gutes Modell sollte einen niedrigen Verlust und eine hohe Genauigkeit auf allen Sätzen haben und Überanpassung oder Unteranpassung vermeiden.
Dann müssen wir handgeschriebene Ziffern aus Bildern mithilfe des erstellten Modells erkennen. Wir lesen die Dateien als Bild mit Hilfe von cv2 ein und extrahieren den ersten Kanal (angenommen, es handelt sich um ein Graustufenbild) mit [:,:,0]. Es invertiert die Pixelwerte des Bildes mit np.invert, so dass der Hintergrund schwarz und die Ziffer weiß ist. Es wird eine Nachricht gedruckt, die sagt „Die Zahl ist wahrscheinlich eine {}“, wobei {} durch den Index der höchsten Wahrscheinlichkeit mit np.argmax ersetzt wird. Zum Beispiel, wenn die Vorhersage [0,1, 0,5, 0,2, 0,2, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0], wird es „Die Zahl ist wahrscheinlich eine 5“ drucken. Dann zeigen wir das Bild mit plt.imshow mit einer binären Farbkarte und plt.show an.
Das endgültige Ergebnis mit den erkannten Ziffern der Zahlen im Ordner Recognition wird in der Abbildung gezeigt. In diesem Fall beträgt die Anzahl der erkannten Dateien 5.
Zusammenfassend
In Zusammenfassung stellt die Entwicklung eines Faltungsnetzwerks (CNN) zur Erkennung handgeschriebener Ziffern einen wichtigen Schritt im Bereich der Computer Vision und des maschinellen Lernens für Anfänger dar. Dieser Artikel hat gezeigt, dass durch die grundlegende Architektur von CNN-Schichten und die Anwendung nichtlinearer Transformationen eine gute Genauigkeit bei der Klassifizierung einzelner Ziffern aus verschiedenen Handschriftstilen erreicht werden kann. Das Verständnis dieser Grundprinzipien ebnet Anfängern den Weg, wie sie im Bereich KI weiter vorgehen können. Indem wir die Modelle weiter verfeinern, die auf den in diesem Artikel beschriebenen Kenntnissen basieren, kommen wir näher an die Entwicklung von Systemen heran, die nicht nur handgeschriebene Ziffern erkennen können, sondern auch komplexere Strukturen bewältigen können.
Unsere Experten können Ihnen helfen, Software mit dieser Funktion zu erstellen. Kontaktieren Sie uns hier.