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); }
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); }
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)); }
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); }
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); }
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; } }
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; }