How to visualize a neural network

前端 未结 8 1066
天涯浪人
天涯浪人 2021-01-30 02:59

I want to draw a dynamic picture for a neural network to watch the weights changed and the activation of neurons during learning. How could I simulate the process in Python?

相关标签:
8条回答
  • 2021-01-30 03:18

    This is how I did it:

    • Head to the online graph creator by Alex : HERE
    • Draw your
      • shallow network (consisting of simply input-hidden-output layers) using FCNN (Fully connected Neural Network)
      • Or deep/convolutional network using LeNet or AlexNet style. This is what you'll have by now:
    • Edit the svg file using the online tool at draw.io. For this, simply import the svg file into your workspace.This is how the end result should look like:

    0 讨论(0)
  • 2021-01-30 03:29

    I adapted some parts to the answer of Milo

    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()
    

    Now the layers are also labeled, the axis are deleted and constructing the plot is easier. It's simply done by:

    network = DrawNN( [2,8,8,1] )
    network.draw()
    

    Here a net with the following structure is constructed:

    • 2 Neurons in the input layer
    • 8 Neurons in the 1st hidden layer
    • 8 Neurons in the 2nd hidden layer
    • 1 Neuron in the output layer
    0 讨论(0)
提交回复
热议问题