private void UpdateNetwork() { // 6.1 Update hidden layer weights for (int i = 0; i < hidden.Neurons.Length; i++) { StochasticNeuron neuron = hidden.Neurons[i]; for (int j = 0; j < neuron.Weights.Length; j++) { neuron.Weights[j] += weightsUpdates[j][i] - learningRate * decay * neuron.Weights[j]; } neuron.Threshold += hiddenBiasUpdates[i]; } // 6.2 Update visible layer with reverse weights for (int i = 0; i < visible.Neurons.Length; i++) { visible.Neurons[i].Threshold += visibleBiasUpdates[i]; } visible.CopyReversedWeightsFrom(hidden); }
/// <summary> /// Creates a new <see cref="ActivationNetwork"/> from this instance. /// </summary> /// /// <param name="outputs">The number of output neurons in the last layer.</param> /// <param name="function">The activation function to use in the last layer.</param> /// /// <returns>An <see cref="ActivationNetwork"/> containing this network.</returns> /// public ActivationNetwork ToActivationNetwork(IActivationFunction function, int outputs) { ActivationNetwork ann = new ActivationNetwork(function, inputsCount, hidden.Neurons.Length, outputs); // For each neuron for (int i = 0; i < hidden.Neurons.Length; i++) { ActivationNeuron aneuron = ann.Layers[0].Neurons[i] as ActivationNeuron; StochasticNeuron sneuron = hidden.Neurons[i]; // For each weight for (int j = 0; j < sneuron.Weights.Length; j++) { aneuron.Weights[j] = sneuron.Weights[j]; } aneuron.Threshold = sneuron.Threshold; aneuron.ActivationFunction = sneuron.ActivationFunction; } return(ann); }