public void CalculateParams(IMultipleLayer target)
 {
     mW = NumMath.Array(target.Size, target.ConectionsSize);
     vW = NumMath.Array(target.Size, target.ConectionsSize);
     mB = NumMath.Array(target.Size);
     vB = NumMath.Array(target.Size);
 }
Esempio n. 2
0
        private static void Sample(Array <FloatArray> hprev, int seed_ix, int size)
        {
            var x = new FloatArray(vocab_size);

            x[seed_ix] = 1;

            var ixes = new List <int>();

            for (int t = 0; t < size; t++)
            {
                var data = net.Output(x, hprev);

                var ix = NumMath.Choice(Enumerable.Range(0, vocab_size).ToArray(), 1, data.ps.ToArray()).First();

                x = new FloatArray(vocab_size)
                {
                    [ix] = 1
                };
                ixes.Add(ix);

                hprev = data.hs;
            }

            Write($"----\n { ixes.Select( c => ix_to_char[c] ).Join("") } \n----");
        }
        public float Loss(Array <float> targets, Array <float> prediction)
        {
            var dif = targets - prediction;
            var sum = NumMath.Sum(dif);

            return(.5f * (sum / targets.View.Length));
        }
Esempio n. 4
0
        private static void Sample(FloatArray hprev, FloatArray cprev, int seed_ix, int size)
        {
            var x = new FloatArray(vocab_size);

            x[seed_ix] = 1;

            var ixes = new List <int>();

            for (int t = 0; t < size; t++)
            {
                var data = net.FeedForward(x, hprev, cprev);

                var ix = NumMath.Choice(Enumerable.Range(0, vocab_size).ToArray(), 1, data.y.ToArray()).First();

                x = new FloatArray(vocab_size)
                {
                    [ix] = 1
                };
                ixes.Add(ix);

                hprev = data.h;
                cprev = data.c;
            }

            var str = string.Join("", ixes.Select(c => ix_to_char[c]));

            Console.WriteLine($"----\n {str} \n----");
        }
