func (s *LogSoftmaxLayer) ApplyR(v autofunc.RVector, in autofunc.RResult) autofunc.RResult { return autofunc.PoolR(in, func(in autofunc.RResult) autofunc.RResult { // See comment in Apply() for details on how this works. maxIdx := maxVecIdx(in.Output()) maxValue := autofunc.SliceR(in, maxIdx, maxIdx+1) exponents := autofunc.AddFirstR(in, autofunc.ScaleR(maxValue, -1)) expSum := autofunc.SumAllR(autofunc.Exp{}.ApplyR(v, exponents)) expLog := autofunc.Log{}.ApplyR(v, expSum) denomLog := autofunc.AddR(expLog, maxValue) return autofunc.AddFirstR(in, autofunc.ScaleR(denomLog, -1)) }) }
func (_ SigmoidCECost) CostR(v autofunc.RVector, x linalg.Vector, a autofunc.RResult) autofunc.RResult { logsig := autofunc.LogSigmoid{} log := logsig.ApplyR(v, a) invLog := logsig.ApplyR(v, autofunc.ScaleR(a, -1)) xVar := autofunc.NewRVariable(&autofunc.Variable{x}, v) oneMinusX := autofunc.AddScalerR(autofunc.ScaleR(xVar, -1), 1) sums := autofunc.AddR(autofunc.MulR(xVar, log), autofunc.MulR(oneMinusX, invLog)) return autofunc.ScaleR(autofunc.SumAllR(sums), -1) }
func (_ CrossEntropyCost) CostR(v autofunc.RVector, x linalg.Vector, a autofunc.RResult) autofunc.RResult { return autofunc.PoolR(a, func(a autofunc.RResult) autofunc.RResult { xVar := autofunc.NewRVariable(&autofunc.Variable{x}, autofunc.RVector{}) logA := autofunc.Log{}.ApplyR(v, a) oneMinusA := autofunc.AddScalerR(autofunc.ScaleR(a, -1), 1) oneMinusX := autofunc.AddScalerR(autofunc.ScaleR(xVar, -1), 1) log1A := autofunc.Log{}.ApplyR(v, oneMinusA) errorVec := autofunc.AddR(autofunc.MulR(xVar, logA), autofunc.MulR(oneMinusX, log1A)) return autofunc.ScaleR(autofunc.SumAllR(errorVec), -1) }) }
func (_ DotCost) CostR(v autofunc.RVector, x linalg.Vector, a autofunc.RResult) autofunc.RResult { xVar := autofunc.NewRVariable(&autofunc.Variable{x}, v) return autofunc.ScaleR(autofunc.SumAllR(autofunc.MulR(xVar, a)), -1) }