public void TestForward() { var parameterGenerator = new ActionParameterGenerator(() => 0.1, () => 1.0); var neuronFactor = new NeuronFactory(parameterGenerator); var synapseFactory = new SynapseFactory(parameterGenerator); var n = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1 }, ActivationFunction.Sigmoid, ActivationFunction.Identity, null, neuronFactor, synapseFactory); var x = new Vector(3, 5); Assert.IsTrue(Math.Abs(n.Compute(x)[0] - 2.0993931) < 0.001); }
public void TestBack() { var parameterGenerator = new ActionParameterGenerator(() => 0.1, () => 1.0); var neuronFactor = new NeuronFactory(parameterGenerator); var synapseFactory = new SynapseFactory(parameterGenerator); var network = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1, 1 }, ActivationFunction.Sigmoid, ActivationFunction.Identity, null, neuronFactor, synapseFactory); var networkTrainer = new NetworkTrainer(network); var x = new Vector(3, 5); network.Compute(x); networkTrainer.Back(42.0); var n = network.OutputLayer[0].Inputs[0].Source; Console.WriteLine(n.InputDerivative); Console.WriteLine(n.OutputDerivative); Console.WriteLine(n.InputDerivativeCount); Assert.IsTrue(Math.Abs(-3.987764 - n.InputDerivative) < 0.01); Assert.IsTrue(Math.Abs(-41.009155 - n.OutputDerivative) < 0.01); Assert.AreEqual(1, n.InputDerivativeCount); }
public void TestTrainXor() { var pg = new PositiveUniformParameterGenerator(); var neuronFactor = new NeuronFactory(pg); var synapseFactory = new SynapseFactory(pg); var n = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1 }, ActivationFunction.Sigmoid, ActivationFunction.Identity, null, neuronFactor, synapseFactory); var trainer = new NetworkTrainer(n, 0.9, 0.1); var examples = new Matrix(new double[, ] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }); var labels = new Vector(0, 1, 1, 0); trainer.Train(examples, labels, 1000); for (var i = 0; i < labels.Length; i++) { var x = examples.GetRow(i); var y = labels[i]; Console.WriteLine("Actual: {0}, Result: {1}", y, n.Compute(x)); Assert.IsTrue(Math.Abs(y - n.Compute(x)[0]) < 0.01); } }
/// <summary> /// Create a multilayer perceptron /// </summary> /// <param name="layerSizes">Number of neurons per layer</param> /// <param name="activationFunction">Activation function for every hidden node</param> /// <param name="outputActivationFunction">Activation function for last layer</param> /// <param name="regularizationFunction">Regularization function</param> /// <param name="neuronFactory">Neuron factory used to create neurons</param> /// <param name="synapseFactory">Synapse factory used to create synapses</param> /// <returns>New network</returns> public static Network CreateMultilayerPerceptron(int[] layerSizes, IActivationFunction activationFunction, IActivationFunction outputActivationFunction, IRegularizationFunction regularizationFunction, NeuronFactory neuronFactory, SynapseFactory synapseFactory) { var prevLayer = new Neuron[layerSizes[0]]; // create input layer var inputNeurons = new Neuron[layerSizes[0]]; for (var i = 0; i < inputNeurons.Length; i++) { var n = neuronFactory.CreateNeuron(activationFunction); inputNeurons[i] = n; prevLayer[i] = n; } // create hidden layers for (var i = 1; i < layerSizes.Length - 1; i++) { var layer = new Neuron[layerSizes[i]]; for (var j = 0; j < layer.Length; j++) { var n = neuronFactory.CreateNeuron(activationFunction); layer[j] = n; for (var k = 0; k < prevLayer.Length; k++) { var pn = prevLayer[k]; synapseFactory.Link(pn, n, regularizationFunction); } } prevLayer = layer; } // create output layer var outputNeurons = new Neuron[layerSizes[layerSizes.Length - 1]]; for (var i = 0; i < outputNeurons.Length; i++) { var outputNeuron = neuronFactory.CreateOutputNeuron(outputActivationFunction); outputNeurons[i] = outputNeuron; for (var j = 0; j < prevLayer.Length; j++) { var pn = prevLayer[j]; synapseFactory.Link(pn, outputNeuron, regularizationFunction); } } return(new Network { InputLayer = inputNeurons, OutputLayer = outputNeurons }); }
static void Main(string[] args) { NeuralNetworkConfigurationSettings networkConfig = new NeuralNetworkConfigurationSettings { NumInputNeurons = 1, NumOutputNeurons = 1, NumHiddenLayers = 2, NumHiddenNeurons = 3, SummationFunction = new SimpleSummation(), ActivationFunction = new TanhActivationFunction() }; GenerationConfigurationSettings generationSettings = new GenerationConfigurationSettings { UseMultithreading = true, GenerationPopulation = 500 }; EvolutionConfigurationSettings evolutionSettings = new EvolutionConfigurationSettings { NormalMutationRate = 0.05, HighMutationRate = 0.5, GenerationsPerEpoch = 10, NumEpochs = 1000, NumTopEvalsToReport = 10 }; MutationConfigurationSettings mutationSettings = new MutationConfigurationSettings { MutateAxonActivationFunction = true, MutateNumberOfHiddenLayers = true, MutateNumberOfHiddenNeuronsInLayer = true, MutateSomaBiasFunction = true, MutateSomaSummationFunction = true, MutateSynapseWeights = true }; var random = new RandomWeightInitializer(new Random()); INeuralNetworkFactory factory = NeuralNetworkFactory.GetInstance(SomaFactory.GetInstance(networkConfig.SummationFunction), AxonFactory.GetInstance(networkConfig.ActivationFunction), SynapseFactory.GetInstance(new RandomWeightInitializer(new Random()), AxonFactory.GetInstance(networkConfig.ActivationFunction)), SynapseFactory.GetInstance(new ConstantWeightInitializer(1.0), AxonFactory.GetInstance(new IdentityActivationFunction())), random); IBreeder breeder = BreederFactory.GetInstance(factory, random).Create(); IMutator mutator = MutatorFactory.GetInstance(factory, random).Create(mutationSettings); IEvalWorkingSet history = EvalWorkingSetFactory.GetInstance().Create(50); IEvaluatableFactory evaluatableFactory = new GameEvaluationFactory(); IStorageProxy proxy = new NodeJSProxy(1, "http://localhost:3000", "123456789"); IEpochAction action = new BestPerformerUpdater(proxy); var GAFactory = GeneticAlgorithmFactory.GetInstance(evaluatableFactory); IGeneticAlgorithm evolver = GAFactory.Create(networkConfig, generationSettings, evolutionSettings, factory, breeder, mutator, history, evaluatableFactory, action); evolver.RunSimulation(); }