public static NeuralNetwork GetBrain() { if (_brain == null) { NeuralNetworkConfig nnConfig = new NeuralNetworkConfig(); nnConfig.AddLayer(LayerType.Input, 5); //Vision inouts nnConfig.AddLayer(LayerType.Intermediate, 12, ActivationType.LeakyRelu); nnConfig.AddLayer(LayerType.Output, 5, ActivationType.LeakyRelu); //Movement decisions. _brain = new NeuralNetwork(nnConfig, 0.02f); for (int i = 0; i < 10000; i++) { //Left side detection, go right. _brain.BackPropagate(TrainingScenerio(1, 0, 0, 0, 0), TrainingDecision(1, 1, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(0, 1, 0, 0, 0), TrainingDecision(1, 1, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(1, 1, 0, 0, 0), TrainingDecision(1, 1, 1, 1, 0)); //Right side detection, go left. _brain.BackPropagate(TrainingScenerio(0, 0, 0, 0, 1), TrainingDecision(1, 0, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(0, 0, 0, 1, 0), TrainingDecision(1, 0, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(0, 0, 0, 1, 1), TrainingDecision(1, 0, 1, 1, 0)); //Front side detection, so left or right. _brain.BackPropagate(TrainingScenerio(0, 0, 1, 0, 0), TrainingDecision(1, 0, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(0, 1, 1, 1, 0), TrainingDecision(1, 1, 1, 1, 0)); _brain.BackPropagate(TrainingScenerio(1, 1, 1, 1, 1), TrainingDecision(1, 1, 1, 1, 0)); //No objects dection, speed up and cruise. _brain.BackPropagate(TrainingScenerio(0, 0, 0, 0, 0), TrainingDecision(0.4f, 0.4f, 0.4f, 0.9f, 0.9f)); } } return _brain.Clone(); }
private static void Start() { NeuralNetworkConfig nnConfig = new NeuralNetworkConfig(); nnConfig.AddLayer(LayerType.Input, 3); nnConfig.AddLayer(LayerType.Intermediate, 5, ActivationType.LeakyRelu); nnConfig.AddLayer(LayerType.Output, 1, ActivationType.LeakyRelu); nn = new NeuralNetwork(nnConfig, 0.01f); nn.Load("C:\\network.txt"); //Train the network for (int i = 0; i < 20000; i++) { nn.BackPropagate(new float[] { 0, 0, 0 }, new float[] { 0 }); nn.BackPropagate(new float[] { 1, 0, 0 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 1, 0 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 0, 1 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 0, 1 }, new float[] { 0 }); nn.BackPropagate(new float[] { 0, 0, 1 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 0, 1 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 0, 1 }, new float[] { 0 }); nn.BackPropagate(new float[] { 1, 1, 0 }, new float[] { 1 }); nn.BackPropagate(new float[] { 0, 1, 1 }, new float[] { 1 }); nn.BackPropagate(new float[] { 1, 0, 1 }, new float[] { 1 }); nn.BackPropagate(new float[] { 1, 1, 1 }, new float[] { 1 }); } Console.WriteLine($"Cost: {nn.cost:0.########}"); nn.Save("C:\\network.txt"); VerboseFeedForward(nn, new float[] { 0, 0, 0 }); VerboseFeedForward(nn, new float[] { 1, 0, 0 }); VerboseFeedForward(nn, new float[] { 0, 1, 0 }); VerboseFeedForward(nn, new float[] { 0, 0, 1 }); VerboseFeedForward(nn, new float[] { 1, 1, 0 }); VerboseFeedForward(nn, new float[] { 0, 1, 1 }); VerboseFeedForward(nn, new float[] { 1, 0, 1 }); VerboseFeedForward(nn, new float[] { 1, 1, 1 }); //We want the gate to simulate 3 input or gate (A or B or C) // 0 0 0 => 0 // 1 0 0 => 1 // 0 1 0 => 1 // 0 0 1 => 1 // 1 1 0 => 1 // 0 1 1 => 1 // 1 0 1 => 1 // 1 1 1 => 1 }