public void Mutate(Func <float, int, int, float> func) { WeightsInputHidden.Map(func); WeightsHiddenOutput.Map(func); BiasHidden.Map(func); BiasOutput.Map(func); }
public void Train(float[] inputArray, float[] targetArray) { var inputs = Matrix.FromArray(inputArray); var hidden = Matrix.Multiply(WeightsInputHidden, inputs); hidden.Add(BiasHidden); hidden.Map(_activationFunction.Func); var outputs = Matrix.Multiply(WeightsHiddenOutput, hidden); outputs.Add(BiasOutput); outputs.Map(_activationFunction.Func); var targets = Matrix.FromArray(targetArray); var outputErrors = Matrix.Subtract(targets, outputs); var gradients = Matrix.Map(outputs, _activationFunction.Dfunc); gradients.Multiply(outputErrors); gradients.Multiply(_learningRate); var hiddenTranspose = Matrix.Transpose(hidden); var weightsHiddenOutputDeltas = Matrix.Multiply(gradients, hiddenTranspose); // Adjust the weights by deltas WeightsHiddenOutput.Add(weightsHiddenOutputDeltas); // Adjust the bias by its deltas (which is just the gradients) BiasOutput.Add(gradients); // Calculate the hidden layer errors var weightsHiddenOutputTranspose = Matrix.Transpose(WeightsHiddenOutput); var hiddenErrors = Matrix.Multiply(weightsHiddenOutputTranspose, outputErrors); // Calculate hidden gradient var hiddenGradient = Matrix.Map(hidden, _activationFunction.Dfunc); hiddenGradient.Multiply(hiddenErrors); hiddenGradient.Multiply(_learningRate); // Calcuate input->hidden deltas var inputsTranspose = Matrix.Transpose(inputs); var weightInputHiddenDeltas = Matrix.Multiply(hiddenGradient, inputsTranspose); WeightsInputHidden.Add(weightInputHiddenDeltas); // Adjust the bias by its deltas (which is just the gradients) BiasHidden.Add(hiddenGradient); }
public void Save(string file) { using (var fs = File.OpenWrite(file)) { using (var bw = new BinaryWriter(fs)) { bw.Write(Epoch); bw.Write(InputNodes); bw.Write(HiddenNodes); bw.Write(OutputNodes); WeightsInputHidden.Save(bw); WeightsHiddenOutput.Save(bw); BiasHidden.Save(bw); BiasOutput.Save(bw); bw.Write(_learningRate); } } }