Пример #1
0
        public void DenseLayer_MultipleBackwardsPasses()
        {
            const int fanIn       = 5;
            const int batchSize   = 2;
            const int neuronCount = 3;
            var       random      = new Random(232);

            var sut = new DenseLayer(neuronCount, Activation.Undefined);

            sut.Initialize(5, 1, 1, batchSize, Initialization.GlorotUniform, random);

            var input = Matrix <float> .Build.Random(batchSize, fanIn, random.Next());

            sut.Forward(input);

            var delta = Matrix <float> .Build.Dense(batchSize, neuronCount, 1.0f);

            var expected = Matrix <float> .Build.Dense(batchSize, fanIn);

            sut.Backward(delta).CopyTo(expected);

            for (int i = 0; i < 20; i++)
            {
                var actual = sut.Backward(delta);
                Assert.AreEqual(expected, actual);
            }
        }
Пример #2
0
        public void DenseLayer_Backward()
        {
            const int fanIn       = 5;
            const int batchSize   = 2;
            const int neuronCount = 3;
            var       random      = new Random(232);

            var sut = new DenseLayer(neuronCount, Activation.Undefined);

            sut.Initialize(5, 1, 1, batchSize, Initialization.GlorotUniform, random);

            var input = Matrix <float> .Build.Random(batchSize, fanIn, random.Next());

            sut.Forward(input);

            var delta = Matrix <float> .Build.Random(batchSize, neuronCount, random.Next());

            var actual = sut.Backward(delta);

            Trace.WriteLine(string.Join(", ", actual.ToColumnMajorArray()));

            var expected = Matrix <float> .Build.Dense(batchSize, fanIn, new float[] { 0.001748383f, -0.2615477f, -0.6422306f, -0.01443626f, 0.4605991f, -0.7384186f, -0.6931117f, 0.1083627f, -0.6230267f, -1.20742f });

            MatrixAsserts.AreEqual(expected, actual);
        }
Пример #3
0
    IEnumerator TrainNetwork()
    {
        var inputlayer   = new DenseLayer(10, 4, Activation.ReLU());
        var hiddenlayer1 = new DenseLayer(inputlayer, Activation.ReLU(), 30, LayerType.Hidden);
        var hiddenlayer2 = new DenseLayer(hiddenlayer1, Activation.ReLU(), 500, LayerType.Hidden);
        var outputlayer  = new DenseLayer(hiddenlayer1, Activation.TangesHyperbolic(), 2, LayerType.Output);

        Network = outputlayer;

        outputlayer.Initilize();

        var trainingdata = GenerateTrainingData();

        int epoch      = 0;
        int epochsize  = trainingdata.GetLength(0);
        var epocherror = float.MaxValue;

        yield return(0);

        while (epocherror > 10 && _Training)
        {
            yield return(0);

            epocherror = 0f;
            epoch++;
            for (var t = 0; t < epochsize; t++)
            {
                var truth = trainingdata[t, 1];
                var input = trainingdata[t, 0];

                var output = (Tensor1D)outputlayer.Forward(input);
                var dif    = output - truth;
                var sq     = dif * dif;
                epocherror += (float)Math.Pow(sq.ElementSum(), 2);
                outputlayer.Backward(dif);
            }
            ErrorText.text = epocherror.ToString();
        }
        ErrorText.text = ("Finished!");
        _Training      = false;
    }