Was ist ein Convolutional Neural Network?
Dr. Mark Bugden
Neuronale Netze, insbesondere Convolutional Neural Networks (CNNs), haben in den letzten Jahren stark an Popularität gewonnen. Sie sind in vielen Aufgaben der Bilderkennung und -verarbeitung allgegenwärtig und haben auch in mehreren Bereichen Anwendung gefunden, die nicht auf der Bildanalyse basieren.
In diesem Artikel geben wir eine Einführung in CNNs und beantworten einige der Fragen, die Sie Ihrer IT-Abteilung nicht zu stellen wagten.
Ist CNN Machine-Learning oder Deep-Learning?
Die kurze Antwort auf diese Frage lautet: beides. Um dies zu verdeutlichen, ist es hilfreich, klarzustellen, was diese Begriffe wirklich bedeuten.
Machine-Learning ist ein Bereich der künstlichen Intelligenz (KI), der sich mit Modellen und Algorithmen befasst, die lernen, Vorhersagen auf der Grundlage von Daten zu treffen, ohne dass sie ausdrücklich für diese Entscheidungen programmiert werden. Die Modelle lernen Muster und Beziehungen, indem sie mit vorhandenen Daten trainiert werden, und wenden dieses Wissen dann an, um in neuen Situationen Vorhersagen zu treffen.
Deep Learning hingegen ist ein Zweig des maschinellen Lernens, der sich auf die Entwicklung und den Einsatz von künstlichen neuronalen Netzen (eng. Artificial Neural Networks (ANNs)) konzentriert. Künstliche neuronale Netze wurden ursprünglich von den Verbindungen der Neuronen im menschlichen Gehirn inspiriert und können trainiert werden, um hierarchische Darstellungen von Daten zu lernen. Jedes neuronale Netz besteht aus Sammlungen von Neuronen, die als Schichten bezeichnet werden, und diese Schichten sind miteinander verbunden, um ein komplexes und kompliziertes Netz zu bilden. Ein neuronales Netz, das aus vielen Schichten von Neuronen besteht, wird als "tief" bezeichnet, und daher stammt auch der Begriff "Deep-Learning".
Ein Convolutional Neural Network ist ein Typ von neuronalem Netzwerk, bei dem zumindest einige der Schichten aus Faltungsschichten (eng. convolutional layers) bestehen. Wir werden später in diesem Blog-Beitrag mehr über Faltungsschichten sprechen, aber im Moment können Sie sie als Merkmalsextraktoren betrachten - sie nehmen eine Eingabe, wenden Filter auf die Eingabe an, in der Hoffnung, interessante Merkmale zu extrahieren, und leiten diese Merkmale dann an die nächste Schicht des neuronalen Netzwerks weiter.
Sind CNNs überwachtes Lernen oder nicht überwacht Lernen?
Damit Modelle des maschinellen Lernens, insbesondere künstliche neuronale Netze, genaue Vorhersagen machen können, müssen sie zunächst trainiert werden. CNNs werden normalerweise durch einen Prozess trainiert, der als überwachtes Lernen (supervised learning) bekannt ist.
Um das überwachte Lernen zu verstehen, nehmen Sie an, Sie haben eine große Sammlung von Tierbildern und möchten ein neuronales Netz trainieren, das vorhersagen kann, ob das Tier auf einem Bild eine Katze oder ein Hund ist. Beim überwachten Lernen geben Sie dem Netz zunächst Bilder, die bereits als "Katze" oder "Hund" gekennzeichnet sind. Jedes Mal, wenn das Netzwerk ein Bild sieht, trifft es eine Vorhersage für "Katze" oder "Hund". Das Netz vergleicht dann seine Vorhersage mit der Bezeichnung für dieses Bild und stellt fest, ob die Vorhersage richtig oder falsch war. Wenn das Netz eine falsche Vorhersage trifft, passt es sich selbst an (d. h. es ändert die Parameter des neuronalen Netzes), so dass es in Zukunft bessere Vorhersagen treffen kann - mit anderen Worten: Das Netz lernt aus seinen Fehlern.
Wofür werden CNNs eingesetzt?
CNNs werden typischerweise bei Computer-Vision-Aufgaben eingesetzt, d.h. bei Aufgaben, die mit der Verarbeitung und Analyse von Bildern zu tun haben. Zu den üblichen Aufgaben in diesem Bereich gehören:
Bildklassifizierung: CNNs werden zur Klassifizierung von Bildern in vordefinierte Kategorien oder Klassen auf der Grundlage ihres visuellen Inhalts verwendet. Dies ermöglicht Anwendungen wie Objekterkennung, Szenenklassifizierung und inhaltsbasierte Bildsuche.
Objekterkennung: CNNs werden eingesetzt, um Objekte in einem Bild zu erkennen, zu lokalisieren und zu klassifizieren. Die Standardmethode zur Objektklassifizierung ist die Bounding-Box-Erkennung, die die Koordinaten eines das Objekt umgebenden Rahmens sowie die Klassifizierung des Objekts innerhalb des Rahmens liefert.
Bildsegmentierung: CNNs werden verwendet, um ein Bild in Regionen oder Segmente aufzuteilen und jedem Segment Etiketten zuzuweisen. Dies kann z. B. zur Erkennung von Krebszellen in einem medizinischen Scan oder zur Entfernung eines Hintergrunds bei der Bildverarbeitung verwendet werden.
Gesichtserkennung: CNNs werden verwendet, um Personen anhand von Gesichtsmerkmalen zu identifizieren und zu verifizieren, was häufig in Sicherheitssystemen, beim Tagging in sozialen Medien und bei Authentifizierungsmechanismen eingesetzt wird.
Stilübertragung: CNNs können den künstlerischen Stil eines Bildes auf ein anderes übertragen, so dass Sie z. B. Ihr Familienporträt im Stil von Picasso malen lassen können.
Super-Auflösung: CNNs können eingesetzt werden, um die Auflösung von Bildern zu verbessern, wofür es eine Vielzahl unterschiedlicher Anwendungen gibt.
Zusätzlich zu diesen allgemeinen Anwendungsfällen können CNNs auch in einer Vielzahl von anderen Bereichen eingesetzt werden:
Verarbeitung natürlicher Sprache (NLP): CNNs können für Textklassifizierungsaufgaben eingesetzt werden, indem Text als eindimensionales Signal behandelt und 1D-Faltungen über Worteinbettungen verwendet werden.
Audio- und Tonanalyse: CNNs wurden bei der Audioklassifizierung eingesetzt, indem die Audiodaten in spektrografische Informationen umgewandelt und dann CNNs verwendet wurden.
Analyse von Zeitreihendaten: Zeitreihendaten, wie Finanz- oder biometrische Daten, können mit CNNs analysiert werden, um Vorhersagen über Dinge wie Aktienkurse und optimale Bewegungsabläufe zu treffen.
Graphen- und Netzwerkanalyse: CNNs können Knoten in einem Graphen klassifizieren, was für Aufgaben wie die Identifizierung einflussreicher Nutzer in sozialen Netzwerken nützlich ist.
Ein vereinfachtes Beispiel für ein CNN in der Praxis
Um ein Beispiel für einen CNN in der Praxis zu sehen, schauen wir uns die (sehr häufige) Aufgabe an, handgeschriebene Zahlen zu erkennen. Da alle Projekte zum maschinellen Lernen Daten benötigen, auf denen Modelle trainiert werden können, werden wir den MNIST-Datensatz verwenden. MNIST ist ein großer Datensatz mit handgeschriebenen Ziffern, der häufig zum Trainieren und Testen in verschiedenen Kontexten des maschinellen Lernens verwendet wird. Der Datensatz besteht aus 60000 Trainingsbildern und 10000 Testbildern.
Jedes Bild in diesem Datensatz ist 28 Pixel breit und 28 Pixel hoch und wird in Python als ein 28x28-Array dargestellt. Jedem Element dieses Arrays, d. h. jedem Pixel, wird eine ganze Zahl zwischen 0 und 255 zugewiesen, die angibt, wie hell dieses Pixel ist - 0 steht für Schwarz und 255 für Weiß.
Die erste Schicht des neuronalen Netzes ist die Eingabeschicht, in der die Daten in das Netz eingespeist werden. Sie besteht aus 784 Knoten, die dem abgeflachten 28x28-Bild entsprechen. Nach der Eingabeschicht gibt es Faltungsschichten, die Faltungsoperationen durchführen, um lokale Merkmale aus dem Eingabebild zu extrahieren. Diese werden häufig mit Aktivierungsfunktionen kombiniert, die es dem Netz ermöglichen, komplexere Beziehungen in den Daten zu erlernen, mit Pooling-Schichten, die ein Up- und Downsampling der Daten ermöglichen, und mit vollständig verknüpften Schichten, die die High-Level-Merkmale der vorhergehenden Schichten verarbeiten und lernen, zu klassifizieren oder andere Aufgaben zu erfüllen. Schließlich gibt es noch die Ausgabeschicht, die in diesem Fall aus den 10 Ausgabeknoten besteht, die den verschiedenen Vorhersagen entsprechen, die das neuronale Netz machen kann (die Ziffern 0-9).
Eine vereinfachte schematische Darstellung eines neuronalen Faltungsnetzes.
Wenn ein Bild an das neuronale Netz gegeben wird, werden die Pixelwerte des Bildes als numerische Werte in den Knoten der ersten Schicht gespeichert. Diese Werte werden dann durch die Parameter des neuronalen Netzes (die Gewichte und Verzerrungen) verändert, bevor sie an die nächste Schicht weitergegeben werden. Dies wird fortgesetzt, bis das Netz Werte für die letzte Schicht erzeugt - der Knoten in der letzten Schicht mit dem höchsten Wert wird als die vorhergesagte Klasse interpretiert. Während des Trainings wird diese Vorhersage mit der Grundwahrheit verglichen, und wenn die Vorhersage von der Grundwahrheit abweicht, werden die Gewichte angepasst, um die Vorhersage durch einen als Backpropagation bekannten Prozess zu verbessern. Über viele Iterationen des Trainings lernt das Netzwerk Merkmale der Trainingsdaten, d. h. es verbessert die Gewichte und Verzerrungen des neuronalen Netzwerks, um genauere Vorhersagen zu treffen.
Um zu zeigen, wie sich die Vorhersagen eines Modells mit dem Training verändern, haben wir ein CNN auf dem MNIST-Datensatz trainiert und das Modell nach dem Training auf nur kleinen Teilen des Datensatzes bewertet. Nach verschiedenen Trainingsstufen haben wir das Modell gebeten, die Zahl aus dem unten stehenden Bild vorherzusagen. Die Balken in der Grafik zeigen die beste Schätzung des Modells für die Zahl, der das Bild entspricht - je höher der Balken, desto sicherer ist das Modell, dass es die richtige Vorhersage trifft. Nach dem Training auf 0,1 % der Bilder ist jede Vorhersage gleich wahrscheinlich, was bedeutet, dass die Vorhersagen mehr oder weniger zufällig sind - in diesem Stadium hatte das Modell noch keine Gelegenheit, irgendwelche Merkmale aus den Daten zu lernen. Je mehr Daten das Modell trainiert, desto sicherer werden die Vorhersagen und konvergieren gegen die richtige Antwort (7).
Wie wird die Leistung eines CNN gemessen?
Sobald ein Modell so trainiert wurde, dass es in der Lage ist, genaue Vorhersagen für den Trainingsdatensatz zu treffen, können Sie dem Modell Bilder geben, die es noch nie gesehen hat. Das Modell hat Merkmale wie Form, Farbe und Textur aus den Trainingsdaten gelernt und ist in der Lage, eine Vorhersage für das neue Bild zu treffen, obwohl es das Bild noch nie zuvor gesehen hat. Die Trainingsbilder und die ungesehenen Bilder werden als Trainingsmenge bzw. als Testmenge bezeichnet. Vereinfacht ausgedrückt, wird die Leistung eines Modells durch die Genauigkeit seiner Vorhersagen für die Testdaten definiert.
Was beinhaltet ein Convolutional Layer wirklich?
Um zu verstehen, was eine Faltungsschicht (eng. convolution layer) in einem CNN ist, müssen wir zunächst wissen, was der Begriff "Faltung" bedeutet. Die mathematische Definition der Faltung:
ist etwas schwierig zu verstehen, wenn man keinen mathematischen Hintergrund hat, daher werden wir uns auf Faltungen konzentrieren, wie sie typischerweise im Zusammenhang mit CNNs verwendet werden. Natürlich sind die beiden Bedeutungen nicht wirklich unterschiedlich, und die Art von Faltungen, die wir in CNNs verwenden, sind eine Art von Faltung im mathematischen Sinne des Wortes, aber der Einfachheit halber werden wir nicht diskutieren, wie sie zusammenhängen. Wenn Sie daran interessiert sind, den mathematischen Hintergrund von Faltungsschichten zu verstehen, hat 3Blue1Brown eine fantastische Erklärung auf seinem Youtube-Kanal.
Beginnen wir zunächst mit dem einfachsten Beispiel für eine Faltung in der Bildverarbeitung. Wir beginnen mit einem Bild, das wir aus dem MNIST-Datensatz nehmen, den wir bereits gesehen haben. Dann benötigen wir einen Faltungsfilter, der in unserem Fall ein 3x3-Gitter aus Zahlen sein soll. Die tatsächlichen Zahlen sind hier nicht so wichtig (wir werden später mehr dazu sagen), also nehmen wir vorerst an, dass sie alle gleich sind, sagen wir 0,1. Um den Faltungsfilter auf ein einzelnes Pixel im Bild anzuwenden, legen wir den Filter so über das Bild, dass er dieses Pixel und die umliegenden Pixel abdeckt. Dann nehmen wir ein Punktprodukt, indem wir die Werte des Filters mit den Werten des Bildes multiplizieren, diese Produkte addieren und diesen Wert als Wert des entsprechenden Pixels im neuen Bild verwenden. Diesen Prozess wenden wir dann auf jedes Pixel des Originalbildes an, und wenn wir den Filter über das Originalbild bewegen, erzeugen wir dabei ein neues Bild.
Wir können dies in Python-Code ziemlich einfach implementieren,
import numpy as np
# Define a 3x3 convolutional filte
conv_filter = np.array([[0.1, 0.1, 0.1],
[0.1, 0.1, 0.1],
[0.1, 0.1, 0.1]])
# Apply convolution operation
def apply_convolution(image, filter):
image_height, image_width, _ = image.shape
filter_height, filter_width = filter.shape
output_height = image_height - filter_height + 1
output_width = image_width - filter_width + 1
output = np.zeros((output_height, output_width))
for i in range(output_height):
for j in range(output_width):
output[i, j] = np.sum(image[i:i+filter_height, j:j+filter_width] * filter)
return output
Natürlich machen wir uns in der Regel nicht die Mühe, dies von Hand zu programmieren - es gibt bestehende Bibliotheken, die all dies für uns erledigen, aber es ist schön zu wissen, dass wir diese Berechnungen bei Bedarf auch manuell durchführen können.
In unserem Fall besteht der Filter aus allen gleichen Zahlen, so dass der Effekt des Filters darin besteht, die Werte der umliegenden Pixel zu mitteln, was einen Unschärfeeffekt im gefilterten Bild erzeugt. Wir können andere Bildverarbeitungseffekte erzielen, indem wir verschiedene Filter wählen - ein Filter mit negativen Werten an den Außenseiten und einem großen Wert in der Mitte erzeugt einen Schärfeeffekt, während negative Werte auf der linken Seite und positive Werte auf der rechten Seite ein Bild erzeugen, das immer dann hell ist, wenn es bei der Bewegung von links nach rechts Helligkeitsänderungen gibt. Mit anderen Worten: Dieser Filter erkennt vertikale Linien im Originalbild. Ganz allgemein kann die Anwendung eines Faltungsfilters zur automatischen Erkennung von Merkmalen in einem Bild verwendet werden.
Da wir nun wissen, wie die Konvolution funktioniert, ist das Konzept einer Konvolutionsschicht (Faltungsschicht) in einem neuronalen Netz recht einfach. Eine Faltungsschicht besteht aus einer bestimmten Anzahl von Filtern, die ein Eingangsbild aufnehmen, die Filter anwenden und gefilterte Ausgangsbilder erzeugen - die Filter dienen dazu, Merkmale des Eingangsbildes wie vertikale und horizontale Linien zu erkennen. Da Faltungsschichten Merkmale aus einem Eingangsbild erkennen, können wir die Ausgabe einer Faltungsschicht als Eingabe für eine neue Faltungsschicht verwenden, indem wir Schichten übereinander stapeln, so dass das Modell Merkmale innerhalb von Merkmalen erkennen kann. Das Faszinierende an CNNs ist, dass die Filter nicht manuell in das Modell einprogrammiert werden - sie sind genau die Gewichte des neuronalen Netzes, die beim Training automatisch aktualisiert werden. Das Modell lernt automatisch, welche Merkmale es anhand der Daten erkennen muss.
Fazit
Convolutional Neural Networks (CNN) sind äußerst vielseitige Werkzeuge, die in einer beeindruckenden Reihe von Anwendungen weit verbreitet sind. Zusammen mit vollverknüpften neuronalen Netzen und rekurrenten neuronalen Netzen bilden CNNs einen Kernbestandteil vieler moderner Machine-Learning-Modelle. Wenn Sie mehr darüber erfahren möchten, wie wir CNNs bei dida eingesetzt haben, lesen Sie die Projektbeschreibungen der folgenden Projekte:
Häufig gestellte Fragen
Was sind die gängige Varianten von CNN?
LeNet-5: Eine der ersten CNN-Architekturen, die für die Erkennung handgeschriebener Ziffern und andere Klassifizierungsaufgaben verwendet wird.
ResNet: Residuale Netze enthalten Skip-Verbindungen, die das Training von sehr tiefen Modellen ermöglichen.
U-Net: Ein CNN, das mit einem schrumpfenden Netz beginnt, gefolgt von einem expandierenden Netz. Die "nach unten und dann nach oben" gerichtete Architektur wird oft als U dargestellt, daher der Name des Modells. Nützlich für Bildsegmentierungsaufgaben.
YOLO: YOLO und seine Varianten sind Echtzeit-Detektionsnetze, bei denen Geschwindigkeit und Effizienz im Vordergrund stehen.
DenseNet: Ein CNN, bei dem jede Schicht Input von ALLEN vorherigen Schichten erhält, nicht nur von der jüngsten. Dies ermutigt das Modell zur Wiederverwendung von Merkmalen und reduziert das Problem des verschwindenden Gradienten.
Gibt es Python-Pakete, mit denen ich CNNs leichter einsetzen kann?
Ja, es ist sehr einfach, CNNs in Python zu implementieren, und sowohl Tensorflow als auch PyTorch haben einfache Tutorien, die Ihnen bei der Erstellung und dem Training Ihres ersten CNNs helfen werden. Darüber hinaus verfügt TorchVision (ein Computer-Vision-Paket, das für die Verwendung mit PyTorch entwickelt wurde) über eine umfangreiche Sammlung von Modellen, die auf großen Datensätzen mit beschrifteten Bildern trainiert wurden und oft sofort für viele Bildklassifizierungs- und Segmentierungsprobleme verwendet werden können.