train_dl_model_batch
— Trainieren eines Deep Learning-Modells.
train_dl_model_batch( : : DLModelHandle, DLSampleBatch : DLTrainResult)
Der Operator train_dl_model_batch
führt einen Trainingsschritt
des in DLModelHandle
enthaltenen Deep Learning-Modells aus.
Die aktuellen Zielfuntions-Werte werden im Dictionary
DLTrainResult
zurückgegeben.
Ein Trainingsschritt bedeutet hier das einmalige Aktualisieren der
Gewichte, basierend auf dem Batch mit Bildern, der in DLSampleBatch
gegeben ist.
Der Optimierungsalgorithmus, der dazu genutzt wird, ist im Abschnitt
„Weitere Informationen zu den Algorithmen“ weiter unten genauer erklärt.
Für weitere Informationen zum Trainieren eines Netzwerks, siehe
Unterkapitel „Das Netzwerk und der Trainingsprozess“ im Kapitel
Deep Learning.
Um ein Modell erfolgreich zu trainieren, müssen die verwendbaren
Hyperparameter gesetzt und die Trainingsdaten den Modellanforderungen
entsprechend übergeben werden.
Für Informationen zu den Hyperparameter wird auf das Kapitel des jeweiligen
Modells sowie das allgemeine Kapitel Deep Learning verwiesen.
Die Trainingsdaten bestehen aus Bildern und den zugehörigen
Informationen. Dieser Operator erwartet einen Batch an Trainingsdaten,
übergeben durch ein Tupel von Dictionaries DLSampleBatch
.
Ein solches DLSample
Dictionary wird
aus DLDataset
für jedes einzelne Bild erzeugt, z.B. durch die
Prozedur gen_dl_samples
. Siehe das Kapitel
Deep Learning / Modell für weitere Informationen zu den verwendeten
Dictionaries und deren Schlüssel.
Die Anzahl an Bildern in einem DLSampleBatch
Tupel muss einem
Vielfachen der 'batch_size' entsprechen, wobei der Parameter
'batch_size' durch die Größe des vorhandenen GPU-Speichers
limitiert ist. Um mehr Bilder in einem Trainingsschritt verarbeiten
zu können, kann der Modellparameter 'batch_size_multiplier'
auf einen Wert größer 1 gesetzt werden. Die Anzahl der DLSample
Dictionaries, die dem Trainings-Operator übergeben werden, beträgt
'batch_size' mal 'batch_size_multiplier' . Dabei sei
angemerkt, dass ein Trainingsschritt auf einem Batch mit einem
'batch_size_multiplier' größer 1 eine Approximation eines
Trainingsschrittes ist, der auf dem gleichen Batch, aber mit einem
'batch_size_multiplier' von 1 und einer entsprechend größeren
'batch_size' berechnet wurde. Beispielsweise kann man
Unterschiede erwarten zwischen Werten, die mit einer
'batch_size' von 4 und 'batch_size_multiplier' von 2
berechnet wurden, und Werten, die mit einer 'batch_size' von 8
und 'batch_size_multiplier' von 1 berechnet wurden, obwohl in
beiden Fällen mit der gleichen Anzahl an DLSample
Dictionaries
gearbeitet wurde. Allerdings liefert diese Approximation im Allgemeinen
vergleichbar gute Ergebnisse, so dass sie verwendet werden kann, wenn man
mit mehr DLSample
Dictionaries trainieren möchte als der
Speicher der GPU erlaubt. In seltenen Fällen kann es vorkommen, dass die
Approximation mit einer 'batch_size' von 1 und einem entsprechend
großen 'batch_size_multiplier' nicht die erwartete Performance
zeigt. Das Problem kann in den meisten Fällen gelöst werden, indem die
'batch_size' auf einen Wert größer 1 gesetzt wird.
Im Ausgabe-Dictionary DLTrainResult
befinden sich der
aktuelle Wert der Gesamt-Zielfunktion unter dem Schlüssel
total_loss
sowie die Werte aller weiteren im Modell enthaltenen
Zielfunktionen.
Ein nichtlinearer Optimierungsalgorithmus wird während des Trainings angewendet, mit dem Ziel den Wert der Gesamt-Zielfunktion zu minimieren. Diese wird basierend auf den Vorhersagen des Neuronalen Netzwerks zum aktuellen Batch von Bildern bestimmt. Der Algorithmus, der zur Optimierung genutzt wird, ist ein stochastisches Gradientenabstiegsverfahren (SGD). Er aktualisiert die Gewichte der Layer vorhergehender Iterationen , , auf die neuen Werte für Iteration wie folgt:
Hierbei ist die Lernrate, das Momentum, die Gesamt-Zielfunktion und der Gradient der Gesamt-Zielfunktion bezüglich der Gewichte. Die Variable wird genutzt um den Einfluss des Momentums miteinzubeziehen.
Die unterschiedlichen Modelle haben verschiedene Zielfunktionen implementiert, welche aufsummiert werden. Dazu kommt der Regularisierungsterm , welcher insbesondere größere Gewichte bestraft, und zusammen ergeben sie die Gesamt-Zielfunktion.
Die verschiedenen Arten von Zielfunktionen (englisch 'loss') sind:
Huber Loss
(Modell mit
'type' ='detection' ):Der gesamte 'Huber Loss' bildet sich aus der Summe der Beiträge aller Variablen der umschließenden Rechtecke für jede gefundene Instanz des Batches. Der Beitrag einer einzelnen Variable ist wie folgt definiert: Dabei ist eine Variable des umschließenden Rechtecks und ein Parameter, der auf den Wert 0.11 festgelegt ist.
Focal Loss
(Modell mit 'type' ='detection' ):Der 'Focal Loss' bildet sich aus der Summe der Beiträge für jede gefundene Instanz des Batches. Der Beitrag ist für eine einzelne Instanz wie folgt definiert: wobei ein Parameter ist, der auf den Wert 2 festgelegt ist. steht für das klassenspezifische Gewicht 'class_weight' der -ten Klasse steht und , definiert sind als Hierbei ist ein Tupel der vom Modell geschätzten Wahrscheinlichkeiten für jede der -vielen Klassen und ein One-Hot-kodierter Zielvektor, der die Klasse der Annotation kodiert.
Multinomial Logistic Loss
(Modell mit 'type' ='classification' ,
'segmentation' ):Der 'Multinomial Logistic Loss' ist auch als 'Cross Entropy Loss' bekannt. Definiert ist der 'Multinomial Logistic Loss' wie folgt:
Hierbei steht für das vorhergesagte Ergebnis, welches von den Gewichten des Netzwerks und dem Eingabe-Batch abhängt. ist ein One-Hot-kodierter Zielvektor, der das Label des -ten Bildes des Batches mit -vielen Bildern kodiert und soll als Vektor verstanden werden, sodass auf jede Komponente von angewendet wird.
Der Regularisierungsterm ist eine gewichtete
-Norm, die alle Gewichte, mit Ausnahme der
Bias-Werte, miteinbezieht.
Sein Einfluss kann durch kontrolliert werden.
Letzteres steht für den Hyperparameter 'weight_prior' ,
der mit set_dl_model_param
gesetzt werden kann.
Der Index läuft hierbei über alle Gewichte des Netzwerks,
mit der Ausnahme von Bias-Termen. Diese werden nicht regularisiert.
Der Regularisierungsterm schiebt die
Gewichte gegen Null und bestraft damit insbesondere größere Gewichte,
was effektiv die Komplexität des Modells verringert.
Um diesen Operator ausführen zu können, werden cuDNN und cuBLAS benötigt,
falls 'runtime' auf 'gpu' gesetzt ist
(siehe get_dl_model_param
).
Für weitere Details wird auf den „Installation Guide“
, Abschnitt
„Requirements for Deep Learning“, verwiesen.
DLModelHandle
(input_control) dl_model →
(handle)
Handle des Deep Learning-Modells.
DLSampleBatch
(input_control) dict →
(handle)
Tupel von Dictionaries mit Eingabebildern und zugehörigen Informationen.
DLTrainResult
(output_control) dict →
(handle)
Dictionary mit den Trainingsergebnissen.
Sind die Parameterwerte korrekt, dann liefert
train_dl_model_batch
den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine
Fehlerbehandlung durchgeführt.
read_dl_model
,
set_dl_model_param
,
get_dl_model_param
Deep Learning Training