public ParallelResilientBackpropagationLearning(ActivationNetwork network)
{
this.network = network;
networkOutputs = new ThreadLocal<double[][]>(() => new double[network.Layers.Length][]);
networkErrors = new ThreadLocal<double[][]>(() =>
{
var e = new double[network.Layers.Length][];
for (int i = 0; i < e.Length; i++)
e[i] = new double[network.Layers[i].Neurons.Length];
return e;
});
weightsDerivatives = new double[network.Layers.Length][][];
thresholdsDerivatives = new double[network.Layers.Length][];
weightsPreviousDerivatives = new double[network.Layers.Length][][];
thresholdsPreviousDerivatives = new double[network.Layers.Length][];
weightsUpdates = new double[network.Layers.Length][][];
thresholdsUpdates = new double[network.Layers.Length][];
priorSumOfSquaredErrors = double.MaxValue;
// Initialize layer derivatives and updates
for (int i = 0; i < network.Layers.Length; i++)
{
Layer layer = network.Layers[i];
weightsDerivatives[i] = new double[layer.Neurons.Length][];
weightsPreviousDerivatives[i] = new double[layer.Neurons.Length][];
weightsUpdates[i] = new double[layer.Neurons.Length][];
// for each neuron
for (int j = 0; j < layer.Neurons.Length; j++)
{
weightsDerivatives[i][j] = new double[layer.InputsCount];
weightsPreviousDerivatives[i][j] = new double[layer.InputsCount];
weightsUpdates[i][j] = new double[layer.InputsCount];
}
thresholdsDerivatives[i] = new double[layer.Neurons.Length];
thresholdsPreviousDerivatives[i] = new double[layer.Neurons.Length];
thresholdsUpdates[i] = new double[layer.Neurons.Length];
}
// Initialize steps
Reset(initialStep);
}