Esempio n. 5
0
 public void CalculateParams(IMultipleLayer target)
 {
     AdaDeltaW   = NumMath.Array(target.Size, target.ConectionsSize);
     AdaDeltaW_v = NumMath.Array(target.Size, target.ConectionsSize);
     AdaDeltaB   = NumMath.Array(target.Size);
     AdaDeltaB_v = NumMath.Array(target.Size);
 }
        public RecursiveNeuralNetwork(int inputSize, float learningRate, float std)
        {
            w      = NumMath.Random(inputSize, inputSize + inputSize, std);
            wScore = NumMath.Random(1, inputSize, std);
            b      = NumMath.Repeat(inputSize, 1);

            this.learningRate = learningRate;
        }
        public void BackWard(Array <float> values)
        {
            var DE = _errorFunction.Error(_target.OutputVector, values);
            var DO = _activationFunction.Derivate(_target.SumVector);

            _target.ErrorVector       = DE * DO;
            _target.ErrorWeightVector = NumMath.SumLine(_target.ErrorVector.W * _target.KnowlodgeMatrix);
        }
 public float Loss(Array <float> targets, float[] prediction)
 {
     using (var p = new Array <float>(prediction))
     {
         var dif = targets - p;
         var sum = NumMath.Sum(dif);
         return(.5f * (sum / targets.View.Length));
     }
 }
        /// <summary>
        /// Execute Backpropagation through time
        /// </summary>
        /// <returns></returns>
        public (float loss, Array <FloatArray2D> dwy, Array <FloatArray> dby, Array <Array <FloatArray2D> > dwh, Array <FloatArray> dbh, Array <FloatArray> hs) BPTT(int[] inputs, int[] targets, Array <FloatArray> hprev)
        {
            float loss = 0f;

            //Feedforward
            var xs = new Array <FloatArray>(inputs.Length);          // Inputs
            var hs = new Array <Array <FloatArray> >(inputs.Length); // Hidden Result
            var ps = new Array <Array <FloatArray> >(inputs.Length); // Softmax probabilit
            var tg = new Array <FloatArray>(inputs.Length);          // Targets

            hs[-1] = hprev;

            //Backward
            var dwy = new Array <FloatArray2D>(1);
            var dby = new Array <FloatArray>(1);

            var dwh    = new Array <Array <FloatArray2D> >(recurrentUnits);
            var dbh    = new Array <FloatArray>(recurrentUnits);
            var dhnext = new Array <FloatArray>(recurrentUnits);

            for (int t = 0; t < inputs.Length; t++)
            {
                xs[t]            = new FloatArray(input_size);
                xs[t][inputs[t]] = 1;

                tg[t]             = new FloatArray(output_size);
                tg[t][targets[t]] = 1;

                (hs[t], ps[t]) = FeedForward(xs[t], hs[t - 1]);
            }

            for (int t = inputs.Length - 1; t >= 0; t--)
            {
                // Sequencial
                (var l, var dy) = decoder.ComputeErrorNBackward(tg[t], ps[t]);
                (dhnext, _)     = encoder.Backward(dy, dhnext, hs[t]);

                // Parallel
                (var wy, var by) = decoder.ComputeGradient(hs[t][-1]);
                (var wh, var bh) = encoder.ComputeGradient(xs[t], hs[t - 1]);

                // Parallel
                dwy = dwy.Sum(wy);
                dby = dby.Sum(by);
                dwh = dwh.Sum(wh);
                dbh = dbh.Sum(bh);

                loss += l;
            }

            // Parallel
            dwy = NumMath.Normalize(-5, 5, dwy);
            dby = NumMath.Normalize(-5, 5, dby);
            dwh = NumMath.Normalize(-5, 5, dwh);
            dbh = NumMath.Normalize(-5, 5, dbh);

            return(loss, dwy, dby, dwh, dbh, hs[-1]);
        public RecurrentUnity(int input, int hidden, float learning_rate, float std)
        {
            input_size         = input;
            hidden_size        = hidden;
            this.learning_rate = learning_rate;

            Wxt = NumMath.Random(hidden_size, input_size, std);
            Wtt = NumMath.Random(hidden_size, hidden_size, std);
            bt  = NumMath.Repeat(hidden_size, 0);

            ResetAdagradParams();
        }
Esempio n. 11
0
                FloatArray hs, FloatArray cs) BPTT(Array <FloatArray> inputs, FloatArray error, FloatArray hprev, FloatArray cprev)
        {
            // store states
            var z_s   = new Array <FloatArray>(inputs.Length);
            var f_s   = new Array <FloatArray>(inputs.Length);
            var i_s   = new Array <FloatArray>(inputs.Length);
            var c_s_s = new Array <FloatArray>(inputs.Length);
            var c_s   = new Array <FloatArray>(inputs.Length);
            var o_s   = new Array <FloatArray>(inputs.Length);
            var h_s   = new Array <FloatArray>(inputs.Length);

            // init timing
            h_s[-1] = hprev.Clone();
            c_s[-1] = cprev.Clone();

            // forward
            for (var t = 0; t < inputs.Length; t++)
            {
                (z_s[t], f_s[t], i_s[t], c_s_s[t], c_s[t], o_s[t], h_s[t]) =
                    FeedForward(inputs[t], h_s[t - 1], c_s[t - 1]);
            }

            // gradients
            var dWf = NumMath.Array(Wf.W, Wf.H);
            var dWi = NumMath.Array(Wi.W, Wi.H);
            var dWc = NumMath.Array(Wc.W, Wc.H);
            var dWo = NumMath.Array(Wo.W, Wo.H);
            var dBf = NumMath.Array(Bf.Length);
            var dBi = NumMath.Array(Bi.Length);
            var dBc = NumMath.Array(Bc.Length);
            var dBo = NumMath.Array(Bo.Length);

            var dhnext = error;
            var dcnext = NumMath.Array(hidden_size);

            // backward
            for (var t = inputs.Length - 1; t >= 0; t--)
            {
                (dhnext, dcnext) = Backward(dhnext, dcnext, c_s[t - 1],
                                            z_s[t], f_s[t], i_s[t], c_s_s[t], c_s[t], o_s[t], h_s[t],
                                            ref dWf, ref dWi, ref dWc, ref dWo, ref dBf, ref dBi, ref dBc, ref dBo);
            }

            dWf = NumMath.Normalize(-5, 5, dWf / inputs.Length);
            dWi = NumMath.Normalize(-5, 5, dWi / inputs.Length);
            dWc = NumMath.Normalize(-5, 5, dWc / inputs.Length);
            dWo = NumMath.Normalize(-5, 5, dWo / inputs.Length);
            dBf = NumMath.Normalize(-5, 5, dBf / inputs.Length);
            dBi = NumMath.Normalize(-5, 5, dBi / inputs.Length);
            dBc = NumMath.Normalize(-5, 5, dBc / inputs.Length);
            dBo = NumMath.Normalize(-5, 5, dBo / inputs.Length);

            return(dWf, dWi, dWc, dWo, dBf, dBi, dBc, dBo, h_s[inputs.Length - 1], c_s[inputs.Length - 1]);
Esempio n. 12
0
        public void ResetAdagradParams()
        {
            mWf = NumMath.Array(hidden_size, input_size + hidden_size);
            mWi = NumMath.Array(hidden_size, input_size + hidden_size);
            mWc = NumMath.Array(hidden_size, input_size + hidden_size);
            mWo = NumMath.Array(hidden_size, input_size + hidden_size);

            mBf = NumMath.Array(hidden_size);
            mBi = NumMath.Array(hidden_size);
            mBc = NumMath.Array(hidden_size);
            mBo = NumMath.Array(hidden_size);
        }
Esempio n. 13
0
        public static Array2D <T> operator *(ArrayH <T> v0, Array <T> v1)
        {
            var size   = new Index2(v1.View.Length, v0.View.Length);
            var output = NumMath.Allocate <T>(size);

            ProcessingDevice
            .ArrayDevice
            .Executor["_V_X_V_M"]
            .Launch(size, output.View.View, v1.View.View, v0.View.View);
            ProcessingDevice.ArrayDevice.Executor.Wait();
            return(output);
        }
Esempio n. 14
0
        public static Array2D <T> operator *(ArrayW <T> v0, Array2D <T> m0)
        {
            var size   = new Index2(m0.View.Width, m0.View.Height);
            var output = NumMath.Allocate <T>(size);

            ProcessingDevice
            .ArrayDevice
            .Executor["_V_X_M_line_M"]
            .Launch(size, output.View.View, m0.View.View, v0._memoryBuffer.View);
            ProcessingDevice.ArrayDevice.Executor.Wait();
            return(output);
        }
Esempio n. 15
0
        public RecursiveNeuralNetworkWithContext(int inputSize, float learningRate, float std)
        {
            int hSize = 20;

            wpl = NumMath.Random(inputSize, inputSize, std);
            wpr = NumMath.Random(inputSize, inputSize, std);
            wC  = NumMath.Random(inputSize, inputSize, std);
            wHP = NumMath.Random(hSize, inputSize, std);
            wHC = NumMath.Random(hSize, inputSize, std);
            wS  = NumMath.Random(1, hSize, 1e-10f);

            bC = NumMath.Repeat(inputSize, 1f / (float)inputSize);
            bH = NumMath.Repeat(hSize, 1f / (float)hSize);
            bP = NumMath.Repeat(inputSize, 1f / (float)inputSize);

            mwpl = NumMath.Array(inputSize, inputSize);
            mwpr = NumMath.Array(inputSize, inputSize);
            mwC  = NumMath.Array(inputSize, inputSize);
            mwHP = NumMath.Array(hSize, inputSize);
            mwHC = NumMath.Array(hSize, inputSize);
            mwS  = NumMath.Array(1, hSize);

            mbC = NumMath.Array(inputSize);
            mbH = NumMath.Array(hSize);
            mbP = NumMath.Array(inputSize);

            Adam_m_wpl = NumMath.Array(inputSize, inputSize);
            Adam_m_wpr = NumMath.Array(inputSize, inputSize);
            Adam_m_wC  = NumMath.Array(inputSize, inputSize);
            Adam_m_wHP = NumMath.Array(hSize, inputSize);
            Adam_m_wHC = NumMath.Array(hSize, inputSize);
            Adam_m_ws  = NumMath.Array(1, hSize);

            Adam_m_bC = NumMath.Array(inputSize);
            Adam_m_bH = NumMath.Array(hSize);
            Adam_m_bP = NumMath.Array(inputSize);

            Adam_v_wpl = NumMath.Array(inputSize, inputSize);
            Adam_v_wpr = NumMath.Array(inputSize, inputSize);
            Adam_v_wC  = NumMath.Array(inputSize, inputSize);
            Adam_v_wHP = NumMath.Array(hSize, inputSize);
            Adam_v_wHC = NumMath.Array(hSize, inputSize);
            Adam_v_ws  = NumMath.Array(1, hSize);

            Adam_v_bC = NumMath.Array(inputSize);
            Adam_v_bH = NumMath.Array(hSize);
            Adam_v_bP = NumMath.Array(inputSize);

            _learningRate = learningRate;
        }
Esempio n. 16
0
        private static void Main(string[] args)
        {
            //Performance();
            ProcessingDevice.Device = DeviceType.CUDA;
            var m0 = NumMath.Random(1000, 1000, 1f);
            var arr = new Array<FloatArray2D>(200);
            var a = m0 * m0;

            Parallel.For(0, 200, i =>
            {
                Console.WriteLine($"Computing {i}");
                arr[i] = m0 * m0;
            });
        }
Esempio n. 17
0
        public RecurrentNeuralNetwork(int input, int output, int hidden, float learning_rate, float std)
        {
            input_size         = input;
            output_size        = output;
            hidden_size        = hidden;
            this.learning_rate = learning_rate;

            Wxt = NumMath.Random(hidden_size, input_size, std);
            Wtt = NumMath.Random(hidden_size, hidden_size, std);
            Why = NumMath.Random(output_size, hidden_size, std);
            bt  = NumMath.Repeat(hidden_size, 0);
            by  = NumMath.Repeat(output_size, 0);

            ResetAdagradParams();
        }
        public RecursiveNeuralUnity(int inputSize, float learningRate, float std)
        {
            wpl   = NumMath.Random(inputSize, inputSize, std);
            wpr   = NumMath.Random(inputSize, inputSize, std);
            wpr   = NumMath.Random(inputSize, inputSize, std);
            wDeep = NumMath.Random(inputSize, inputSize, std);
            b     = NumMath.Repeat(inputSize, 1);

            mwpl   = NumMath.Random(inputSize, inputSize, 0);
            mwpr   = NumMath.Random(inputSize, inputSize, 0);
            mwpr   = NumMath.Random(inputSize, inputSize, 0);
            mwDeep = NumMath.Random(inputSize, inputSize, 0);
            mb     = NumMath.Repeat(inputSize, 0);

            this.learningRate = learningRate;
        }
Esempio n. 19
0
        public LSTM(int input, int hidden, float learning_rate, float std)
        {
            input_size         = input;
            hidden_size        = hidden;
            this.learning_rate = learning_rate;

            Wf = NumMath.Random(hidden_size, input_size + hidden_size, std) + .5f;
            Wi = NumMath.Random(hidden_size, input_size + hidden_size, std) + .5f;
            Wc = NumMath.Random(hidden_size, input_size + hidden_size, std);
            Wo = NumMath.Random(hidden_size, input_size + hidden_size, std) + .5f;

            Bf = NumMath.Repeat(hidden_size, 0);
            Bi = NumMath.Repeat(hidden_size, 0);
            Bc = NumMath.Repeat(hidden_size, 0);
            Bo = NumMath.Repeat(hidden_size, 0);

            ResetAdagradParams();
        }
        public (FloatArray2D dWxt, FloatArray2D dWtt, FloatArray dbh, FloatArray hs) BPTT(Array <FloatArray> inputs, FloatArray hprev, FloatArray error)
        {
            var xs = new Array <FloatArray>(inputs.Length);
            var ht = new Array <FloatArray>(inputs.Length);

            ht[-1] = hprev;

            var dWxt   = new FloatArray2D(Wxt.W, Wxt.H);
            var dWtt   = new FloatArray2D(Wtt.W, Wtt.H);
            var dhnext = new FloatArray(hidden_size);
            var dbt    = new FloatArray(bt.Length);

            for (var t = 0; t < inputs.Length; t++)
            {
                xs[t] = inputs[t];
                ht[t] = FeedForward(xs[t], ht[t - 1]);
            }

            dhnext = error;

            for (var t = inputs.Length - 1; t >= 0; t--)
            {
                var dt = dhnext;

                // Compute gradient of T (Derivate of Tanh)
                var dtraw = (1 - ht[t] * ht[t]) * dt;

                dWtt += ht[t - 1].T * dtraw; // Temporal
                dWxt += xs[t].T * dtraw;     // Input
                dbt  += dtraw;

                // Acc to next Time
                dhnext = (dtraw * Wtt).SumColumn();
            }

            // Normalize
            dWxt = NumMath.Normalize(-5, 5, dWxt);
            dWtt = NumMath.Normalize(-5, 5, dWtt);
            dbt  = NumMath.Normalize(-5, 5, dbt);

            return(dWxt, dWtt, dbt, ht[inputs.Length - 1]);
Esempio n. 21
0
        public static int GetBestPosition(FloatArray result, bool prob)
        {
            if (prob)
            {
                var p = NumMath.Choice(Enumerable.Range(0, result.Length).ToArray(), 1, result.ToArray()).First();
                return(p);
            }

            var max = 0f;
            var pos = 0;

            for (var i = 0; i < result.Length; i++)
            {
                if (max < result[i])
                {
                    max = result[i];
                    pos = i;
                }
            }

            return(pos);
        }
 public FloatArray Activate(FloatArray sum)
 {
     return(NumMath.Max(.001f * sum, sum));
 }
Esempio n. 23
0
 public Array <float> Activate(Array <float> v)
 {
     return(NumMath.Max(.01f * v, v));
 }
 public void FeedForward(Array <float> feed)
 {
     _target.SumVector    = NumMath.SumColumn(feed.H * _target.KnowlodgeMatrix) + _target.BiasVector;
     _target.OutputVector = _activationFunction.Activate(_target.SumVector);
 }
Esempio n. 25
0
                FloatArray hs, FloatArray cs) BPTT(int[] inputs, int[] targets, FloatArray hprev, FloatArray cprev)
        {
            // store states
            var x_s   = new Array <FloatArray>(inputs.Length);
            var z_s   = new Array <FloatArray>(inputs.Length);
            var f_s   = new Array <FloatArray>(inputs.Length);
            var i_s   = new Array <FloatArray>(inputs.Length);
            var c_s_s = new Array <FloatArray>(inputs.Length);
            var c_s   = new Array <FloatArray>(inputs.Length);
            var o_s   = new Array <FloatArray>(inputs.Length);
            var h_s   = new Array <FloatArray>(inputs.Length);
            var v_s   = new Array <FloatArray>(inputs.Length);
            var y_s   = new Array <FloatArray>(inputs.Length);
            var t_g   = new Array <FloatArray>(inputs.Length);

            // loss
            var loss = 0d;

            // init timing
            h_s[-1] = hprev.Clone();
            c_s[-1] = cprev.Clone();

            // forward
            for (var t = 0; t < inputs.Length; t++)
            {
                x_s[t]            = new FloatArray(input_size);
                x_s[t][inputs[t]] = 1;

                t_g[t]             = new FloatArray(output_size);
                t_g[t][targets[t]] = 1;

                (z_s[t], f_s[t], i_s[t], c_s_s[t], c_s[t], o_s[t], h_s[t], v_s[t], y_s[t]) =
                    FeedForward(x_s[t], h_s[t - 1], c_s[t - 1]);

                loss += -(t_g[t] * y_s[t].Log()).Sum();
            }

            // gradients
            var dWf = NumMath.Array(Wf.W, Wf.H);
            var dWi = NumMath.Array(Wi.W, Wi.H);
            var dWc = NumMath.Array(Wc.W, Wc.H);
            var dWo = NumMath.Array(Wo.W, Wo.H);
            var dWv = NumMath.Array(Wv.W, Wv.H);
            var dBf = NumMath.Array(Bf.Length);
            var dBi = NumMath.Array(Bi.Length);
            var dBc = NumMath.Array(Bc.Length);
            var dBo = NumMath.Array(Bo.Length);
            var dBv = NumMath.Array(Bv.Length);

            var dhnext = NumMath.Array(hidden_size);
            var dcnext = NumMath.Array(hidden_size);

            // backward
            for (var t = inputs.Length - 1; t >= 0; t--)
            {
                (dhnext, dcnext) = Backward(targets[t], dhnext, dcnext, c_s[t - 1],
                                            z_s[t], f_s[t], i_s[t], c_s_s[t], c_s[t], o_s[t], h_s[t], v_s[t], y_s[t],
                                            ref dWf, ref dWi, ref dWc, ref dWo, ref dWv, ref dBf, ref dBi, ref dBc, ref dBo, ref dBv);
            }

            dWf = NumMath.Normalize(-5, 5, dWf / inputs.Length);
            dWi = NumMath.Normalize(-5, 5, dWi / inputs.Length);
            dWc = NumMath.Normalize(-5, 5, dWc / inputs.Length);
            dWo = NumMath.Normalize(-5, 5, dWo / inputs.Length);
            dWv = NumMath.Normalize(-5, 5, dWv / inputs.Length);
            dBf = NumMath.Normalize(-5, 5, dBf / inputs.Length);
            dBi = NumMath.Normalize(-5, 5, dBi / inputs.Length);
            dBc = NumMath.Normalize(-5, 5, dBc / inputs.Length);
            dBo = NumMath.Normalize(-5, 5, dBo / inputs.Length);
            dBv = NumMath.Normalize(-5, 5, dBv / inputs.Length);

            return(loss, dWf, dWi, dWc, dWo, dWv, dBf, dBi, dBc, dBo, dBv, h_s[inputs.Length - 1], c_s[inputs.Length - 1]);
Esempio n. 26
0
        BPTT(int[] inputs, int[] targets, FloatArray hprev)
        {
            var loss = 0f;
            var xs   = new Array <FloatArray>(inputs.Length);
            var ht   = new Array <FloatArray>(inputs.Length);
            var ps   = new Array <FloatArray>(inputs.Length);
            var tg   = new Array <FloatArray>(inputs.Length);

            ht[-1] = hprev;

            var dWxt   = new FloatArray2D(Wxt.W, Wxt.H);
            var dWtt   = new FloatArray2D(Wtt.W, Wtt.H);
            var dWhy   = new FloatArray2D(Why.W, Why.H);
            var dhnext = new FloatArray(hidden_size);
            var dbt    = new FloatArray(bt.Length);
            var dby    = new FloatArray(by.Length);

            for (var t = 0; t < inputs.Length; t++)
            {
                xs[t]            = new FloatArray(input_size);
                xs[t][inputs[t]] = 1;

                tg[t]             = new FloatArray(output_size);
                tg[t][targets[t]] = 1;

                (ps[t], ht[t]) = FeedForward(xs[t], ht[t - 1]);
                loss          += -(tg[t] * ps[t].Log()).Sum();
            }

            for (var t = inputs.Length - 1; t >= 0; t--)
            {
                // output probabilities
                var dy = ps[t].Clone();
                // derive our first gradient
                dy[targets[t]] -= 1;
                // backpropagate to
                var dt = (Why * dy).SumColumn() + dhnext;

                // Compute gradient of T (Derivate of Tanh)
                var dtraw = (1 - ht[t] * ht[t]) * dt;

                dWtt += ht[t - 1].T * dtraw; // Temporal
                dWxt += xs[t].T * dtraw;     // Input
                dbt  += dtraw;

                // Acc to next Time
                dhnext = (dtraw * Wtt).SumColumn();

                // Compute Derivates
                dWhy += ht[t].T * dy;
                dby  += dy;
            }

            // Normalize
            dWxt = NumMath.Normalize(-5, 5, dWxt);
            dWtt = NumMath.Normalize(-5, 5, dWtt);
            dWhy = NumMath.Normalize(-5, 5, dWhy);
            dbt  = NumMath.Normalize(-5, 5, dbt);
            dby  = NumMath.Normalize(-5, 5, dby);

            return(loss, dWxt, dWtt, dWhy, dbt, dby, ht[inputs.Length - 1]);
Esempio n. 27
0
 public Array <float> Activate(Array <float> v)
 {
     return(1f / (1f + NumMath.Exp(-2f * v)));
 }
 public void CalculateParams(ILayer target)
 {
     gW = NumMath.Array(target.Size, target.ConectionsSize);
     bW = NumMath.Array(target.Size);
 }