Пример #1
0
        public LinearWeightLayer(INodeLayer inputLayer, INodeLayer outputLayer)
        {
            Connections = new List <IConnection>();
            InputNodes  = inputLayer.Nodes;
            OutputNodes = outputLayer.Nodes;

            foreach (var inode in inputLayer.Nodes)
            {
                foreach (var onode in outputLayer.Nodes.Where(n => !(n is InputNode)))
                {
                    Connections.Add(new LinearWeight(inode, onode));
                }
            }
        }
Пример #2
0
        public LinearWeightLayer(INodeLayer inputLayer, INodeLayer outputLayer)
        {
            Connections = new List<IConnection>();
            InputNodes = inputLayer.Nodes;
            OutputNodes = outputLayer.Nodes;

            foreach (var inode in inputLayer.Nodes)
            {
                foreach (var onode in outputLayer.Nodes.Where(n => !(n is InputNode)))
                {
                    Connections.Add(new LinearWeight(inode, onode));
                }
            }
        }
Пример #3
0
 public MLP(InputLayer inputLayer, INodeLayer[] layers)
 {
     Create(inputLayer, layers);
 }
Пример #4
0
        private void Create(InputLayer inputLayer, INodeLayer[] layers)
        {
            NodeLayers = new INodeLayer[layers.Length + 1];
            ConnectionLayers = new List<IConnectionLayer>();
            var nodes = new List<List<INode>>();
            NumberOfInputs = inputLayer.Input.Length;
            NumberOfOutputs = layers.Last().Output.Length;
            NodeLayers[0] = inputLayer;
            nodes.Add(inputLayer.Nodes);

            for (int i = 0; i < layers.Length; i++)
            {
                var ih = layers[i];
                NodeLayers[i+1] = ih;
                nodes.Add(ih.Nodes);
            }

            for (var i = 0; i < NodeLayers.Length - 1; i++)
            {
                var cl = new LinearWeightLayer(NodeLayers[i], NodeLayers[i + 1]);
                ConnectionLayers.Add(cl);
            }

            StagedNodes = nodes.Select(n => n.ToArray()).ToArray();
            Nodes = nodes.SelectMany(s => s).ToList();
        }
Пример #5
0
        public double Train(INodeLayer NodeLayer, int Epochs = 1000)
        {
            if (Epochs < 1)
                throw new ArgumentException("At least 1 epoch is required.");

            if (DataSets.Length < 1)
                throw new ArgumentException("No DataSets have been loaded.");

            if (InputCount != NodeLayer.Inputs)
                throw new ArgumentException("The given INodeLayer does not have the same number of Inputs as the DataSets.");

            if (OutputCount != NodeLayer.Outputs)
                throw new ArgumentException("The given INodeLayer does not have the same number of Outputs as the DataSets.");

            for (int i = 0; i < Epochs; i++)
            {
                for (int n = 0; n < NodeLayer.Outputs; n++)
                {
                    foreach(var dataSet in DataSets)
                    {
                        double error = 0;
                        NodeLayer.Nodes[n].Calculate(dataSet.Inputs, dataSet.Outputs[n], ref error);

                        double delta = error * LearningRate;
                        AdjustNode(NodeLayer.Nodes[n], dataSet.Inputs, delta);
                    }
                }
            }

            double SSE = 0;
            foreach (var dataSet in DataSets)
            {
                double error = 0;
                NodeLayer.Calculate(dataSet.Inputs, dataSet.Outputs, ref error);
                SSE += Math.Pow(error, 2);
            }
            return SSE;
        }