Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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();
            }
        }
Пример #4
0
        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();
                }
            }
        }