public void Init(FlatLayer[] layers)
{
int layerCount = layers.Length;
_inputCount = layers[0].Count;
_outputCount = layers[layerCount - 1].Count;
_layerCounts = new int[layerCount];
_layerContextCount = new int[layerCount];
_weightIndex = new int[layerCount];
_layerIndex = new int[layerCount];
_activationFunctions = new IActivationFunction[layerCount];
_layerFeedCounts = new int[layerCount];
_contextTargetOffset = new int[layerCount];
_contextTargetSize = new int[layerCount];
_biasActivation = new double[layerCount];
int index = 0;
int neuronCount = 0;
int weightCount = 0;
for (int i = layers.Length - 1; i >= 0; i--)
{
FlatLayer layer = layers[i];
FlatLayer nextLayer = null;
if (i > 0)
{
nextLayer = layers[i - 1];
}
_biasActivation[index] = layer.BiasActivation;
_layerCounts[index] = layer.TotalCount;
_layerFeedCounts[index] = layer.Count;
_layerContextCount[index] = layer.ContextCount;
_activationFunctions[index] = layer.Activation;
neuronCount += layer.TotalCount;
if (nextLayer != null)
{
weightCount += layer.Count*nextLayer.TotalCount;
}
if (index == 0)
{
_weightIndex[index] = 0;
_layerIndex[index] = 0;
}
else
{
_weightIndex[index] = _weightIndex[index - 1]
+ (_layerCounts[index]*_layerFeedCounts[index - 1]);
_layerIndex[index] = _layerIndex[index - 1]
+ _layerCounts[index - 1];
}
int neuronIndex = 0;
for (int j = layers.Length - 1; j >= 0; j--)
{
if (layers[j].ContextFedBy == layer)
{
_hasContext = true;
_contextTargetSize[index] = layers[j].ContextCount;
_contextTargetOffset[index] = neuronIndex
+ (layers[j].TotalCount - layers[j].ContextCount);
}
neuronIndex += layers[j].TotalCount;
}
index++;
}
_beginTraining = 0;
_endTraining = _layerCounts.Length - 1;
_weights = new double[weightCount];
_layerOutput = new double[neuronCount];
_layerSums = new double[neuronCount];
ClearContext();
}