/// <summary> /// Finds the value which maximizes /// the activation of this neuron. /// </summary> /// public double[] Maximize() { // Initialize double[] value = new double[neuron.InputsCount]; for (int i = 0; i < value.Length; i++) { value[i] = Accord.Math.Tools.Random.NextDouble(); } double[] gradient = new double[neuron.InputsCount]; for (int iter = 0; iter < 50; iter++) { // Compute the activation gradient double activation = neuron.Compute(value); for (int i = 0; i < gradient.Length; i++) { gradient[i] = neuron.Weights[i] * neuron.ActivationFunction.Derivative2(activation); } // Walk against the gradient for (int i = 0; i < value.Length; i++) { value[i] -= gradient[i]; } value = value.Divide(value.Sum()); } return(value); }
public void NeuronUpdateWeights() { double learningRate = 0.3; double delta = -0.3; int InputCount = 3; double outputValue = 0; double outputAfterUpdate = 0; IActivationFunction ActivationSigmoid = new SigmoidFunction(); Neuron ActNeuron = new ActivationNeuron(InputCount, ActivationSigmoid); ActNeuron.FeedForward(InputValues); outputValue = ActNeuron.Compute(); Assert.True(outputValue != 0); ActNeuron.UpdateWeight(learningRate, delta); outputAfterUpdate = ActNeuron.Compute(); Assert.NotEqual(outputValue, outputAfterUpdate); }
public void NeuronInitalizeActivationSigmoid() { int InputCount = 3; double outputValue = 0; IActivationFunction ActivationSigmoid = new SigmoidFunction(); Neuron ActNeuron = new ActivationNeuron(InputCount, ActivationSigmoid); ActNeuron.FeedForward(InputValues); outputValue = ActNeuron.Compute(); Assert.True(outputValue != 0); }