In [1]:
%%HTML
<style>
.container { width:100% } 
</style>


Visualize the Architecture of a Neural Network


In [2]:
import graphviz as gv

The function $\texttt{generateNN}(\texttt{name}, \texttt{Topology})$ takes a filename name and a network topology Topology as its argument and draws a graph of the resulting neural net. A network topology is a list of numbers specifying the number of neurons of each layer. For example, the network topology [3, 8, 6, 2] specifies a neural network with three layers of neurons. The network has $3$ input nodes, the first hidden layer has $8$ neurons, the second hidden layer has $6$ neurons, and the output layer has $2$ neurons.


In [3]:
def generateNN(name, Topology):
    L = len(Topology)
    input_layer   = ['i' + str(i) for i in range(1, Topology[0]+1)]
    hidden_layers = [['h' + str(k+1) + ',' + str(i) for i in range(1, s+1)] 
                                                    for (k, s) in enumerate(Topology[1:-1])]
    output_layer  = ['o' + str(i) for i in range(1, Topology[-1]+1)]
    nng = gv.Graph(name)
    nng.attr(rankdir='LR', splines='false')
    # create nodes for input layer
    for n in input_layer:
        nng.node(n, label='', shape='point', width='0.05')
    # create nodes for hidden layers
    for NodeList in hidden_layers:
        for n in NodeList:
            nng.node(n, label='', shape='circle', width='0.1')
    # create nodes for output layer
    for n in output_layer:
        nng.node(n, label='', shape='circle', width='0.1')
    # connect input layer to first hidden layer
    for n1 in input_layer:
        for n2 in hidden_layers[0]:
            nng.edge(n1, n2)
    # connect hidden layers d to hidden layer d+1
    for d in range(0, L-3):
        for n1 in hidden_layers[d]:
            for n2 in hidden_layers[d+1]:
                nng.edge(n1, n2)
    # connect output layer
    for n1 in hidden_layers[L-3]:
        for n2 in output_layer:
            nng.edge(n1, n2)
    return nng

In [5]:
Topology = [3, 6, 4, 2]

In [6]:
nn1 = generateNN('nn1', Topology)
nn1


Out[6]:
nn1 i1 h1,1 i1--h1,1 h1,2 i1--h1,2 h1,3 i1--h1,3 h1,4 i1--h1,4 h1,5 i1--h1,5 h1,6 i1--h1,6 i2 i2--h1,1 i2--h1,2 i2--h1,3 i2--h1,4 i2--h1,5 i2--h1,6 i3 i3--h1,1 i3--h1,2 i3--h1,3 i3--h1,4 i3--h1,5 i3--h1,6 h2,1 h1,1--h2,1 h2,2 h1,1--h2,2 h2,3 h1,1--h2,3 h2,4 h1,1--h2,4 h1,2--h2,1 h1,2--h2,2 h1,2--h2,3 h1,2--h2,4 h1,3--h2,1 h1,3--h2,2 h1,3--h2,3 h1,3--h2,4 h1,4--h2,1 h1,4--h2,2 h1,4--h2,3 h1,4--h2,4 h1,5--h2,1 h1,5--h2,2 h1,5--h2,3 h1,5--h2,4 h1,6--h2,1 h1,6--h2,2 h1,6--h2,3 h1,6--h2,4 o1 h2,1--o1 o2 h2,1--o2 h2,2--o1 h2,2--o2 h2,3--o1 h2,3--o2 h2,4--o1 h2,4--o2

In [7]:
Topology = [8, 12, 8, 6, 3]

In [8]:
nn2 = generateNN('nn2', Topology)
nn2


