/// <summary> /// Creates an instance of Layer with the specified number of neurons with /// specified neuron properties /// </summary> /// <param name="neuronsCount"> number of neurons in layer </param> /// <param name="neuronProperties"> properties of neurons in layer </param> public Layer(int neuronsCount, NeuronProperties neuronProperties) : this(neuronsCount) { for (int i = 0; i < neuronsCount; i++) { Neuron neuron = NeuronFactory.createNeuron(neuronProperties); this.addNeuron(neuron); } }
/// <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 }); }
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); }
static void Main(string[] args) { var trainDataDirectory = @"D:\Files\Apps\OCR.Server\Resources\TrainData\Samples"; var weightDirectory = @"D:\Files\Apps\OCR.Server\Resources\TrainData\Weights"; var factory = new NeuronFactory(); var service = new NeuronService(weightDirectory, factory); var recongizeService = new NeuronRecognizeService(); var converter = new RecognitionDataConverter(); var trainDataService = new TrainDataService(trainDataDirectory, converter); var neuronA = service.Get('A'); foreach (var trainData in trainDataService.Get('A')) { Recognize(trainData, neuronA); } void Recognize(int[,] trainData, Neuron neuron) { if (recongizeService.IsRecognized(trainData, neuron)) { Console.WriteLine($"Easy! It's [{neuron.Symbol}]. Isn't it? [y/n]: "); if (Console.ReadLine() != "y") { recongizeService.Forget(trainData, neuron); Recognize(trainData, neuron); } return; } Console.WriteLine($"Hm... cannot figure out [{neuron.Symbol}]. Lern {neuron.Symbol}? [y/n]"); if (Console.ReadLine() == "y") { recongizeService.Learn(trainData, neuron); Recognize(trainData, neuron); } } }
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); } }