예제 #1
0
        public (FloatArray dhprev, FloatArray dcprev) Backward(FloatArray dh, FloatArray dcnext, FloatArray cprev, FloatArray fGate, FloatArray iGate, FloatArray cGate, FloatArray cellState, FloatArray oGate)
        {
            // Set outputs
            F.Output = fGate;
            I.Output = iGate;
            C.Output = cGate;
            O.Output = oGate;

            // cell State Derivate
            var cellStateAct = cellState.Tanh();
            var cellStateDer = (1 - cellStateAct * cellStateAct);

            // cell state gradient
            var dcellSate = dcnext.Clone();

            dcellSate += dh * oGate * cellStateDer;

            // output gate gradient
            var doGate = O.BackWard(dh * cellStateAct);

            // cell gate gradient
            var dcGate = C.BackWard(dcellSate * iGate);

            // input gate gradient
            var diGate = I.BackWard(dcellSate * cGate);

            // forget gate gradient
            var dfGate = F.BackWard(dcellSate * cprev);

            // lstm next
            var dz = (F.Weights * dfGate).SumLine() + (I.Weights * diGate).SumLine() + (C.Weights * dcGate).SumLine() + (O.Weights * doGate).SumLine();

            //  dhPrev, cprev
            return(dz, fGate *dcellSate);
        }
예제 #2
0
 private FloatArray Tanh(FloatArray x)
 {
     return(x.Tanh());
 }
예제 #3
0
 public static FloatArray Tanh(FloatArray x)
 {
     return(x.Tanh());
 }
예제 #4
0
 public FloatArray Activate(FloatArray sum)
 {
     return(sum.Tanh());
 }