コード例 #1
0
        public override NdArray[] Forward(bool verbose = true, [NotNull] params NdArray[] xs)
        {
            PrevInputs.Add(xs);

            xs[0].UseCount++;
            return(SingleInputForward(xs[0]));
        }
コード例 #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
ファイル: MultiInputFunction.cs プロジェクト: ohisama/KelpNet
        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();
            }
        }
コード例 #4
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();
            }
        }
コード例 #5
0
        public override NdArray[] Forward(params NdArray[] xs)
        {
            PrevInputs.Add(xs);
            xs[0].UseCount++;

            return(new[] { SingleInputForward(xs[0]) });
        }
コード例 #6
0
ファイル: DualInputFunction.cs プロジェクト: Satssuki/KelpNet
        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 != 2)
            {
                throw new Exception("引数が正しくありません");
            }
#endif
            InitGrad();
            BackwardCountUp();

            xs[0].UseCount--;
            xs[1].UseCount--;

            if (xs[0].Grad == null)
            {
                xs[0].ClearGrad();
            }
            if (xs[1].Grad == null)
            {
                xs[1].ClearGrad();
            }

            DualOutputBackward(ys[0], xs[0], xs[1]);
        }
コード例 #7
0
        public NdArray <T>[] ForwardDI(params NdArray <T>[] xs)
        {
            PrevInputs.Add(xs);

            xs[0].UseCount++;

            return(new[] { DualInputForward(xs[0], xs[1].Data[0]) });
        }
コード例 #8
0
        public NdArray <T>[] ForwardBase(params NdArray <T>[] xs)
        {
            PrevInputs.Add(xs);

            xs[0].UseCount++;

            return(new[] { SingleInputForward(xs[0]) });
        }
コード例 #9
0
        public override NdArray[] Forward(bool verbose = true, [NotNull] params NdArray[] xs)
        {
            PrevInputs.Add(xs);

            xs[0].UseCount++;
            xs[1].UseCount++;

            return(new[] { DualInputForward(xs[0], xs[1]) });
        }
コード例 #10
0
ファイル: MultiInputFunction.cs プロジェクト: Kawaian/KelpNet
        public override NdArray[] Forward(params NdArray[] xs)
        {
            PrevInputs.Add(xs);

            foreach (NdArray x in xs)
            {
                x.UseCount++;
            }

            return(new[] { MultiInputForward(xs) });
        }
コード例 #11
0
        public override NdArray[] Forward(bool verbose = true, [NotNull] params NdArray[] xs)
        {
            PrevInputs.Add(xs);

            foreach (NdArray x in xs)
            {
                x.UseCount++;
            }

            return(new[] { MultiInputForward(xs) });
        }
コード例 #12
0
        public NdArray <T>[] ForwardMI(params NdArray <T>[] xs)
        {
            PrevInputs.Add(xs);

            foreach (NdArray <T> x in xs)
            {
                x.UseCount++;
            }

            return(MultiInputForward(xs));
        }
コード例 #13
0
        public NdArray <T>[] ForwardMO(params NdArray <T>[] xs)
        {
            PrevInputs.Add(xs);

            xs[0].UseCount++;
            xs[0].UseCount++;

            NdArray <T>[] result = SingleInputForward(xs[0]);
            PrevOutputs.Add(result);

            return(result);
        }
コード例 #14
0
ファイル: MultiInputFunction.cs プロジェクト: Kawaian/KelpNet
        public override void Backward(params NdArray[] ys)
        {
            NdArray[] xs = PrevInputs[PrevInputs.Count - 1];
            PrevInputs.RemoveAt(PrevInputs.Count - 1);

            BackwardCountUp();

            foreach (NdArray x in xs)
            {
                x.UseCount--;
            }

            MultiOutputBackward(ys[0], xs);
        }
コード例 #15
0
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   Backwards the given ys. </summary>
        ///
        /// <exception cref="Exception">    Thrown when an exception error condition occurs. </exception>
        ///
        /// <param name="ys">   A variable-length parameters list containing ys. </param>
        ///
        /// <seealso cref="M:KelpNet.Common.Functions.Function.Backward(params NdArray[])"/>
        ////////////////////////////////////////////////////////////////////////////////////////////////////

        public override void Backward(bool verbose = true, 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(string.Intern("Invalid argument"));
            }
#endif
            BackwardCountUp();

            xs[0].UseCount--;
            SingleOutputBackward(ys, xs[0]);
        }
コード例 #16
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
            BackwardCountUp();

            xs[0].UseCount--;
            SingleOutputBackward(ys[0], xs[0]);
        }
コード例 #17
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 != 2)
            {
                throw new Exception("Invalid argument");
            }
#endif
            BackwardCountUp();

            xs[0].UseCount--;
            xs[1].UseCount--;

            DualOutputBackward(ys[0], xs[0], xs[1]);
        }
コード例 #18
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();
                }
            }
        }
コード例 #19
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.ClearGrad();
                }
            }

            MultiOutputBackward(ys[0], xs);
        }