Esempio n. 1
0
        public override Tensor Compute(Tensor input)
        {
            var values  = (Tensor1D)input;
            var results = new Tensor1D(values.Length);

            for (var i = 0; i < values.Length; i++)
            {
                results[i] = 1f / (1 + (float)Math.Exp(-values[i]));
            }
            return(results);
        }
Esempio n. 2
0
    Tensor1D[,] GenerateTrainingData()
    {
        var trainingdata = new Tensor1D[Record.Count, 2];

        for (var i = 0; i < Record.Count; i++)
        {
            trainingdata[i, 0] = new Tensor1D(new float[] { Record[i].Speed, Record[i].SensorLeft, Record[i].SensorFront, Record[i].SensorRight });
            trainingdata[i, 1] = new Tensor1D(new float[] { Record[i].SteeringAngle, Record[i].Tourgue });
        }

        return(trainingdata);
    }
Esempio n. 3
0
        private Tensor1D PropagateGradient(Tensor1D gradient)
        {
            var propgrad = new float[InputNumber + 1];

            for (var i = 0; i < InputNumber + 1; i++)
            {
                for (var n = 0; n < Neurons; n++)
                {
                    propgrad[i] += Weights[n][i] * gradient[n];
                }
            }
            return(new Tensor1D(propgrad));
        }
Esempio n. 4
0
        private Tensor ComputeOutput(Tensor inputs)
        {
            var input = (Tensor1D)inputs;

            input.AddElement(1);
            var scalarprodukttensor = new Tensor1D(Neurons);

            for (var i = 0; i < Neurons; i++)
            {
                var product    = Weights[i] * input;
                var productsum = product.ElementSum();
                scalarprodukttensor[i] = productsum;
            }

            var outputvalues = Activation.Compute(scalarprodukttensor);

            return(outputvalues);
        }
Esempio n. 5
0
        public void ComputeErrorTensor(Transition tr, Layer Network)
        {
            var outputblist            = ((Tensor1D)Network.Forward(tr.InputB)).Tolist();
            var maxrewardindexnextstep = outputblist.IndexOf(outputblist.Max());



            var correctreward = tr.Reward + 0.9f * maxrewardindexnextstep;

            var errorarray = new float[tr.OutputA.Length];

            var errortensor = new Tensor1D(errorarray);

            var output = (Tensor1D)Network.Forward(tr.InputA);


            var index = tr.Action.SteeringCount * tr.Action.SteeringNumber + tr.Action.TourqueNumber;

            errortensor[index] = output[index] - correctreward;

            Network.Backward(errortensor);
        }
Esempio n. 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;
        }
    }
Esempio n. 7
0
    void AddSample(RearWheelDrive drivecontroller, float reward)
    {
        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);

        var outlist = result.Tolist();

        var steeringdim = _Actions.ActionTable.GetLength(0);
        var trouquedim  = _Actions.ActionTable.GetLength(1);

        //a.SteeringNumber* a.SteeringCount + a.TourgueNumber = index

        var maxindex = outlist.IndexOf(outlist.Max());

        var _rnd         = new System.Random();
        var randomdouble = _rnd.NextDouble();

        if (0.2 >= randomdouble)
        {
            maxindex = _rnd.Next(0, outlist.Count);
        }

        var currenttime = Time.time;

        if (currenttime - _ActionTime > 0.2)
        {
            _ActionTime = currenttime;
        }
        else
        {
            return;
        }

        var steeringindex = maxindex / steeringdim;
        var touqueindex   = maxindex % steeringdim;

        var action = _Actions.ActionTable[steeringindex, touqueindex];

        drivecontroller.SteeringAngle = action.SteeringAngle;
        drivecontroller.Tourque       = Math.Max(action.Tourque, 0);

        var transition = new Transition();

        if (_LastSnap != null)
        {
            transition.InputA = _LastInput;
            transition.InputB = input;

            transition.OutputA = _LastOutput;
            transition.OutputB = result;

            transition.Reward = PreviousReward;

            transition.Action = action;

            currenttime = Time.time;

            if (currenttime - _Time > 0.2)
            {
                _Time = currenttime;
                _Transitions.Add(transition);
            }
        }

        _LastSnap      = snap;
        _LastInput     = input;
        _LastOutput    = result;
        PreviousReward = reward;
        LastPos        = Car.transform.position;
    }