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);
        }
Exemple #2
0
        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);
        }