Delen via


Hoe kan ik dingen uitdrukken in BrainScript

Get nice syntax highlighting for BrainScript config files

U kunt dit als volgt doen als u gebruikt vim; andere editors moeten vergelijkbaar zijn

:set syntax=conf

Dit is niet perfect, maar het is veel beter dan geen syntaxismarkeringen. Als u weet hoe u een .vim syntaxisbestand schrijft, stuurt u ons een pull-aanvraag.

In Emacs is conf-mode het meest geschikt. Als u wilt overschakelen, drukt u M-x om te beginnen met het invoeren van opdrachten en vervolgens op Enter conf-mode. Op Windows Emacs is er ook conf-windows-mode, maar die modus lijkt soms verward te raken door speciale tekens in opmerkingen.

De foutfrequentie van mijn binaire classificatie uitdrukken

Gebruik ClassificationError niet omdat deze alleen werkt voor labels met meerdere klassen. Met behulp van de standaard rekenkundige en logische operatoren kunt u dit uitdrukken als

err = (label != (prediction > 0.5))
...
evaluationNodes = (err)  

waarbij we hier aannemen dat voorspelling een schatting is van de waarschijnlijkheid van de positieve klasse die de invoer heeft gegeven.

Express a softmax met een temperatuurparameter

Een temperatuur softmax is heel eenvoudig in BrainScript

TemperatureSoftmax (z, T) = Softmax (z / Constant (T))

Een gatmechanisme uitdrukken

De eenvoudigste manier is om te gebruiken

BS.Boolean.If (condition, thenExpression, elseExpression)

die werkt met scalaire en tensoren (alle argumenten kunnen uitzenden).

Een softmax uitdrukken over een dynamische as

Een softmax over een dynamische as kan worden uitgevoerd via een terugkeerpatroon:

BrainScript:

SoftMaxOverSequence (z) = {
    # define a recursive expression for \log(\sum_{i=1}^t \exp(z_i))
    runningLogSumExp = LogPlus (z,
                           PastValue (0, runningLogSumExp, defaultHiddenActivation=-1e30)) 
    logSumExp = If (BS.Loop.IsLast (runningLogSumExp),  # if last entry
                /*then*/ runningLogSumExp,              # then copy that
                /*else*/ FutureValue (0, logSumExp))    # else just propagate to the front
    result = Exp (z - logSumExp)
}.result

Zone-out implementeren

U vraagt zich misschien af of vervolgkeuzelijst die is toegepast op een constante dynamisch wordt geƫvalueerd. Dat is het! Daarom is Zoneout net zo eenvoudig als

Zoneout (x, xprev) =
{
    mask = Dropout (BS.Constants.OnesLike (x))
    res = BS.Boolean.If (mask, xprev, x)
}.res

Een constante 3D-tensor bouwen

Ik wil een constante 3D-tensor bouwen in CNTK. Ik heb geleerd hoe ik 1D- en 2D-constante matrices kan produceren, ik kan ze stapelen (samenvoegen of combineren) en ze herhalen. Nu moet ik de 2D Tensors stapelen om een 3D-tensor te maken?

Stel dat u drie tensoren hebt, bijvoorbeeld

A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}

U kunt nu zeggen

    ABC = Splice (A:B:C, axis=3)

waarmee u een tensor van [100 x 200 x 3] krijgt.

(Als u daarentegen Splice (A:B:C, as=1) zou krijgen, krijgt u een tensor van [300 x 200] en Splice (A:B:C, as=2) krijgt u een tensor [100 x 600].)

Houd er rekening mee dat dimensies van alle invoer moeten overeenkomen om in een nieuwe dimensie te worden gepliceerd. U kunt bijvoorbeeld een ParameterTensor {100:200} en een ParameterTensor {100:50} langs as 3 stapelen (maar u kunt deze stapelen langs as 2, wat u een tensor [100 x 250] zou geven).

Houd er ook rekening mee dat asindexen op basis van 1 zijn, zoals in wiskunde. De rijdimensie van een matrix is bijvoorbeeld de eerste as, as=1 en de kolomdimensie is de tweede as, as=2.

Het trainingsverlies interpreteren

Hoe berekent CNTK het trainingsverlies (zoals vetgedrukt) nadat een tijdvak is voltooid? Doorloopt het uiteindelijke model de hele trainingsset om de waarde op te halen, of wordt het gemiddelde van de miniBatch-trainingsverlies die door het model worden geproduceerd terwijl het tijdens het tijdvak wordt bijgewerkt?

Finished Epoch[ 1 of 100]: [Training] CE = 0.15920662 * 59999999; totalSamplesSeen = 59999999; learningRatePerSample = 9.9999997e-05; epochTime=641.392s
Final Results: Minibatch[1-3510]: CE = 0.32190538 * 3592929
Finished Epoch[ 1 of 100]: [Validate] CE = 0.32190538 * 3592929

Het antwoord is het laatste (waarbij het gemiddelde wordt gewogen door de steekproeven in het minibatch voor het geval ze variabele lengte hebben). U krijgt dus niet het werkelijke trainingsverlies van het model in de toestand waarin het zich aan het einde van het tijdvak bevindt.