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 (d *DropoutLayer) ApplyR(v autofunc.RVector, in autofunc.RResult) autofunc.RResult { if d.Training { mask := d.dropoutMask(len(in.Output())) maskVar := autofunc.NewRVariable(mask, v) return autofunc.MulR(in, maskVar) } else { return autofunc.ScaleR(in, d.KeepProbability) } }
func (r *RegularizingCost) CostR(v autofunc.RVector, a linalg.Vector, x autofunc.RResult) autofunc.RResult { regFunc := autofunc.SquaredNorm{} cost := r.CostFunc.CostR(v, a, x) for _, variable := range r.Variables { norm := regFunc.ApplyR(v, autofunc.NewRVariable(variable, v)) cost = autofunc.AddR(cost, autofunc.ScaleR(norm, r.Penalty)) } return cost }
// ApplyBlockR applies the block to an input. func (g *GRU) ApplyBlockR(rv autofunc.RVector, s []RState, in []autofunc.RResult) BlockRResult { stateVars, stateRes := PoolVecRStates(s) var gateInputs []autofunc.RResult for i, x := range stateRes { gateInputs = append(gateInputs, in[i], x) } n := len(in) gateInput := autofunc.ConcatR(gateInputs...) stateIn := autofunc.ConcatR(stateRes...) resetMask := g.resetGate.BatchR(rv, gateInput, n) updateMask := g.updateGate.BatchR(rv, gateInput, n) maskedByReset := autofunc.MulR(resetMask, stateIn) inputValue := autofunc.PoolSplitR(n, maskedByReset, func(newStates []autofunc.RResult) autofunc.RResult { var newGateInputs []autofunc.RResult for i, input := range in { newGateInputs = append(newGateInputs, input, newStates[i]) } newIn := autofunc.ConcatR(newGateInputs...) return g.inputValue.BatchR(rv, newIn, n) }) newState := autofunc.PoolR(updateMask, func(umask autofunc.RResult) autofunc.RResult { updateComplement := autofunc.AddScalerR(autofunc.ScaleR(umask, -1), 1) return autofunc.AddR(autofunc.MulR(umask, stateIn), autofunc.MulR(updateComplement, inputValue)) }) return &gruRResult{ InStates: stateVars, Output: newState, } }
func (r *RescaleLayer) ApplyR(v autofunc.RVector, in autofunc.RResult) autofunc.RResult { return autofunc.ScaleR(autofunc.AddScalerR(in, r.Bias), r.Scale) }
func (_ HyperbolicTangent) ApplyR(v autofunc.RVector, r autofunc.RResult) autofunc.RResult { stretched := autofunc.ScaleR(autofunc.Sigmoid{}.ApplyR(v, autofunc.ScaleR(r, 2)), 2) return autofunc.AddScalerR(stretched, -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) }