Out[8]:
nn2 i1 h1,1 i1--h1,1 h1,2 i1--h1,2 h1,3 i1--h1,3 h1,4 i1--h1,4 h1,5 i1--h1,5 h1,6 i1--h1,6 h1,7 i1--h1,7 h1,8 i1--h1,8 h1,9 i1--h1,9 h1,10 i1--h1,10 h1,11 i1--h1,11 h1,12 i1--h1,12 i2 i2--h1,1 i2--h1,2 i2--h1,3 i2--h1,4 i2--h1,5 i2--h1,6 i2--h1,7 i2--h1,8 i2--h1,9 i2--h1,10 i2--h1,11 i2--h1,12 i3 i3--h1,1 i3--h1,2 i3--h1,3 i3--h1,4 i3--h1,5 i3--h1,6 i3--h1,7 i3--h1,8 i3--h1,9 i3--h1,10 i3--h1,11 i3--h1,12 i4 i4--h1,1 i4--h1,2 i4--h1,3 i4--h1,4 i4--h1,5 i4--h1,6 i4--h1,7 i4--h1,8 i4--h1,9 i4--h1,10 i4--h1,11 i4--h1,12 i5 i5--h1,1 i5--h1,2 i5--h1,3 i5--h1,4 i5--h1,5 i5--h1,6 i5--h1,7 i5--h1,8 i5--h1,9 i5--h1,10 i5--h1,11 i5--h1,12 i6 i6--h1,1 i6--h1,2 i6--h1,3 i6--h1,4 i6--h1,5 i6--h1,6 i6--h1,7 i6--h1,8 i6--h1,9 i6--h1,10 i6--h1,11 i6--h1,12 i7 i7--h1,1 i7--h1,2 i7--h1,3 i7--h1,4 i7--h1,5 i7--h1,6 i7--h1,7 i7--h1,8 i7--h1,9 i7--h1,10 i7--h1,11 i7--h1,12 i8 i8--h1,1 i8--h1,2 i8--h1,3 i8--h1,4 i8--h1,5 i8--h1,6 i8--h1,7 i8--h1,8 i8--h1,9 i8--h1,10 i8--h1,11 i8--h1,12 h2,1 h1,1--h2,1 h2,2 h1,1--h2,2 h2,3 h1,1--h2,3 h2,4 h1,1--h2,4 h2,5 h1,1--h2,5 h2,6 h1,1--h2,6 h2,7 h1,1--h2,7 h2,8 h1,1--h2,8 h1,2--h2,1 h1,2--h2,2 h1,2--h2,3 h1,2--h2,4 h1,2--h2,5 h1,2--h2,6 h1,2--h2,7 h1,2--h2,8 h1,3--h2,1 h1,3--h2,2 h1,3--h2,3 h1,3--h2,4 h1,3--h2,5 h1,3--h2,6 h1,3--h2,7 h1,3--h2,8 h1,4--h2,1 h1,4--h2,2 h1,4--h2,3 h1,4--h2,4 h1,4--h2,5 h1,4--h2,6 h1,4--h2,7 h1,4--h2,8 h1,5--h2,1 h1,5--h2,2 h1,5--h2,3 h1,5--h2,4 h1,5--h2,5 h1,5--h2,6 h1,5--h2,7 h1,5--h2,8 h1,6--h2,1 h1,6--h2,2 h1,6--h2,3 h1,6--h2,4 h1,6--h2,5 h1,6--h2,6 h1,6--h2,7 h1,6--h2,8 h1,7--h2,1 h1,7--h2,2 h1,7--h2,3 h1,7--h2,4 h1,7--h2,5 h1,7--h2,6 h1,7--h2,7 h1,7--h2,8 h1,8--h2,1 h1,8--h2,2 h1,8--h2,3 h1,8--h2,4 h1,8--h2,5 h1,8--h2,6 h1,8--h2,7 h1,8--h2,8 h1,9--h2,1 h1,9--h2,2 h1,9--h2,3 h1,9--h2,4 h1,9--h2,5 h1,9--h2,6 h1,9--h2,7 h1,9--h2,8 h1,10--h2,1 h1,10--h2,2 h1,10--h2,3 h1,10--h2,4 h1,10--h2,5 h1,10--h2,6 h1,10--h2,7 h1,10--h2,8 h1,11--h2,1 h1,11--h2,2 h1,11--h2,3 h1,11--h2,4 h1,11--h2,5 h1,11--h2,6 h1,11--h2,7 h1,11--h2,8 h1,12--h2,1 h1,12--h2,2 h1,12--h2,3 h1,12--h2,4 h1,12--h2,5 h1,12--h2,6 h1,12--h2,7 h1,12--h2,8 h3,1 h2,1--h3,1 h3,2 h2,1--h3,2 h3,3 h2,1--h3,3 h3,4 h2,1--h3,4 h3,5 h2,1--h3,5 h3,6 h2,1--h3,6 h2,2--h3,1 h2,2--h3,2 h2,2--h3,3 h2,2--h3,4 h2,2--h3,5 h2,2--h3,6 h2,3--h3,1 h2,3--h3,2 h2,3--h3,3 h2,3--h3,4 h2,3--h3,5 h2,3--h3,6 h2,4--h3,1 h2,4--h3,2 h2,4--h3,3 h2,4--h3,4 h2,4--h3,5 h2,4--h3,6 h2,5--h3,1 h2,5--h3,2 h2,5--h3,3 h2,5--h3,4 h2,5--h3,5 h2,5--h3,6 h2,6--h3,1 h2,6--h3,2 h2,6--h3,3 h2,6--h3,4 h2,6--h3,5 h2,6--h3,6 h2,7--h3,1 h2,7--h3,2 h2,7--h3,3 h2,7--h3,4 h2,7--h3,5 h2,7--h3,6 h2,8--h3,1 h2,8--h3,2 h2,8--h3,3 h2,8--h3,4 h2,8--h3,5 h2,8--h3,6 o1 h3,1--o1 o2 h3,1--o2 o3 h3,1--o3 h3,2--o1 h3,2--o2 h3,2--o3 h3,3--o1 h3,3--o2 h3,3--o3 h3,4--o1 h3,4--o2 h3,4--o3 h3,5--o1 h3,5--o2 h3,5--o3 h3,6--o1 h3,6--o2 h3,6--o3

In [ ]: