summaryrefslogtreecommitdiff
path: root/Archi.py
diff options
context:
space:
mode:
Diffstat (limited to 'Archi.py')
-rw-r--r--Archi.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/Archi.py b/Archi.py
new file mode 100644
index 0000000..398ef68
--- /dev/null
+++ b/Archi.py
@@ -0,0 +1,106 @@
+import sys
+from matplotlib import pyplot
+from math import cos, sin, atan
+
+
+class Neuron():
+ def __init__(self, x, y):
+ self.x = x
+ self.y = y
+
+ def draw(self, neuron_radius):
+ circle = pyplot.Circle((self.x, self.y), radius=neuron_radius, fill=False)
+ pyplot.gca().add_patch(circle)
+
+
+class Layer():
+ def __init__(self, network, number_of_neurons, number_of_neurons_in_widest_layer):
+ self.vertical_distance_between_layers = 6
+ self.horizontal_distance_between_neurons = 2
+ self.neuron_radius = 0.5
+ self.number_of_neurons_in_widest_layer = number_of_neurons_in_widest_layer
+ self.previous_layer = self.__get_previous_layer(network)
+ self.y = self.__calculate_layer_y_position()
+ self.neurons = self.__intialise_neurons(number_of_neurons)
+
+ def __intialise_neurons(self, number_of_neurons):
+ neurons = []
+ x = self.__calculate_left_margin_so_layer_is_centered(number_of_neurons)
+ for iteration in xrange(number_of_neurons):
+ neuron = Neuron(x, self.y)
+ neurons.append(neuron)
+ x += self.horizontal_distance_between_neurons
+ return neurons
+
+ def __calculate_left_margin_so_layer_is_centered(self, number_of_neurons):
+ return self.horizontal_distance_between_neurons * (self.number_of_neurons_in_widest_layer - number_of_neurons) / 2
+
+ def __calculate_layer_y_position(self):
+ if self.previous_layer:
+ return self.previous_layer.y + self.vertical_distance_between_layers
+ else:
+ return 0
+
+ def __get_previous_layer(self, network):
+ if len(network.layers) > 0:
+ return network.layers[-1]
+ else:
+ return None
+
+ def __line_between_two_neurons(self, neuron1, neuron2):
+ angle = atan((neuron2.x - neuron1.x) / float(neuron2.y - neuron1.y))
+ x_adjustment = self.neuron_radius * sin(angle)
+ y_adjustment = self.neuron_radius * cos(angle)
+ line = pyplot.Line2D((neuron1.x - x_adjustment, neuron2.x + x_adjustment), (neuron1.y - y_adjustment, neuron2.y + y_adjustment))
+ pyplot.gca().add_line(line)
+
+ def draw(self, layerType=0):
+ for neuron in self.neurons:
+ neuron.draw( self.neuron_radius )
+ if self.previous_layer:
+ for previous_layer_neuron in self.previous_layer.neurons:
+ self.__line_between_two_neurons(neuron, previous_layer_neuron)
+ # write Text
+ x_text = self.number_of_neurons_in_widest_layer * self.horizontal_distance_between_neurons
+ if layerType == 0:
+ pyplot.text(x_text, self.y, 'Input Layer', fontsize = 12)
+ elif layerType == -1:
+ pyplot.text(x_text, self.y, 'Output Layer', fontsize = 12)
+ else:
+ pyplot.text(x_text, self.y, 'Hidden Layer '+str(layerType), fontsize = 12)
+
+class NeuralNetwork():
+ def __init__(self, number_of_neurons_in_widest_layer):
+ self.number_of_neurons_in_widest_layer = number_of_neurons_in_widest_layer
+ self.layers = []
+ self.layertype = 0
+
+ def add_layer(self, number_of_neurons ):
+ layer = Layer(self, number_of_neurons, self.number_of_neurons_in_widest_layer)
+ self.layers.append(layer)
+
+ def draw(self):
+ pyplot.figure()
+ for i in range( len(self.layers) ):
+ layer = self.layers[i]
+ if i == len(self.layers)-1:
+ i = -1
+ layer.draw( i )
+ pyplot.axis('scaled')
+ pyplot.axis('off')
+ pyplot.title( 'Neural Network architecture', fontsize=15 )
+ pyplot.show()
+
+class DrawNN():
+ def __init__( self, neural_network ):
+ self.neural_network = neural_network
+
+ def draw( self ):
+ widest_layer = max( self.neural_network )
+ network = NeuralNetwork( widest_layer )
+ for l in self.neural_network:
+ network.add_layer(l)
+ network.draw()
+
+network = DrawNN( [4,3,3,3,3] )
+network.draw() \ No newline at end of file