private static void DrawNeuron(this Network network, Neuron neuron, Graphics graphic) { Pen pen = new Pen(Color.Black); Point point = Translate(network, neuron); Size size = new Size(10, 10); Rectangle r = new Rectangle(point, size); Color color = Blend(Color.Gray, Color.Red, (neuron.Signal - 0.5)); Brush brush = new SolidBrush(color); graphic.FillEllipse(brush, r); graphic.DrawEllipse(pen, r); // Draw signal text Font font = new Font(FontFamily.GenericSerif, 8); Brush fontbrush = new SolidBrush(Color.DarkBlue); point = point.Shift(0, 10); graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; graphic.DrawString(neuron.Signal.ToString("f2"), font, fontbrush, point); // Draw Error: point = point.Shift(0, 10); fontbrush = new SolidBrush(Color.Red); graphic.DrawString(neuron.ErrorGradient.ToString("f2"), font, fontbrush, point); }
public static void Link(this Neuron a, Neuron b) { Axon axon = new Axon(); axon.Source = a; axon.Target = b; a.Axons.Add(axon); b.Dendrites.Add(axon); }
public Layer(int size) { for (int i = 0; i < size; i++) { Neuron neuron = new Neuron(); Neurons.Add(neuron); } }
public static double CalcOutputErrorGradient(Neuron neuron) // for an output neuron { double signal = neuron.Signal; double desired = neuron.Desired; double delta = (desired - signal); double gradient = signal * (1 - signal); double result = gradient * delta; return result; }
public Layer LayerOf(Neuron neuron) { foreach(Layer layer in Layers) { layer.Neurons.Contains(neuron); return layer; } return null; }
public static Point Translate(Network network, Neuron neuron) { // translate a network coordinate to a screen coordinate Layer layer = network.LayerOf(neuron); Point p = neuron.Coordinate.Multiply(100, 25).Add(50); return p; }
public static double CalcErrorGradient(Neuron neuron) // for a non-output neuron { // this function needs to be called through the network from output towards input!!! (backpropagated) double signal = neuron.Signal; double deltasum = 0; foreach (Axon axon in neuron.Axons) { deltasum += axon.Weight * axon.Target.ErrorGradient; } double gradient = signal * (1 - signal); double result = gradient * deltasum; return result; }