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