Пример #1
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);
        }
Пример #2
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);
            }
        }
Пример #3
0
        static void FromImageBatches()
        {
            List <Tensor> inputs = TensorConverter.InputsFromImage("Test/");

            Layer layer1 = new DenseLayer(28 * 28, 64, ActivationType.Softmax);

            Layer layer2 = new DenseLayer(64, 10, ActivationType.ReLU);

            foreach (var input in inputs)
            {
                Tensor rl1 = layer1.Forward(input);

                Tensor rl2 = layer2.Forward(rl1);

                Console.WriteLine(rl2);
            }


            Console.ReadLine();
        }
Пример #4
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;
    }
Пример #5
0
        public void DenseLayer_Forward()
        {
            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());

            var actual = sut.Forward(input);

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

            var expected = Matrix <float> .Build.Dense(batchSize, neuronCount, new float[] { 0.9898463f, 0.4394523f, 0.4259368f, -1.051275f, -0.5012454f, 0.08094172f });

            MatrixAsserts.AreEqual(expected, actual);
        }
Пример #6
0
    void FixedUpdate()
    {
        if (_Recording)
        {
            var currenttime = Time.time;

            if (currenttime - _Time > DeltaTime)
            {
                _Time = currenttime;
                Record.Add(GrabDriveSnapShot());
            }
        }
        if (_NetDrive)
        {
            var drivecontroller = Car.GetComponent <RearWheelDrive>();
            var sensors         = Car.GetComponentsInChildren <DetectionLaser>();

            drivecontroller.InputControl = false;

            var snap = GrabDriveSnapShot();

            var input = new Tensor1D(new float[] { snap.Speed, snap.SensorLeft, snap.SensorFront, snap.SensorRight });

            var result = (Tensor1D)Network.Forward(input);

            drivecontroller.SteeringAngle = result[0];
            drivecontroller.Tourque       = result[1];
        }
        else if (_NetSelfTrain && Network != null)
        {
            var drivecontroller = Car.GetComponent <RearWheelDrive>();
            var sensors         = Car.GetComponentsInChildren <DetectionLaser>();

            if (_SelfTraining)
            {
                return;
            }

            var snap      = GrabDriveSnapShot();
            var speed     = drivecontroller.Speed;
            var speedhigh = speed > 1.5;
            //var rr = 20 * Vector3.Distance(LastPos, Car.transform.position) / 2;
            var reward = -(snap.SensorFront + snap.SensorLeft + snap.SensorRight) + speed / 10; // +  rr;

            if (speedhigh || _LastTimeSpeedHigh == 0)
            {
                _LastTimeSpeedHigh = Time.time;
            }

            else if (Time.time - _LastTimeSpeedHigh > 3 || drivecontroller.Collided)
            {
                AddSample(drivecontroller, -5);
                _SelfTraining = true;
                StartCoroutine("SelfTrainEpoch");
                drivecontroller.Tourque       = 0;
                drivecontroller.SteeringAngle = 0;
                return;
            }

            AddSample(drivecontroller, reward);
        }
        else
        {
            var drivecontroller = Car.GetComponent <RearWheelDrive>();
            drivecontroller.InputControl = true;
        }
    }