다음을 통해 공유


어떻게 할까요? 브레인스크립트에서 항목을 표현합니다.

BrainScript 구성 파일에 대한 멋진 구문 강조 표시 가져오기

사용하는 vim경우 수행하는 방법은 다음과 같습니다. 다른 편집기도 유사해야 합니다.

:set syntax=conf

완벽하지는 않지만 구문 강조 표시가 없는 것보다 훨씬 낫습니다. 구문 파일을 작성하는 .vim 방법을 알고 있는 경우 끌어오기 요청을 보내주세요.

에맥에서 가장 conf-mode 적합합니다. 전환하려면 키를 눌러 M-x 명령 입력을 시작한 다음 conf-mode. Windows Emacs에서도 conf-windows-mode해당 모드가 주석의 특수 문자에 의해 혼동되는 것처럼 보입니다.

내 이진 분류자의 오류 비율 표현

ClassificationError는 다중 클래스 레이블에 대해서만 작동하기 때문에 사용하지 마세요. 표준 산술 연산자와 논리 연산자를 사용하여 다음으로 표현할 수 있습니다.

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

여기서 여기서 예측은 입력을 고려할 때 양수 클래스의 확률을 예측한다고 가정합니다.

온도 매개 변수를 사용하여 softmax 표현

BrainScript에서 온도 소프트맥스는 매우 쉽습니다.

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

게이팅 메커니즘 표현

가장 간단한 방법은 사용하는 것입니다.

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

스칼라 및 텐서와 함께 작동합니다(모든 인수는 브로드캐스트할 수 있음).

동적 축 위에 소프트맥스 표현

동적 축에 대한 softmax는 되풀이를 통해 수행할 수 있습니다.

브레인스크립트:

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

영역아웃 구현

상수에 적용된 드롭아웃이 동적으로 평가되는지 궁금할 수 있습니다. 믿어도 됩니다! 따라서 영역 아웃 은 다음과 같이 간단합니다.

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

상수 3D 텐서 빌드

CNTK 상수 3D 텐서 빌드하려고 합니다. 나는 1D 및 2D 상수 배열을 생성하는 방법을 배웠습니다, 나는 그들을 스택 (연결 또는 결합)하고 반복 할 수 있습니다. 이제 3D 텐서 만들기 위해 2D 텐서가 쌓여야 하나요?

예를 들어 텐서가 3개 있다고 가정해 봅시다.

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

이제 말할 수 있습니다.

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

100 x 200 x 3] 텐서가 표시됩니다.

(반면에 Splice(A:B:C, axis=1)라고 하면 [300 x 200] 텐서가 표시되고 Splice(A:B:C, axis=2)는 [100 x 600] 텐서가 됩니다.)

새 차원을 스플라이스하려면 모든 입력의 차원이 일치해야 합니다. 예를 들어 축 3을 따라 ParameterTensor {100:200} 및 ParameterTensor {100:50}을(를) 쌓을 수 없습니다(하지만 축 2를 따라 누적하면 [100 x 250] 텐서).

또한 축 인덱스는 수학과 같이 1 기반입니다. 예를 들어 행렬의 행 차원은 첫 번째 축, 축=1이고 열 차원은 두 번째 축인 axis=2입니다.

학습 손실 해석

epoch가 완료된 후 CNTK 학습 손실을 굵게 계산하는 방법은 무엇인가요? 최종 모델이 전체 학습 집합을 통해 값을 가져오나요, 아니면 단순히 Epoch 중에 업데이트되는 동안 모델에 의해 생성된 miniBatch 학습 손실을 평균하나요?

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

대답은 후자입니다(평균은 가변 길이인 경우 미니배치의 샘플에 의해 가중치가 적용됩니다). 즉, Epoch의 끝에 있는 상태에서 모델의 실제 학습 손실을 받지 않습니다.