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)); } } }
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)); } } }
public MLP(InputLayer inputLayer, INodeLayer[] layers) { Create(inputLayer, layers); }
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(); }
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; }