Hoe kan ik dingen uitdrukken in BrainScript
- Krijg je leuke syntaxismarkeringen voor BrainScript-configuratiebestanden ?
- De foutfrequentie van mijn binaire classificatie uitdrukken?
- Een softmax uitdrukken met een temperatuurparameter?
- Een gatingsmechanisme uitdrukken?
- Een softmax over een dynamische as uitdrukken?
- Zone-out?
- Een constante 3D-tensor bouwen?
- Vectoren combineren of samenvoegen in BrainScript?
- Het trainingsverlies interpreteren?
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.