Operatoren |
Dieses Kapitel beschreibt Operatoren für Deep Learning-basierte Klassifikation, sowohl für die Inferenz als auch für das Training.
Der Begriff Deep Learning bezieht sich auf eine Familie von Verfahren des maschinellen Lernens, welche unter anderem für Klassifikation verwendet werden. Klassifikationsaufgaben setzen Wissen über Merkmale, welche die Klassen unterscheiden, voraus. Bei Deep Learning Verfahren wird ein Netzwerk nur mit Hilfe von Ein- und Ausgabe trainiert. Das wird auch als End-to-End Lernen bezeichnet. Der Trainingsalgorithmus passt das Netzwerk mit gelabelten Bildern so an, dass es in der Lage ist, die Klassen passend zu unterscheiden. Für den Anwender hat dies den Vorteil, dass er nicht händisch Merkmale angeben muss. Stattdessen müssen geeignete Daten ausgewählt und gesammelt werden. Convolutional Neural Networks (CNNs) sind ein für Bildverarbeitung geeignetes Deep Learning-Verfahren. Eine kurze Einführung findet sich im „Solution Guide on Classification“.
Um diese Technik nutzbar zu machen, mussten drei technologische Voraussetzungen erfüllt werden.
Viele Daten: Sehr viele gelabelte Bilder sind erforderlich, um ein Deep Learning Netzwerk für Bildverarbeitung von Grund auf zu trainieren. Die Labels sind notwendig für die Klassifikation der Bilder und somit der Verwendung der Bilder zum Training. Öffentlich verfügbare Datensätze ermöglichen den einfachen Zugriff auf eine enorme Menge an gelabelten Daten.
Erhöhte Rechenleistung: Um diese Aufgabe in angemessener Zeit zu verarbeiten, ist eine große Menge an Rechenleistung notwendig, insbesondere für das Training mit einer großen Anzahl von Daten. Bitte beachten Sie die Systemvoraussetzungen weiter unten.
Transferlernen: Vortrainierte Netzwerke ermöglichen die Verwendung einer Technik, die Transferlernen genannt wird. Ein Netzwerk von Grund auf zu erstellen und zu trainieren setzt sehr viel Zeit, Rechenleistung, Expertenwissen und eine sehr große Anzahl an gelabelter Bilder voraus. Anstelle dessen kann ein schon vortrainiertes Netzwerk für eine neue Aufgabe mit potentiell vollständig verschiedenen Klassen nachtrainiert werden. Das wird als Transferlernen bezeichnet und benötigt weniger gelabelter Trainingsbilder und Resourcen.
Für einen kurzen und einfachen Überblick kann das HDevelop Beispiel classify_fruit_deep_learning.hdev herangezogen werden. Das Beispiel classify_pill_defects_deep_learning.hdev zeigt einen komplexeren Ablauf. Beide Beispiele können unter examples/hdevelop/Deep-Learning/Classification/ gefunden werden und bieten Anleitungen, wie die verschiedenen Teile zusammen verwendet werden können.
Erst muss ein vortrainierter Klassifikator mit dem Operator
eingelesen werden. Dieser Operator wird auch dazu verwendet, um fertig trainierte Klassifikatoren, die mit write_dl_classifier geschrieben wurden, einzulesen.
Es ist notwendig zu wissen, welches Problem der Klassifikator lösen soll, d.h., welche Klassen unterschieden werden müssen und wie Beispiele dieser Klassen aussehen. Das wird durch den Datensatz repräsentiert, das heißt den Bildern mit den zugehörigen Labels. Um die Daten für das Deep Learning Klassifikationstraining zu laden, steht die Prozedur
read_dl_classifier_data_set
zur Verfügung. Diese Prozedur gibt eine Liste von Pfaden der Bilddateien, eine Liste der zugehörigen Labels sowie eine Liste aller vorkommenden Klassen zurück.
Der Klassifikator stellt mehrere Anforderungen an die Bilder, wie die Bilddimensionen und der Grauwertbereich. Die Defaultwerte sind in read_dl_classifier gelistet. Mit diesen Werten wurden die Neuronalen Netzwerke vortrainiert. Die Netzwerkarchitekturen erlauben verschiedene Bilddimensionen, welche über set_dl_classifier_param gesetzt werden können, aber je nach Netzwerk macht eine Änderung ein Nachtrainieren notwendig. Die aktuellen Werte können mit
abgefragt werden.
Die Prozedur preprocess_dl_classifier_images hilft, bei der Implementierung einer entsprechenden Vorverarbeitung. Wir empfehlen, alle fürs Training benötigten Bilder vor dem Training vorzuverarbeiten und abzuspeichern. Damit kann während des Trainings direkt auf die vorverarbeiteten Bilder zugegriffen werden, was das Training signifikant beschleunigt.
Als nächstes wird empfohlen die Daten in drei getrennte Datensätze zu teilen, die für Training, Validierung und Testen verwendet werden. Dafür kann die Prozedur
split_dl_classifier_data_set
verwendet werden. Mit diesem Ansatz wird der Trainings-Datensatz als direkte Eingabe für das Training verwendet. Der Validierungs-Datensatz wird zum Testen des Klassifikators während des Trainings genutzt, um den Trainingsfortschritt zu verfolgen. Der Test-Datensatz wird für eine unabhängige Auswertung nach dem Training verwendet.
Dem Klassifikator muss mitgeteilt werden, welche Klassen er unterscheiden soll. Dazu werden die zuvor mit read_dl_classifier_data_set eingelesenen Klassen mit dem Operator
und dem Parameter 'classes' gesetzt.
Dieser Operator kann auch verwendet werden, um Hyperparameter, die für das Training wichtig sind (z.B. 'batch_size' und 'learning_rate' ), zu setzen. Eine detailliertere Erklärung befindet sich weiter unten in dieser Kapitelreferenz und in der Dokumentation von set_dl_classifier_param.
Sobald der Klassifikator und der Datensatz vorbereitet sind, kann der Klassifikator für die neue Aufgabe nachtrainiert werden.
Zum Trainieren des Klassifikators steht der Operator
zur Verfügung. Zwischenergebnisse des Trainings werden im Ausgabehandle dieses Operators gespeichert.
Wie der Name suggeriert, verarbeitet der Operator train_dl_classifier_batch einen Batch von Trainingsdaten in einem Schritt. Ein Batch ist eine Menge von Daten, wobei die Batchgröße, d.h., die Anzahl Daten dem Parameter 'batch_size' entspricht. Die Batchgröße wird über den Operator set_dl_classifier_param gesetzt. Für ein erfolgreiches Training sollte der gesamte Trainings-Datensatz verwendet werden. Dafür wird über die Trainingsdaten iteriert und der Klassifikator sukzessive mit train_dl_classifier_batch trainiert. Ein Durchlauf über den ganzen Trainings-Datensatz wird als Epoche bezeichnet. Dabei muss berücksichtigt werden, dass ein Batch immer vollständig gefüllt sein muss. Dementsprechend kann es vorkommen, dass manche Bilder in einer Epoche nicht verwendet werden, wenn nicht mehr genügend Bilder verfügbar sind, um einen Batch zu füllen.
Dieser Prozess wird für so viele Epochen wiederholt, bis das Trainingsergebnis zufriedenstellend ist.
Um den Trainingsfortschritt zu veranschaulichen, wird die Prozedur
plot_dl_classifier_training_progress
bereitgestellt. Damit kann der Klassifikationsfehler während des Trainings visualisiert werden. Die zur Darstellung notwendigen Eingaben können über die Prozeduren
select_percentage_dl_classifier_data,
apply_dl_classifier_batchwise und
evaluate_dl_classifier
erhalten werden. Mit diesen Prozeduren kann die Anzahl der Bilder für die Evaluierung verringert werden, der Klassifikator auf die ausgewählten Daten angewendet werden und zum Beispiel der Top-1 Fehler berechnet werden. Das HDevelop Beispiel classify_pill_defects_deep_learning.hdev zeigt, wie diese Prozeduren zusammen verwendet werden können.
Nun ist der Klassifkator für die spezifische Anwendung trainiert und bereit zur Anwendung. Doch davor sollte noch evaluiert werden, wie gut sich der Klassifikator auf den Testdaten verhält.
Um den Klassifikator auf einer beliebigen Anzahl Bildern anzuwenden, wird der Operator
verwendet. Die Ergebnisse werden in einem Handle gespeichert.
Die vorausgesagten Klassen und Konfidenzen werden mit dem Operator
abgefragt.
Jetzt können die Ergebnisse ausgewertet werden. Die Leistung des Klassifikators kann während des Trainings mit der Prozedur evaluate_dl_classifier ausgewertet werden.
Um die Qualität des Klassifikators zu analysieren und zu visualisieren, ist die Konfusionsmatrix ein nützliches Hilfsmittel (weiter unten findet sich eine Erklärung). Dafür kann die Prozedur
gen_confusion_matrix.
verwendet werden. Zusätzlich kann, nachdem der Klassifikator auf einen Datensatz angewandt wurde, die Prozedur
get_dl_classifier_image_results
verwendet werden, um Bilder nach bestimmten Kriterien zu selektieren und anzuzeigen, zum Beispiel Bilder die falsch klassifiziert wurden. Weiter kann dies als Eingabe für die Prozedur
dev_display_dl_classifier_heatmap,
verwendet werden, um eine Heatmap für ein Bild anzuzeigen. Mit dieser Heatmap kann analysiert werden, welche Bildregionen für das Klassifikationsergebnis ausschlaggebend sind.
Ist der Klassifikator trainiert und seine Leistung zufriedenstallend, kann er für die Klassifikation neuer Bilder verwendet werden. Dafür müssen die Bilder entsprechend den Anforderungen des Klassifikators vorverarbeitet werden (d.h., auf dieselbe Art und Weise wie für das Training). Danach können sie mit
klassifiziert werden.
Die Systemvoraussetzungen von Deep Learning mit CNNs hängen von der gewünschten Funktionalität ab.
Trainieren des Klassifikators ist für die Ausführung auf NVIDIA GPUs implementiert und setzt zusätzlich die Bibliotheken cuDNN und cuBLAS voraus. Mehr Informationen zu diesen speziellen Voraussetzungen befinden sich im Installation Guide. Um den Trainingsprozess zu beschleunigen, empfehlen wir eine schnelle Festplatte. Solid-State-Drives (SSD) sind konventionellen Festplatten (HDD) vorzuziehen.
Inferenz mit einem Deep Learning-basierten Klassifikator kann auf NVIDIA GPUs ausgeführt werden, wofür die gleichen Anforderungen wie beim Training gelten. Alternativ kann die Inferenz auch auf einer x86 oder x64 CPU ausgeführt werden.
Mehr Informationen zu diesen speziellen Voraussetzungen befinden sich im im HALCON Installation Guide.
In HALCON wird eine Technik verwendet, die Transferlernen genannt wird (siehe oben). Dafür werden vortrainierte Klassifikatoren bereitgestellt, die auf einer sehr großen Anzahl an klassifizierten Trainingsbildern trainiert wurden. Diese Klassifikatoren wurden trainiert und getestet, um industrielle Bildklassifikationsaufgaben gut zu lösen. Ein solcher vortrainierter Klassifikator wird für eine neue, spezifische Aufgabe nachtrainiert, damit er die geforderten Klassen unterscheiden kann. Dafür wird ein geeigneter Datensatz benötigt, üblicherweise in der Größe von hunderten oder tausenden von gelabelten Bildern pro Klasse. Obwohl der Klassifikator grundsätzlich zuverlässiger sein sollte, wenn er auf einem größeren Datensatz trainiert wurde, hängt die Anzahl der benötigten Daten von der Komplexität der Aufgabe ab.
Für das Training wird der Datensatz in drei Teilmengen aufgespalten, die unabhängig und gleichverteilt sein sollten. Das bedeutet, dass die Teilmengen auf keine Art und Weise voneinander abhängen sollten und jede Klasse die gleiche Verteilung von Bildern enthalten sollten. Diese Aufteilung kann bequem mit der Prozedur split_dl_classifier_data_set vorgenommen werden. Die größte Teilmenge wird für das Nachtrainieren verwendet. Zu bestimmten Zeitpunkten wird die Leistung des Klassifkators überprüft, um festzustellen ob es sich lohnt die Optimierung des Klassifikators fortzusetzen. Für diese Validierung wird die zweite Teilmenge des Datensatzes verwendet. Auch wenn diese Teilmenge disjunkt zur ersten Menge ist, hat sie Einfluss auf die Optimierung des Klassifikators. Deshalb wird für die Vorhersage der Leistung des Klassifikators in der Applikation die dritte Teilmenge verwendet. Für eine repräsentative Validierung des Klassifikators sollten die zweite und die dritte Teilmenge statistisch relevante Daten enthalten, was eine untere Schranke für die benötigte Menge an Daten darstellt.
Der Klassifikator stellt Anforderungen an die Bilder betreffend der passenden Dimensionen, dem Grauwertbereich und dem Bildtyp. Diese Voraussetzungen hängen vom verwendeten Netzwerk ab und können mit get_dl_classifier_param abgefragt werden. Darüber hinaus müssen die Bilder die für das Training verwendet werden, mit Labeln versehen worden sein. Außerdem sollten die Bilder repräsentativ sein, das heißt denen der späteren Applikation entsprechen und nicht "perfekten" Bildern. Ansonsten kann der Klassifikator Probleme auf nicht-"perfekten" Bildern haben.
Das Neuronale Netzwerk beschreibt eine Funktion, welche die Eingabedaten auf Klassen abbildet. Ein solches Netzwerk besteht aus Layern und damit verbundenen Gewichten. Diese Gewichte sind die freien Parameter, welche beim Training verändert werden. Dies ist jedoch kein reines Optimierungsproblem: Maschinelles Lernen wirkt sich üblicherweise indirekt aus. Das bedeutet, dass eine präzise Vorhersage gesucht wird, aber nicht direkt die Abbildungsfunktion, welche die Klassen vorhersagt, optimiert wird. Anstelle dessen wird eine Zielfunktion (auch Loss genannt) eingeführt, die die Abweichung zwischen vorhergesagter und wahrer Klasse bestraft. Diese Funktion wird nun optimiert, in der Hoffnung dass dies auch die Klassifikationsrate verbessert.
Um das Netzwerk also für eine spezielle Klassifikationsaufgabe zu trainieren, wird die Minimierung der Zielfunktion (eine Funktion des Fehlers) angestrebt. In der Praxis wird diese Optimierung durch die Berechnung des Gradienten und der entsprechenden Anpassung der Parameter (Gewichte) bei mehrfacher Iteration über den Trainings-Datensatz erreicht.
Der vollständige Datensatz ist im Allgemeinen zu groß, um vollständig im RAM verarbeitet werden zu können. Um dieses Problem zu umgehen, wird der Datensatz in relativ kleine Teilmengen unterteilt, welche idealerweise zufällig ausgewählt werden. Eine solche Teilmenge wird als Batch oder Minibatch bezeichnet. Die Batchgröße ('batch_size' ) bestimmt die Anzahl der Daten, die einen Batch bilden und deshalb simultan verarbeitet werden. Größere Batches sollten dabei zu einer genaueren Schätzung des Gradienten führen, benötigen aber auch mehr Speicher.
Um die Zielfunktion zu optimieren, wird der Gradient für einen Batch (mit dem stochastischen Gradientenabstiegsverfahren SGD) berechnet. Es gibt zwei Hyperparameter, die für die Anpassung der Abbildungsfunktion wichtig sind: Die Lernrate 'learning_rate' , die den Einfluss des Gradienten auf die Anpassung der Parameter beschreibt und das Momentum im Intervall , das den Einfluss früherer Anpassungen festlegt. Mehr Informationen dazu befinden sich in der Dokumentation von train_dl_classifier_batch. In einfachen Worten gesagt: Bei der Anpassung der Parameter erinnert man sich an den Schritt, den man für die letzt Anpassung gemacht hat. Jetzt wird ein Schritt in die Richtung des Gradienten mit einer Länge entsprechend der Lernrate gemacht und zusätzlich wird der Schritt der letzten Anpassung wiederholt, aber nur mit einer Länge entsprechend dem Momentum. Dies wird in der folgenden Grafik illustriert. Eine zu hohe Lernrate kann dazu führen, dass der Algorithmus divergiert, eine zu kleine Lernrate führt zu unnötig vielen Schritten. Daher startet man üblicherweise mit einer höheren Lernrate und reduziert sie während dem Training. Mit einem Momentum , hat das Momentum Verfahren keinen Einfluss, so dass nur der Gradient den Anpassungsvektor bestimmt.
Regularisierung kann verwendet werden, um Überanpassung an die Trainingsdaten zu reduzieren (siehe auch den Abschnitt "Risiko von Überanpassung und Unteranpassung" weiter unten). Der entsprechende Hyperparameter 'weight_prior' muss vor dem Training gesetzt werden. Die Wahl des Wertes ist ein Kompromiss zwischen der Fähigkeit des Modells zur Generalisierung, Überanpassung und Unteranpassung. Ist der Wert für 'weight_prior' zu klein, kann Überanpassung auftreten, ist er zu groß, kann das Modell seine Fähigkeit, sich an die Daten anzupassen, verlieren, da alle Gewichte effektiv Null sind.
Die Anzahl von Epochen bestimmt, wie oft der vollständige Trainings-Datensatz für das Training verwendet wird. Diese Anzahl bestimmt direkt, wie oft der Trainingsalgorithmus über den Trainings-Datensatz iteriert. Dabei muss berücksichtigt werden, dass ein Batch immer voll gefüllt sein muss. Dementsprechend kann es vorkommen, dass manche Bilder in einer Epoche nicht verwendet werden, wenn nicht mehr genügend Bilder verfügbar sind, um einen Batch zu füllen.
Mit den Daten und den Hyperparametern gibt es viele Einflussfaktoren auf das Resultat des Trainingsalgorithmus. Im Allgemeinen helfen mehr Daten, die Leistung des Klassifikators zu verbessern. Ob mehr Daten immer eine gute Lösung für Verbesserungen sind, hängt davon ab, wie einfach es ist, diese Daten zu sammeln. Üblicherweise hat eine kleine zusätzliche Menge an Daten kaum merklichen Einfluss auf die Gesamtleistung.
Bei der Evaluierung der Leistung des Klassifikators muss beachtet werden, dass es sich nicht um ein reines Optimierungsproblem handelt (siehe Abschnitt über 'Setzen der Trainingsparameter' weiter oben).
Um den Trainingsfortschritt zu beobachten ist es meistens nützlich, den Fehler (das bedeutet der mittlere Fehler für alle Elemente eines Batches) zu visualisieren. Da sich die Elemente unterscheiden, sind manche einfacher zu klassifizieren als andere. Deshalb kann es sein, dass der Klassifikator bei den Elementen eines Batches besser oder schlechter abschneidet als bei den Elementen eines anderen Batches. Es ist also normal, dass sich der Fehler nicht glatt über die Iterationen verändert. Insgesamt sollte er aber sinken. Die Anpassung der Hyperparameter Lernrate 'learning_rate' und Momentum 'momentum' kann helfen, den Fehler weiter zu verringern. Die folgende Grafik zeigt ein mögliches Beispiel.
Unteranpassung tritt auf, wenn das Modell die Komplexität der Aufgabe nicht wiedergeben kann. Das spiegelt sich direkt im Trainingsfehler wieder, der in diesem Fall hoch bleibt.
Überanpassung tritt dann auf, wenn das Modell anfängt, sich die Trainingsdaten zu merken, statt generelle Regeln zur Aufgabe zu lernen. In diesem Fall bleibt der Trainingsfehler niedrig oder sinkt weiter, während sich der Fehler auf dem Validierungsdatensatz erhöht. In diesem Fall kann Regularisierung helfen. Regulariserung ist eine Methode um Überanpassung von Neuronalen Netzwerken zu vermeiden durch Addition eines Strafterms zur Zielfunktion. Dieser Regularisierungs-Term schiebt die Gewichte gegen Null und bestraft dabei insbesondere große Gewichte. Einfach gesagt führt dies dazu, das einfachere Modelle bevorzugt werden, die sich weniger an Rauschen in den Daten anpassen und besser generalisieren. Es ist zu beachten, dass ein ähnlicher Effekt auftritt, wenn die Kapazität des Models im Verhältnis zum Trainings-Datensatz zu hoch ist.
Eine Konfusionsmatrix ist eine Tabelle, die verwendet werden kann, um die Leistung eines Klassifikators auf einem bekannten Datensatz zu visualisieren. Für jedes Bild ist also bekannt, zu welcher Klasse es gehört. Die Tabelle zeigt, wie der Klassifikator die Bilder klassifiziert hat (im Sinne von Klasse mit jeweils größtem Konfidenzwert), das heißt wie viele Bilder einer gegebenen Klasse auf welche Klasse abgebildet wurden. Zum Beispiel zeigt sie, wie viele Bilder mit der wahren Klasse 'apple' als 'apple' und wie viele als 'peach' oder 'pear' klassifiziert wurden. Jede Spalte repräsentiert die wahren (gelabelten) Instanzen einer Klasse und jede Zeile die Instanzen der vom Klassifikator vorhergesagten Klasse. Anhand dieser Tabelle kann man sehr einfach sehen, wie gut der Klassifikator für jede Klasse funktioniert. Bei Klassifikationsaufgaben mit mehr als zwei Klassen kann man entweder alle Klassen anzeigen oder diese auf ein binäres Problem reduzieren (positiv: gehört zur ausgewählten Klasse gegenüber negativ: gehört zu einer anderen Klasse). Für binäre Klassifikationsprobleme reduziert sich die Konfusionsmatrix auf die vier Einträge 'True Positives' (TP: positiv vorhergesagt, positiv gelabelt), 'True Negatives' (TN: negativ vorhergesagt, negativ gelabelt), 'False Positives' (FP: positiv vorhergesagt, negativ gelabelt) und 'False Negatives' (FN: negativ vorhergesagt, positiv gelabelt).
(1) | (2) |
Mehrere Bewertungsmaße können aus der Konfusionsmatrix abgeleitet werden: Die Precision ist das Verhältnis aller korrekt vorhergesagten Positivinstanzen zu allen positiv vorhergesagten Instanzen. Es stellt ein Maß dafür dar, wie viele positive Vorhersagen tatsächlich positiv sind.
Der Recall (auch als "True-Positive-Rate" bezeichnet) ist das Verhältnis aller korrekten vorhergesagten Positivinstanzen zu allen wahren Positivinstanzen. Es ist also ein Maß dafür, wie viele tatsächlich positive Instanzen korrekt vorhergesagt wurden.
Ein Klassifikator mit hohem Recall, aber geringer Precision findet die meisten Elemente der Positivinstanzen einer Klasse (also die tatsächlichen Instanzen der Klasse), zulasten der Klassifikation vieler falscher Instanzen als diese Klasse. Ein Klassifikator mit hoher Precision und geringem Recall ist genau das Gegenteil, er klassifiziert nur wenige Instanzen als Positiv, die meisten dieser Vorhersagen sind aber korrekt. Ein idealer Klassifikator mit hoher Precision und hohem Recall wird viele Instanzen als positiv mit hoher Genauigkeit klassifizieren.
Um dies mit einer einzigen Zahl auszudrücken, wird der F1-Score berechnet, das harmonische Mittel von Precision und Recall. Dies ist ein Maß für die Genauigkeit des Klassifikators.
Für das Beispiel mit der oben gezeigten Konfusionsmatrix ergibt sich für die Klasse 'apple' die Precision: 1.00 (= 68/(68+0+0)), der Recall: 0.74 (= 68/(68+21+3)) und der F1-Score: 0.85 (=2*(1.0*0.7)/(1.0+0.7)).
Im Folgenden beschreiben wir die wichtigsten Begriffe, welche wir im Kontext von Deep Learning verwenden:
Der Datensatz wird in kleinere Untergruppen, genannt Batches, unterteilt. Die Batchgröße bestimmt die Anzahl Bilder eines einzelnen Batches und somit die Anzahl Bilder, welche simultan verarbeitet werden.
Convolutional Neural Networks sind Netzwerke, die in Deep Learning verwendet werden und mindestens einen Convolutional Layer (Faltungs-Layer) beinhalten. CNNs sind besonders erfolgreich bei der Klassifizierung von Bildern.
Im Kontext von Deep Learning verwenden wir den Begriff Daten für die zu klassifizierenden Objekte (z.B. Bilder) mit ihren zugehörigen Klassen (die Labels).
Der Datensatz bezeichnet die komplette Menge an Daten (Bilder und zugehörige Label), welche für das Training verwendet werden. Der Datensatz wird in drei disjunkte Untermengen aufgeteilt:
Der Trainings-Datensatz enthält die Daten, auf welchen der Algorithmus das Netzwerk trainiert.
Der Validations-Datensatz enthält die Daten, auf welchen die Leistungsfähigkeit des Netzwerkes noch während des Trainings eingeschätzt wird.
Der Test-Datensatz wird verwendet, um die Inferenzgenauigkeit des Klassifikators zu testen. D.h. die Fähigkeit der Klassifizierung wird auf neuen Daten getestet, also auf Daten ohne Einfluss auf die Optimierung des Netzwerkes.
Der Begriff "Deep Learning" wurde ursprünglich für das Training Neuronaler Netzwerke mit mehreren verborgenen Layer verwendet. Heutzutage wird der Begriff mehr als allgemeiner Begriff für verschiedene Methoden des Maschinellen Lernens verwendet. In HALCON verwenden wir den Begriff für Klassifikationsmethoden mit einem Neuronalen Netzwerk, welches mehrere verborgene Layer beinhaltet.
Im Kontext von Deep learning bedeutet Epoche eine einzelne Trainingsiteration über den ganzen Trainings-Datensatz, d.h. über sämtliche Batches. Eine solche Trainingsiteration über Epochen ist nicht zu verwechseln mit einer Iteration über einen einzelnen Batch (d.h., innerhalb einer Epoche).
Im Kontext von Deep Learning verwenden wir den Begriff Fehler, wenn für ein Bild die vom Klassifikator zugeordnete Klasse nicht mit der eigentlichen Klasse (dem Label des Bildes) übereinstimmt. Dabei meinen wir jeweils den top-1 Fehler (siehe top-k Fehler).
Gewichte sind die freien Parameter des Klassifikators, die während des Trainings zwecks Optimierung der Zielfunktion geändert werden. Ein Layer mit Gewichten multipliziert oder addiert diese mit seinen Eingabewerten. Im Gegensatz zu Hyperparametern werden Gewichte während des Trainings optimiert und werden somit geändert.
Jede Methode des Maschinellen Lernens, und somit auch CNNs, ist eine Umsetzung von Formeln mit mehreren Parametern. Während der Trainingsphase lernt das Modell von den Daten im Sinne von Optimierung der Parameter für die gegebene Aufgabe. Solche Modelle können aber auch noch weitere Parameter haben, deren Wert während der Trainingsphase nicht direkt erlernt wird. Die Werte dieser Parameter werden vor Trainingsbeginn festgelegt. Wir bezeichnen diese letzteren Parameter als Hyperparameter, um sie von jenen Netzwerk-Parametern (den Gewichten) zu unterscheiden, welche während der Trainingsphase optimiert werden. Aus einem anderen Blickpunkt betrachtet sind Hyperparameter Solver-spezifische Parameter.
Prominente Beispiele für Hyperparameter sind die initiale Lernrate oder die Batchgröße.
Die Inferenzphase bezeichnet die Phase, in dem ein trainiertes Netzwerk angewandt wird, um die Klassenzugehörigkeit von Eingabebilder zu folgern. Im Unterschied zur Trainingsphase wird das Netzwerk nicht mehr optimiert.
Klassen sind getrennte Kategorien, welche das Netzwerk unterscheidet (z.B. 'apple', 'peach', 'pear'). In HALCON wird die Klasse eines Bildes durch sein zugehöriges Label gegeben.
Im Kontext von Deep Learning bezeichnen wir mit Klassifikator folgendes: Der Klassifikator folgert für ein erhaltenes Bild die Konfidenz zu allen unterschiedenen Klassen. Als Beispiel seien die drei Klassen 'apple', 'peach', 'pear' unterschieden. Nun wenden wir den Klassifikator auf ein Bild eines Apfels an. Als Resultat erhalten wir Konfidenzen wie 'apple': 0.92, 'peach': 0.07, 'pear': 0.01.
Die Konfidenz ist eine Zahl, welche die Klassenzugehörigkeit eines Bildes darstellt. In HALCON ist die Konfidenz die Wahrscheinlichkeit, gegeben im Intervall [0,1].
Eine Konfusionsmatrix ist eine Tabelle, in welcher die Klassifizierungen des Klassifikators (im Sinne von Klasse mit jeweils größtem Konfidenzwert) mit den korrekten Klassenzugehörigkeiten (Labels) verglichen werden. Sie wird oft verwendet zur Visualisierung der Klassifikationsergebnisse auf dem Validierungs- oder Test-Datensatz, siehe z.B. die entsprechende Abbildung.
Label sind beliebige Zeichenketten (Strings), welche die Klasse eines Bildes angeben. In HALCON ist das Label eines Bildes gegeben durch seinen Namen (evt. gefolgt von einer Kombination aus Unterstrich und Ziffern) oder dem Namen seines direkten Ordners, zB. 'apple_01.png', 'peach.png', 'pear/01.png'.
Layer sind Bausteine von Neuronalen Netzwerken und führen eine spezifische Funktion aus (z.B. Faltung, Vereinigung, etc., siehe „Solution Guide Classification“). Ein Layer kann man als eine Box betrachten, welche Eingabewerte erhält, diese transformiert und den Rückgabewert an den nächsten Layer weiter gibt. Eingabe- und Ausgabe-Layer sind jeweils mit den Daten verbunden, d.h. mit den Bilder, respektive den Labels. Alle dazwischenliegenden Layers bezeichnet man als verborgenen Layer.
Alternative Namen: Schicht (Layer), Zwischenschicht (hidden Layer)
Die Lernrate ist die Gewichtung des Gradienten (siehe SGD) beim Anpassen der Argumente der Zielfunktion. In einfachen Worten: Der Gradient sagt uns, in welche Richtung optimiert werden soll und die Lernrate sagt, wie groß unser Schritt sein wird.
Das Momentum wird bei der Optimierung der Zielfunktionsargumente eingesetzt. Werden die Argumente der Zielfunktion aktualisiert (nach Berechnung des Gradienten), wird der Aktualisierungsvektor des vorherigen Aktualisierungsschrittes zu einem Anteil berücksichtigt. Dadurch werden Oszillationen gedämpft. Wir nennen den Hyperparameter Momentum. In einfachen Worten, wenn wir die Argumente aktualisieren, erinnern wir uns noch an den Schritt der letzten Aktualisierung. Wir gehen nun einen Schritt mit einer Länge entsprechend der Lernrate in Richtung des Gradienten. Zusätzlich wiederholen wir den Schritt, den wir bei der letzten Aktualisierung gingen, machen ihn jetzt aber nur noch mal so weit.
Wir verstehen unter Nachtrainieren das Anpassen der Gewichtungen eines bereits vortrainierten Netzwerkes, d.h. während des Nachtrainierens lernt ein Netzwerk eine spezifische Aufgabe.
Regulariserung ist eine Methode um Überanpassung von Neuronalen Netzwerken zu vermeiden. Dies geschieht durch Addition eines Strafterms zur Zielfunktion. Dieser Regularisierungs-Term schiebt die Gewichte gegen Null und bestraft dabei insbesondere große Gewichte. Einfach gesagt führt dies dazu, das einfachere Modelle bevorzugt werden, die sich weniger an Rauschen in den Daten anpassen und besser generalisieren. In HALCON wird die Regularisierung durch den Parameter 'weight_prior' gesteuert. Dieser Parameter wird in der Literatur auch Regularisierungsparameter, weight decay, oder einfach genannt (Wir vermerken, dass wir innerhalb von HALCON für die Lernrate verwenden und in Formeln das Symbol für den Regularisierungsparameter).
Der Solver optimiert das Modell, indem er die Gewichtungen so anpasst, dass die Zielfunktion optimiert (d.h. minimiert) wird.
Das stochastische Gradientenverfahren ist ein iterativer Optimierungsalgorithmus für differenzierbare Funktionen. Ein besonderes Merkmal bildet die Einschränkung der für einen einzelnen Iterationsschritt berücksichtigten Datenmenge, denn für eine Iteration wird nur ein einzelner Batch mit zufällig gewählten Bildern berücksichtigt. Bei Deep Learning verwenden wir den SGD zur Optimierung (d.h. Minimierung) der Zielfunktion.
Der Klassifikator ordnet einem Bild nicht eine einzelne Klasse zu, sondern bezüglich jeder Klasse eine Konfidenz. Für ein Bild gibt es somit k Klassen mit höchster vorhergesagter Konfidenz. Der top-k Fehler gibt nun an, bei wie vielen Vorhersagen diese k Klassen die wahre Klasse (das Label) beinhalten. Der top-1 Fehler gibt somit an, ob die vorausgesagte Klasse mit größter Wahrscheinlichkeit der wahren, vom Benutzer gegebenen Klasse entspricht. Beim top-3 Fehler wird geprüft, ob das die wahre Klasse einer der drei besten Vorhersagen entspricht (d.h. einer der drei Klassen, die der Klassifikator als am wahrscheinlichsten zutreffend betrachtet).
Transferlernen meint eine Technik, bei der für ein neues Netzwerk das Wissen eines bereits existierenden und trainierten Netzwerkes die Basis bildet. Konkret wird ein bereits (vor)trainiertes Netzwerk inklusive seiner Gewichtungen übernommen und der Ausgabe-Layer für die spezifische Anwendung adaptiert. In HALCON betrachten wir auch den darauf folgenden Schritt des Nachtrainierens als Teil des Transferlernens.
Man spricht von Überanpassung, wenn das Netzwerk anfängt, sich die Trainingsdaten zu merken, anstatt generelle Regeln zur Klassifikationsaufgabe zu finden. Überanpassung wird ersichtlich, wenn das Modell den Fehler auf dem Trainings-Datensatz weiter minimiert, während der Fehler auf dem Validierungs-Datensatz steigt. Die meisten Neuronalen Netzwerke haben eine sehr große Anzahl Gewichtungsfaktoren, weshalb diese Netzwerke besonders anfällig für Überanpassung sind.
Unteranpassung passiert, wenn das Modell übergeneralisiert. D.h. das Modell ist nicht fähig, die Komplexität der Aufgabe zu erfassen. Dies wird ersichtlich, wenn der Wert der Zielfunktion oder der Fehler auf dem Trainings-Datensatz nicht signifikant gemindert wird.
Bei der Bildklassifikation misst die Zielfunktion die Übereinstimmung zwischen den wahren, vom Benutzer gegebenen Klassen (den Labels) und den vom Klassifikator zugeordneten Klassen (jeweils größter Wahrscheinlichkeit). D.h. die Zielfunktion ordnet einer Klassifikation den Schaden zu, der entsteht, wenn die gefolgerte Klassenzugehörigkeit nicht der gegebenen Klasse (dem Label) entspricht. Beim Training optimieren wir die Argumente dieser Zielfunktion, um das Netzwerk für seine spezifische Aufgabe zu trainieren.
Operatoren |