internal BackPropagationNeuralNetwork(int[] networkShape, int epoch, float learnRate) { Epoch = epoch; LearnRate = learnRate; Losses = new float[epoch]; for (int i = 0; i < epoch; i++) { Losses[i] = 0f; } LossFunction = CrossEntropy; LossFunctionDerivative = CrossEntropyDerivative; Layers = new FullyConnectedNeuralLayer[networkShape.Length]; Layers[0] = new FullyConnectedNeuralLayer(networkShape[0], 0, this); for (int i = 1; i < networkShape.Length - 1; i++) { Layers[i] = new FullyConnectedNeuralLayer(networkShape[i], networkShape[i - 1], this); } Layers[Layers.Length - 1] = new FullyConnectedNeuralLayer(networkShape[Layers.Length - 1], networkShape[Layers.Length - 2], this); Layers[0].NextLayer = Layers[1]; Layers[Layers.Length - 1].PreviousLayer = Layers[Layers.Length - 2]; for (int i = 1; i < Layers.Length - 1; i++) { Layers[i].PreviousLayer = Layers[i - 1]; Layers[i].NextLayer = Layers[i + 1]; } }
internal void SetInput(float[,,] data, int instanceIndex, FullyConnectedNeuralLayer layer) { int sideLength = data.GetLength(1); for (int i = 0, r = 0, c = 0; i < layer.NumOfNodes; i++) { layer.Outputs[i] = data[instanceIndex, r, c]; c++; if (c == sideLength) { c = 0; r++; } } }