train_dl_model_batchT_train_dl_model_batchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch (Operator)

Name

train_dl_model_batchT_train_dl_model_batchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch — Trainieren eines Deep Learning-Modells.

Signatur

train_dl_model_batch( : : DLModelHandle, DLSampleBatch : DLTrainResult)

Herror T_train_dl_model_batch(const Htuple DLModelHandle, const Htuple DLSampleBatch, Htuple* DLTrainResult)

void TrainDlModelBatch(const HTuple& DLModelHandle, const HTuple& DLSampleBatch, HTuple* DLTrainResult)

HDict HDlModel::TrainDlModelBatch(const HDictArray& DLSampleBatch) const

static void HOperatorSet.TrainDlModelBatch(HTuple DLModelHandle, HTuple DLSampleBatch, out HTuple DLTrainResult)

HDict HDlModel.TrainDlModelBatch(HDict[] DLSampleBatch)

def train_dl_model_batch(dlmodel_handle: HHandle, dlsample_batch: Sequence[HHandle]) -> HHandle

Beschreibung

Der Operator train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch führt einen Trainingsschritt des in DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle enthaltenen Deep Learning-Modells aus. Die aktuellen Zielfunktionswerte werden im Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result zurückgegeben.

Das Modell DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle muss von einem der folgenden Typen ('type'"type""type""type""type""type") sein:

Ein Trainingsschritt bedeutet hier das einmalige Aktualisieren der Gewichte, basierend auf dem Batch mit Bildern, der in DLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchdlsample_batch 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 DLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchdlsample_batch. Ein solches DLSampleDLSampleDLSampleDLSampleDLSampledlsample Dictionary wird aus DLDatasetDLDatasetDLDatasetDLDatasetDLDatasetdldataset 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 DLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchdlsample_batch Tupel muss einem Vielfachen der 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" entsprechen. Insbesondere auf der GPU wird der Parameter 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" durch die Menge vorhandenen Speichers limitiert. Um mehr Bilder in einem Trainingsschritt verarbeiten zu können, kann der Modellparameter 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" auf einen Wert größer 1 gesetzt werden. Die Anzahl der DLSampleDLSampleDLSampleDLSampleDLSampledlsample Dictionaries, die dem Trainings-Operator übergeben werden, beträgt 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" mal 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier". Dabei sei angemerkt, dass ein Trainingsschritt auf einem Batch mit einem 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" größer 1 eine Approximation eines Trainingsschrittes ist, der auf dem gleichen Batch, aber mit einem 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" von 1 und einer entsprechend größeren 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" berechnet wurde. Beispielsweise kann man Unterschiede erwarten zwischen Werten, die mit einer 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" von 4 und 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" von 2 berechnet wurden, und Werten, die mit einer 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" von 8 und 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" von 1 berechnet wurden, obwohl in beiden Fällen mit der gleichen Anzahl an DLSampleDLSampleDLSampleDLSampleDLSampledlsample Dictionaries gearbeitet wurde. Allerdings liefert diese Approximation im Allgemeinen vergleichbar gute Ergebnisse, so dass sie verwendet werden kann, wenn man mit mehr DLSampleDLSampleDLSampleDLSampleDLSampledlsample Dictionaries trainieren möchte als der Speicher der GPU erlaubt. In seltenen Fällen kann es vorkommen, dass die Approximation mit einer 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" von 1 und einem entsprechend großen 'batch_size_multiplier'"batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier""batch_size_multiplier" nicht die erwartete Performance zeigt. Das Problem kann in den meisten Fällen gelöst werden, indem die 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" auf einen Wert größer 1 gesetzt wird.

Im Ausgabe-Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result befinden sich der aktuelle Wert der Gesamt-Zielfunktion unter dem Schlüssel total_loss sowie die Werte aller weiteren im Modell enthaltenen Zielfunktionen.

Für Modelle mit 'type'"type""type""type""type""type" = 'detection'"detection""detection""detection""detection""detection" sind dies z.B. die Zielfunktionen der Heads aller ausgewählten Ebenen, namentlich der 'Huber Loss' für die Heads zur Bestimmung der Umschließenden Rechtecke und der 'Focal Loss' für die Heads zur Klassifizierung (siehe auch Deep Learning / Objektdetektion sowie 'max_level'"max_level""max_level""max_level""max_level""max_level" und 'min_level'"min_level""min_level""min_level""min_level""min_level" in get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param).

Weitere Informationen zu den Algorithmen

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'"type""type""type""type""type"='detection'"detection""detection""detection""detection""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'"type""type""type""type""type"='detection'"detection""detection""detection""detection""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_weights') 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'"type""type""type""type""type"='classification'"classification""classification""classification""classification""classification", 'segmentation'"segmentation""segmentation""segmentation""segmentation""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 Wert ist eine Gewichtung für die durch gegebene Klasse. Die Gewichtung entspricht dem durch 'class_weights' gesetzten Wert und wird zusätzlich durch die Summe der Gewichte aller Klassen normiert.

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'"weight_prior""weight_prior""weight_prior""weight_prior""weight_prior", der mit set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParamset_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.

Achtung

Der Operator train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch basiert auf Algorithmen, die in manchen Fällen nicht deterministisch sind. Daher können Ergebnisse von mehreren Aufrufen von train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch trotz gleicher Eingabewerte leicht voneinander abweichen. Durch Setzen des Parameters 'cudnn_deterministic'"cudnn_deterministic""cudnn_deterministic""cudnn_deterministic""cudnn_deterministic""cudnn_deterministic" von set_systemset_systemSetSystemSetSystemSetSystemset_system kann dies beeinflusst werden.

Systemvoraussetzungen: Die CPU-Implementierung dieses Operators unterstützt nur spezifische Plattformen. Um diesen Operator auf der GPU auszuführen, indem 'runtime'"runtime""runtime""runtime""runtime""runtime" auf 'gpu'"gpu""gpu""gpu""gpu""gpu" gesetzt ist (siehe get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param), werden cuDNN und cuBLAS benötigt. Für die konkreten Systemvoraussetzungen wird auf den „Installation Guide“, Abschnitt „Requirements for Deep Learning and Deep-Learning-Based Methods“, verwiesen.

Ausführungsinformationen

Parameter

DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle (input_control)  dl_model HDlModel, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle des Deep Learning-Modells.

DLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchDLSampleBatchdlsample_batch (input_control)  dict-array HDict, HTupleSequence[HHandle]HTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Tupel von Dictionaries mit Eingabebildern und zugehörigen Informationen.

DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result (output_control)  dict HDict, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Dictionary mit den Trainingsergebnissen.

Ergebnis

Sind die Parameterwerte korrekt, dann liefert train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch den Wert TRUE. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModelread_dl_model, set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParamset_dl_model_param, get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param

Nachfolger

apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelApplyDlModelapply_dl_model

Siehe auch

apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelApplyDlModelapply_dl_model

Modul

Deep Learning Training