create_dl_layer_loss_ctc — Erstellen eines CTC-Loss-Layers.
create_dl_layer_loss_ctc( : : DLLayerInput, DLLayerInputLengths, DLLayerTarget, DLLayerTargetLengths, LayerName, GenParamName, GenParamValue : DLLayerLossCTC)
Der Operator create_dl_layer_loss_ctc erstellt einen Connectionist
Temporal Classification (CTC) Loss-Layer, dessen Handle in
DLLayerLossCTC zurückgegeben wird.
Siehe die unten angegebenen Referenzen für Informationen zum CTC-Loss.
Mit diesem Loss-Layer ist es möglich, Sequence-to-Sequence-Modelle (Seq2Seq)
zu trainieren.
Damit kann z.B. ein Modell trainiert werden, das in der Lage ist, Text in
einem Bild zu lesen. Dazu werden Sequenzen verglichen, nämlich die ermittelte
Vorhersage des Netzwerks DLLayerInput (mit Sequenzlänge
DLLayerInputLengths) mit dem gegebenen Target DLLayerTarget
(mit Sequenz Länge DLLayerTargetLengths).
Die folgenden Variablen sind zum Verständnis der Eingabeformen von Bedeutung:
T: Maximale Eingabesequenzlänge
(d.h., Breite von DLLayerInput)
S: Maximale Ausgabesequenzlänge
(d.h., Breite von DLLayerTarget)
C: Anzahl Klassen inklusive 0 als ID der leeren Klasse
(d.h., Tiefe von DLLayerInput)
Dieser Layer erwartet mehrere Layer als Eingabe:
DLLayerInput: Bestimmt den Eingabelayer mit
Netzwerkvorhersagen.
Form: [T,1,C]
DLLayerInputLengths: Bestimmt die Eingabesequenzlänge
jedes Batch-Elements.
Form: [1,1,1]
DLLayerTarget: Bestimmt die Zielsequenzen.
Form: [S,1,1]
DLLayerTargetLengths: Bestimmt die Länge der
Zielsequenzen jedes Batch-Elements.
Form: [1,1,1]
Der Parameter LayerName legt einen individuellen Layernamen fest.
Es ist zu beachten, dass beim Erstellen eines Modells mit
create_dl_model jeder Layer des erstellten Netzes einen
eindeutigen Namen haben muss.
Der CTC-Loss wird in einem CNN typischerweise wie folgt angewendet.
Es wird angenommen, dass die Eingabesequenz aus einem CNN-Layer stammt und
die Form
[Breite: T, Höhe: 1, Tiefe: C]
hat.
Typischerweise wird das Ende eines großen Fully-convolutional Klassifikators
mit einem 'average pooling'-Layer auf die Höhe 1 gepoolt.
Es ist wichtig, dass der letzte Layer breit genug ist,
um genügend Informationen zu enthalten.
Um die Sequenzvorhersage in der Ausgabe-Tiefe zu erhalten,
wird ein 1x1 Convolutional-Layer nach dem Pooling hinzugefügt, wobei die
Anzahl der Kernels auf C gesetzt wird.
In diesem Anwendungsfall erhält der CTC-Loss diesen Convolutional-Layer
als Eingabelayer DLLayerInput.
Die Breite des Eingabelayers bestimmt die maximale Ausgabesequenz
des Modells.
Der CTC-Loss kann auf einen Batch von Eingabeelementen mit unterschiedlichen
Eingabe- und Zielsequenzlängen angewendet werden.
T und S sind die maximalen Längen.
In DLLayerInputLengths und DLLayerTargetLengths
muss die individuelle Länge jedes Batch-Elements angegeben werden.
Ein Modell, das diesen Layer enthält, kann nicht auf einer CPU trainiert werden.
Ein Modell, das diesen Layer enthält, kann nur mit 'batch_size_multiplier' = 1.0 trainiert werden.
Der Eingabelayer DLLayerInput darf kein Softmax-Layer
sein.
Die Softmax-Berechnung wird intern in diesem Layer durchgeführt.
Für die Inferenz sollte ein zusätzlicher Softmax-Layer mit
DLLayerInput verbunden werden
(siehe create_dl_layer_softmax).
Die folgenden generischen Parameter GenParamName und die
entsprechenden Werte GenParamValue werden unterstützt:
Bestimmt, ob apply_dl_model die Ausgabe dieses Layers im
Dictionary DLResultBatch zurückgibt, auch ohne den
Layer in Outputs anzugeben ('true'), oder
nur falls er angegeben wird ('false').
Default: 'false'
Bestimmte Parameter von Layern, die mit create_dl_layer_loss_ctc
erzeugt wurden, können mit weiteren Operatoren gesetzt und abgerufen werden.
Die folgenden Tabellen geben einen Überblick, welche Parameter mit
set_dl_model_layer_param gesetzt werden können und welche mit
get_dl_model_layer_param oder get_dl_layer_param ausgelesen
werden können. Es ist zu beachten, dass die Operatoren
set_dl_model_layer_param und get_dl_model_layer_param ein
Modell benötigen, das mit create_dl_model erzeugt wurde.
| Layer-Parameter | set | get |
|---|---|---|
'input_layer' (DLLayerInput, DLLayerInputLengths, DLLayerTarget, und/oder DLLayerTargetLengths) |
||
'name' (LayerName) |
||
'output_layer' (DLLayerLossCTC) |
||
| 'shape' | ||
| 'type' |
| Generische Layer-Parameter | set | get |
|---|---|---|
| 'is_inference_output' | ||
| 'num_trainable_params' |
DLLayerInput (input_control) dl_layer → (handle)
Eingabelayer mit Netzwerkvorhersagen.
DLLayerInputLengths (input_control) dl_layer → (handle)
Eingabelayer, der die Eingabesequenzlänge jedes Batch-Elements festlegt.
DLLayerTarget (input_control) dl_layer → (handle)
Eingabelayer, der die Zielsequenz festlegt. Wenn die
Eingabegröße des Netzwerks verändert wird, dann wird
die Breite dieses Layers automatisch an die Breite des
DLLayerInput Layers angepasst
DLLayerTargetLengths (input_control) dl_layer → (handle)
Eingabelayer, der die Zielsequenzlänge jedes Batch-Elements festlegt.
LayerName (input_control) string → (string)
Name des Ausgabelayers.
GenParamName (input_control) attribute.name(-array) → (string)
Namen der generischen Eingabeparameter.
Defaultwert: []
Werteliste: 'is_inference_output'
GenParamValue (input_control) attribute.value(-array) → (string / integer / real)
Werte der generischen Eingabeparameter.
Defaultwert: []
Wertevorschläge: 'true', 'false'
DLLayerLossCTC (output_control) dl_layer → (handle)
CTC-Loss-Layer.
* Create a simple Seq2Seq model which overfits to a single output sequence.
* Input sequence length
T := 6
* Number of classes including blank (blank is always class_id: 0)
C := 3
* Batch Size
N := 1
* Maximum length of target sequences
S := 3
* Model creation
create_dl_layer_input ('input', [T,1,1], [], [], Input)
create_dl_layer_dense (Input, 'dense', T*C, [], [], DLLayerDense)
create_dl_layer_reshape (DLLayerDense, 'dense_reshape', [T,1,C], [], [],\
ConvFinal)
* Training part
* Specify the shapes without batch-size
* (batch-size will be specified in the model).
create_dl_layer_input ('ctc_input_lengths', [1,1,1], [], [],\
DLLayerInputLengths)
create_dl_layer_input ('ctc_target', [S,1,1], [], [], DLLayerTarget)
create_dl_layer_input ('ctc_target_lengths', [1,1,1], [], [],\
DLLayerTargetLengths)
* Create the loss layer
create_dl_layer_loss_ctc (ConvFinal, DLLayerInputLengths, DLLayerTarget,\
DLLayerTargetLengths, 'ctc_loss', [], [],\
DLLayerLossCTC)
* Get all names so that users can set values
get_dl_layer_param (ConvFinal, 'name', CTCInputName)
get_dl_layer_param (DLLayerInputLengths, 'name', CTCInputLengthsName)
get_dl_layer_param (DLLayerTarget, 'name', CTCTargetName)
get_dl_layer_param (DLLayerTargetLengths, 'name', CTCTargetLengthsName)
* Inference part
create_dl_layer_softmax (ConvFinal, 'softmax', [], [], DLLayerSoftMax)
create_dl_layer_depth_max (DLLayerSoftMax, 'prediction', 'argmax', [], [],\
DLLayerDepthMaxArg, _)
* Setting a seed because the weights of the network are randomly initialized
set_system ('seed_rand', 35)
create_dl_model ([DLLayerLossCTC,DLLayerDepthMaxArg], DLModel)
set_dl_model_param (DLModel, 'batch_size', N)
set_dl_model_param (DLModel, 'runtime', 'gpu')
set_dl_model_param (DLModel, 'learning_rate', 1)
* Create input sample for training
InputSequence := [0,1,2,3,4,5]
TargetSequence := [1,2,1]
create_dict (InputSample)
set_dict_tuple (InputSample, 'input', InputSequence)
set_dict_tuple (InputSample, 'ctc_input_lengths', |InputSequence|)
set_dict_tuple (InputSample, 'ctc_target', TargetSequence)
set_dict_tuple (InputSample, 'ctc_target_lengths', |TargetSequence|)
Eps := 0.01
PredictedSequence := []
dev_inspect_ctrl ([InputSequence, TargetSequence, CTCLoss, PredictedValues,\
PredictedSequence])
MaxIterations:= 15
for I := 0 to MaxIterations by 1
apply_dl_model (DLModel, InputSample, ['prediction','softmax'], \
DLResultBatch)
get_dict_object (Softmax, DLResultBatch, 'softmax')
get_dict_object (Prediction, DLResultBatch, 'prediction')
PredictedValues := []
for t := 0 to T-1 by 1
get_grayval (Prediction, 0, t, PredictionValue)
PredictedValues := [PredictedValues, PredictionValue]
endfor
train_dl_model_batch (DLModel, InputSample, DLTrainResult)
get_dict_tuple (DLTrainResult, 'ctc_loss', CTCLoss)
if (CTCLoss < Eps)
break
endif
stop()
endfor
* Rudimentary implementation of fastest path prediction
PredictedSequence := []
LastV := -1
for I := 0 to |PredictedValues|-1 by 1
V := PredictedValues[I]
if (V == 0)
LastV := -1
continue
endif
if (|PredictedSequence| > 0 and V == LastV)
continue
endif
PredictedSequence := [PredictedSequence, V]
LastV := PredictedSequence[|PredictedSequence|-1]
endfor
Graves Alex et al., "Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks." Proceedings of the 23rd international conference on Machine learning. 2006.
Deep Learning Training