public static Network BuildNetwork(Random random, ICostFunction costFunction, IRegularizationFunction regularizationFunction, WeightIntializerType weightIntializerType, DropoutLayerOptions dropoutLayerOptions, int inputNeuronCount, int outputNeuronCount, params int[] hiddenLayerCounts) { Network network = new Network(costFunction, regularizationFunction, dropoutLayerOptions, random); network.InputLayer = InputLayer.BuildInputLayer(null, inputNeuronCount, random); Layer previousLayer = network.InputLayer; int dropoutLayerIndex = 1; bool isDropoutLayer = false; IWeightBuilder weightBuilder = null; for (int c = 0; c < hiddenLayerCounts.Length; c++) { isDropoutLayer = dropoutLayerOptions.DropoutLayerIndices.Contains(dropoutLayerIndex); int currentLayerCount = hiddenLayerCounts[c]; switch (weightIntializerType) { case WeightIntializerType.RandomGaussianWithNeuronCount: weightBuilder = new RandomGaussianWithNeuronCount(previousLayer.Neurons.Count, 0, random); break; case WeightIntializerType.RandomNormal: weightBuilder = new RandomGaussian(0, 1, random); break; } HiddenLayer hiddenLayer = HiddenLayer.BuildHiddenLayer(weightBuilder, previousLayer, currentLayerCount, isDropoutLayer ? dropoutLayerOptions.ProbabilityOfDropout : 0, random); network.HiddenLayers.Add(hiddenLayer); previousLayer = hiddenLayer; dropoutLayerIndex++; } isDropoutLayer = dropoutLayerOptions.DropoutLayerIndices.Contains(dropoutLayerIndex); switch (weightIntializerType) { case WeightIntializerType.RandomGaussianWithNeuronCount: weightBuilder = new RandomGaussianWithNeuronCount(previousLayer.Neurons.Count, 0, random); break; case WeightIntializerType.RandomNormal: weightBuilder = new RandomGaussian(0, 1, random); break; } network.OutputLayer = OutputLayer.BuildOutputLayer(weightBuilder, (HiddenLayer)previousLayer, outputNeuronCount, isDropoutLayer ? dropoutLayerOptions.ProbabilityOfDropout : 0, random); return(network); }
public static InputLayer BuildInputLayer(IWeightBuilder weightBuilder, int numberOfNeurons, Random random) { InputLayer toReturn = new InputLayer(numberOfNeurons, random); for (int c = 0; c < numberOfNeurons; c++) { toReturn.Neurons.Add(Neuron.BuildNeuron(weightBuilder, null)); } return(toReturn); }