public override void Backward(params NdArray[] ys) { NdArray[] xs = PrevInputs[PrevInputs.Count - 1]; PrevInputs.RemoveAt(PrevInputs.Count - 1); InitGrad(); BackwardCountUp(); foreach (NdArray x in xs) { x.UseCount--; if (x.Grad == null) { x.InitGrad(); } } UsedPrevInputs.Add(xs); MultiOutputBackward(ys[0], xs); //使い切ったら復活 if (PrevInputs.Count == 0) { PrevInputs.AddRange(UsedPrevInputs); UsedPrevInputs.Clear(); } }
public void BackwardDI(params NdArray <T>[] ys) { NdArray <T>[] xs = PrevInputs[PrevInputs.Count - 1]; PrevInputs.RemoveAt(PrevInputs.Count - 1); #if DEBUG if (xs == null || xs.Length != 2) { throw new Exception("引数が正しくありません"); } #endif InitGrad(); BackwardCountUp(); xs[0].UseCount--; if (xs[0].Grad == null) { xs[0].InitGrad(); } UsedPrevInputs.Add(xs); DualOutputBackward(ys[0], xs[0], xs[1].Data[0]); if (PrevInputs.Count == 0) { PrevInputs.AddRange(UsedPrevInputs); UsedPrevInputs.Clear(); } }
public override void Backward(params NdArray[] ys) { NdArray[] xs = PrevInputs[PrevInputs.Count - 1]; PrevInputs.RemoveAt(PrevInputs.Count - 1); #if DEBUG if (xs == null || xs.Length != 1) { throw new Exception("引数が正しくありません"); } #endif InitGrad(); BackwardCountUp(); xs[0].UseCount--; if (xs[0].Grad == null) { xs[0].InitGrad(); } UsedPrevInputs.Add(xs); SingleOutputBackward(ys[0], xs[0]); //使い切ったら復活 if (PrevInputs.Count == 0) { PrevInputs.AddRange(UsedPrevInputs); UsedPrevInputs.Clear(); } }
public void BackwardMO(params NdArray <T>[] ys) { NdArray <T>[] xs = PrevInputs[PrevInputs.Count - 1]; #if DEBUG if (xs == null || xs.Length != 1) { throw new Exception("引数が正しくありません"); } #endif xs[0].UseCount--; //出力した両方で使用が終わったら if (xs[0].UseCount <= 0) { if (xs[0].Grad == null) { xs[0].InitGrad(); } InitGrad(); BackwardCountUp(); PrevInputs.RemoveAt(PrevInputs.Count - 1); NdArray <T>[] prevys = PrevOutputs[PrevOutputs.Count - 1]; PrevOutputs.RemoveAt(PrevOutputs.Count - 1); UsedPrevInputs.Add(xs); UsedPrevOutputs.Add(prevys); MultiOutputBackward(prevys, xs[0]); if (PrevInputs.Count == 0) { PrevInputs.AddRange(UsedPrevInputs); UsedPrevInputs.Clear(); } if (PrevOutputs.Count == 0) { PrevOutputs.AddRange(UsedPrevOutputs); UsedPrevOutputs.Clear(); } } }