Beispiel #1
0
 /// <summary>
 /// Create new struct from existing.
 /// </summary>
 /// <param name="src">Existing layer to copy.</param>
 public NeuralNetworkLayer(NeuralNetworkLayer src)
 {
     numberOfNeurons    = src.numberOfNeurons;
     recurring          = src.recurring;
     activationFunction = src.activationFunction;
     biases             = null;
 }
Beispiel #2
0
        //breed data with partner, partner must have the same # neurons/synapses
        //takes a random selection of weights and biases from partner and replaces the a %(partPartner) of this classes weights/classes with those
        //partPartner is the % of weights and biases to use from the partner, 0 being none and 1 being all the weights/biases
        /// <summary>
        /// Breed with another layer(partner) taking a %(partPartner) of randomly selected biases.
        /// </summary>
        /// <param name="partner">Partner layer.</param>
        /// <param name="partPartner">Percent(0-1) of biases to take from partner.</param>
        public void Breed(NeuralNetworkLayer partner)
        {
            int i = numberOfNeurons;

            while (i-- > 0)
            {
                //randomly mix
                float val = Utils.NextFloat01();
                biases[i] = biases[i] * val + partner.biases[i] * (1.0f - val);
            }
        }
Beispiel #3
0
        /// <summary>
        /// Copy biases from layer.
        /// </summary>
        /// <param name="nnl">Layer.</param>
        public void CopyBiases(NeuralNetworkLayer nnl)
        {
            float[] cb = nnl.biases;

            int i = numberOfNeurons;

            while (i-- > 0)
            {
                biases[i] = cb[i];
            }
        }
Beispiel #4
0
        /// <summary>
        /// Load NeuralNetwork structure from stream.
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static NeuralNetwork LoadStructure(Stream s)
        {
            NeuralNetworkLayer inLayer = new NeuralNetworkLayer();

            inLayer.LoadStructure(s);

            NeuralNetworkLayer[] hidden = new NeuralNetworkLayer[Utils.IntFromStream(s)];
            for (int i = 0; i < hidden.Length; i++)
            {
                hidden[i] = new NeuralNetworkLayer();
                hidden[i].LoadStructure(s);
            }

            NeuralNetworkLayer outLayer = new NeuralNetworkLayer();

            outLayer.LoadStructure(s);

            return(new NeuralNetwork(inLayer, hidden, outLayer));
        }
Beispiel #5
0
        /// <summary>
        /// Create new NeuralNetwork from existing(src).
        /// </summary>
        /// <param name="src">Existing NeuralNetwork to copy.</param>
        public NeuralNetwork(NeuralNetwork src)
        {
            inputLayer = new NeuralNetworkLayer(src.inputLayer);

            hiddenLayers = new NeuralNetworkLayer[src.hiddenLayers.Length];
            for (int i = 0; i < hiddenLayers.Length; i++)
            {
                hiddenLayers[i] = new NeuralNetworkLayer(src.hiddenLayers[i]);
                hiddenLayers[i].Init();
            }
            outputLayer = new NeuralNetworkLayer(src.outputLayer);
            outputLayer.Init();

            //setup layer connections
            if (hiddenLayers.Length > 0)
            {
                //hidden layer connections
                hiddenConnections          = new NeuralNetworkLayerConnection[hiddenLayers.Length];
                hiddenRecurringConnections = new NeuralNetworkLayerConnection[hiddenLayers.Length];
                maxNumberOfHiddenNeurons   = 0;
                maxNumberOfSynapses        = 0;
                for (int i = 0; i < hiddenLayers.Length; i++)
                {
                    if (i == 0)
                    {
                        hiddenConnections[0] = new NeuralNetworkLayerConnection(inputLayer, hiddenLayers[0]);
                    }
                    else
                    {
                        hiddenConnections[i] = new NeuralNetworkLayerConnection(hiddenLayers[i - 1], hiddenLayers[i]);
                    }
                    //recurrent connection for hidden layer
                    if (hiddenLayers[i].recurring)
                    {
                        hiddenRecurringConnections[i] = new NeuralNetworkLayerConnection(hiddenLayers[i], hiddenLayers[i]);
                    }
                    else
                    {
                        hiddenRecurringConnections[i] = null;
                    }
                    //calc max hidden neurons
                    if (hiddenLayers[i].numberOfNeurons > maxNumberOfHiddenNeurons)
                    {
                        maxNumberOfHiddenNeurons = hiddenLayers[i].numberOfNeurons;
                    }
                    if (hiddenConnections[i].numberOfSynapses > maxNumberOfSynapses)
                    {
                        maxNumberOfSynapses = hiddenConnections[i].numberOfSynapses;
                    }
                }

                //output connection
                outputConnection = new NeuralNetworkLayerConnection(hiddenLayers[hiddenLayers.Length - 1], outputLayer);

                if (outputConnection.numberOfSynapses > maxNumberOfSynapses)
                {
                    maxNumberOfSynapses = outputConnection.numberOfSynapses;
                }
            }
            else
            {
                maxNumberOfHiddenNeurons = 0;
                maxNumberOfSynapses      = 0;

                //direct input to output connection
                outputConnection = new NeuralNetworkLayerConnection(inputLayer, outputLayer);
                if (outputConnection.numberOfSynapses > maxNumberOfSynapses)
                {
                    maxNumberOfSynapses = outputConnection.numberOfSynapses;
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// Create new struct.
        /// </summary>
        /// <param name="inLayer">Input layer.</param>
        /// <param name="outLayer">Output layer.</param>
        public NeuralNetworkLayerConnection(NeuralNetworkLayer inLayer, NeuralNetworkLayer outLayer)
        {
            numberOfSynapses = inLayer.numberOfNeurons * outLayer.numberOfNeurons;

            weights = new float[numberOfSynapses];
        }