178

When writing a paper / making a presentation about a topic which is about neural networks, one usually visualizes the networks architecture.

What are good / simple ways to visualize common architectures automatically?

Green Falcon
  • 14,058
  • 9
  • 57
  • 98
Martin Thoma
  • 18,880
  • 35
  • 95
  • 169

21 Answers21

92

I recently created a tool for drawing NN architectures and exporting SVG, called NN-SVG

enter image description here

second screenshot

Alex Lenail
  • 1,021
  • 7
  • 2
52

Tensorflow, Keras, MXNet, PyTorch

If the neural network is given as a Tensorflow graph, then you can visualize this graph with TensorBoard.

Here is how the MNIST CNN looks like:

enter image description here

You can add names / scopes (like "dropout", "softmax", "fc1", "conv1", "conv2") yourself.

Interpretation

The following is only about the left graph. I ignore the 4 small graphs on the right half.

Each box is a layer with parameters that can be learned. For inference, information flows from bottom to the top. Ellipses are layers which do not contain learned parameters.

The color of the boxes does not have a meaning.

I'm not sure of the value of the dashed small boxes ("gradients", "Adam", "save").

Martin Thoma
  • 18,880
  • 35
  • 95
  • 169
33

There is an open source project called Netron

Netron is a viewer for neural network, deep learning and machine learning models.

Netron supports ONNX (.onnx, .pb), Keras (.h5, .keras), CoreML (.mlmodel) and TensorFlow Lite (.tflite). Netron has experimental support for Caffe (.caffemodel), Caffe2 (predict_net.pb), MXNet (-symbol.json), TensorFlow.js (model.json, .pb) and TensorFlow (.pb, .meta).

enter image description here

han4wluc
  • 431
  • 4
  • 2
21

In Caffe you can use caffe/draw.py to draw the NetParameter protobuffer:

enter image description here

In Matlab, you can use view(net)

enter image description here

Keras.js:

enter image description here

Also, see Can anyone recommend a Network Architecture visualization tool? (Reddit/self.MachineLearning).

Franck Dernoncourt
  • 5,690
  • 10
  • 40
  • 76
21

I would add ASCII visualizations using keras-sequential-ascii (disclaimer: I am the author).

A small network for CIFAR-10 (from this tutorial) would be:

       OPERATION           DATA DIMENSIONS   WEIGHTS(N)   WEIGHTS(%)

           Input   #####     32   32    3
          Conv2D    \|/  -------------------       896     2.1%
            relu   #####     30   30   32
    MaxPooling2D   Y max -------------------         0     0.0%
                   #####     15   15   32
          Conv2D    \|/  -------------------     18496    43.6%
            relu   #####     13   13   64
    MaxPooling2D   Y max -------------------         0     0.0%
                   #####      6    6   64
         Flatten   ||||| -------------------         0     0.0%
                   #####        2304
           Dense   XXXXX -------------------     23050    54.3%
         softmax   #####          10

For VGG16 it would be:

       OPERATION           DATA DIMENSIONS   WEIGHTS(N)   WEIGHTS(%)

          Input   #####      3  224  224
     InputLayer     |   -------------------         0     0.0%
                  #####      3  224  224
  Convolution2D    \|/  -------------------      1792     0.0%
           relu   #####     64  224  224
  Convolution2D    \|/  -------------------     36928     0.0%
           relu   #####     64  224  224
   MaxPooling2D   Y max -------------------         0     0.0%
                  #####     64  112  112
  Convolution2D    \|/  -------------------     73856     0.1%
           relu   #####    128  112  112
  Convolution2D    \|/  -------------------    147584     0.1%
           relu   #####    128  112  112
   MaxPooling2D   Y max -------------------         0     0.0%
                  #####    128   56   56
  Convolution2D    \|/  -------------------    295168     0.2%
           relu   #####    256   56   56
  Convolution2D    \|/  -------------------    590080     0.4%
           relu   #####    256   56   56
  Convolution2D    \|/  -------------------    590080     0.4%
           relu   #####    256   56   56
   MaxPooling2D   Y max -------------------         0     0.0%
                  #####    256   28   28
  Convolution2D    \|/  -------------------   1180160     0.9%
           relu   #####    512   28   28
  Convolution2D    \|/  -------------------   2359808     1.7%
           relu   #####    512   28   28
  Convolution2D    \|/  -------------------   2359808     1.7%
           relu   #####    512   28   28
   MaxPooling2D   Y max -------------------         0     0.0%
                  #####    512   14   14
  Convolution2D    \|/  -------------------   2359808     1.7%
           relu   #####    512   14   14
  Convolution2D    \|/  -------------------   2359808     1.7%
           relu   #####    512   14   14
  Convolution2D    \|/  -------------------   2359808     1.7%
           relu   #####    512   14   14
   MaxPooling2D   Y max -------------------         0     0.0%
                  #####    512    7    7
        Flatten   ||||| -------------------         0     0.0%
                  #####       25088
          Dense   XXXXX ------------------- 102764544    74.3%
           relu   #####        4096
          Dense   XXXXX -------------------  16781312    12.1%
           relu   #####        4096
          Dense   XXXXX -------------------   4097000     3.0%
        softmax   #####        1000
Piotr Migdal
  • 756
  • 5
  • 15
18

Keras

The keras.utils.vis_utils module provides utility functions to plot a Keras model (using graphviz)

The following shows a network model that the first hidden layer has 50 neurons and expects 104 input variables.

plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)

enter image description here

mingxue
  • 281
  • 2
  • 3
13

Here is yet another way - dotnets, using Graphviz, heavily inspired by this post by Thiago G. Martins.

dotnets example

bytesinflight
  • 231
  • 2
  • 4
13

I've been working on a drag-and-drop neural network visualizer (and more). Here's an example of a visualization for a LeNet-like architecture. A visualization of a LeNet-like architecture Models with fan-out and fan-in are also quite easily modeled. You can visit the website at https://math.mit.edu/ennui/

The open-source implementation is available at https://github.com/martinjm97/ENNUI.

Jesse
  • 231
  • 2
  • 4
  • my browser keeps crashing when press Train – Dan D. Sep 25 '19 at 04:25
  • 1
    Thanks for checking it out. Yes, this bug just popped up recently and seems to be a result of some recent changes to WebGL on Chrome. Everything should work on Firefox. I'll update you when I know more. – Jesse Sep 25 '19 at 20:19
  • tks, your visualiser is amazing, looks greater than tf playground :) – Dan D. Sep 26 '19 at 01:50
  • 1
    Thank you! Let me know if you have issues or ideas. We have fun things like code generation too! – Jesse Sep 26 '19 at 16:01
  • 1
    Bug fixes are in and the implementation has been open-sourced! – Jesse Jan 29 '20 at 15:19
13

PlotNeuralNet LaTex tool

This solution is not automatically generated (you need to construct the graph by yourself) but the PlotNeuralNet github repo allows you to build images directly from LaTex, and the result is great ! See for example the image below from the README : Example of NN draw with

or my example :

My own example, without the operations legend (sorry)

Rémi Boutin
  • 131
  • 1
  • 2
  • 2
    This is a really good visualization! Does it require the user to have Latex downloaded on the hard drive, or is it possible to this through Overleaf / ShareLatex? I am having some problems getting it to work on Overleaf. – SimpleProgrammer Apr 21 '21 at 16:38
  • Hello, They do have examples running on Overleaf in the Readme file of the package. It should not be a problem. – Rémi Boutin Apr 23 '21 at 11:52
12

The Python package conx can visualize networks with activations with the function net.picture() to produce SVG, PNG, or PIL Images like this:

enter image description here

Conx is built on Keras, and can read in Keras' models. The colormap at each bank can be changed, and it can show all bank types.

More information can be found at: http://conx.readthedocs.io/en/latest/

Doug Blank
  • 301
  • 2
  • 3
10

In R, nnet does not come with a plot function, but code for that is provided here.

Alternatively, you can use the more recent and IMHO better package called neuralnet which features a plot.neuralnet function, so you can just do:

data(infert, package="datasets")
plot(neuralnet(case~parity+induced+spontaneous, infert))

neuralnet

neuralnet is not used as much as nnet because nnet is much older and is shipped with r-cran. But neuralnet has more training algorithms, including resilient backpropagation which is lacking even in packages like Tensorflow, and is much more robust to hyperparameter choices, and has more features overall.

Ricardo Cruz
  • 3,410
  • 1
  • 15
  • 34
  • 1
    You should add the updated link for the code of NNet in R https://beckmw.wordpress.com/2013/11/14/visualizing-neural-networks-in-r-update/ – wacax May 10 '18 at 16:47
7

There are some novel alternative efforts on neural network visualization.

Please see these articles:

Stunning 'AI brain scans' reveal what machines see as they learn new skills

Inside an AI 'brain' - What does machine learning look like?

These approaches are more oriented towards visualizing neural network operation, however, NN architecture is also somewhat visible on the resulting diagrams.

Examples:

enter image description here

enter image description here

enter image description here

enter image description here

EliaCereda
  • 103
  • 2
VividD
  • 656
  • 7
  • 18
  • 40
    Please explain what we see here. It looks beautiful, but I don't understand how the fancy images support understanding the operation of the network. – Martin Thoma Mar 27 '18 at 17:15
  • I don't like your derogatory usage of "fancy images" term. @Martin – VividD Mar 27 '18 at 17:25
  • One could call your diagram "lego boxes" as well, and ask the same question. This is not an appropriate conversation style for this site. – VividD Mar 28 '18 at 07:06
  • 21
    I didn't mean to attack you, but your overly defensive answer without actually answering my question speaks for itself. - I added an "interpretation" part to the "lego boxes" diagram. – Martin Thoma Mar 28 '18 at 07:29
  • 2
    By the way: The second link is dead. – Martin Thoma Mar 28 '18 at 07:37
  • 10
    @MartinThoma It's clearly data art, not data viz (vide https://lisacharlotterost.github.io/2015/12/19/Meaning-and-Beauty-in-Data-Vis/). – Piotr Migdal Apr 02 '18 at 14:04
  • 3
    Not sure how is this useful, in fact those labels could be anything. – phoxis Jan 10 '19 at 15:04
  • To like is one thing, but isn't it accurate to call the images fancy? I think it's an appropriate conversation style if it conveys the intended message, and in this case I guess that was that the images look more interesting than what they are useful. When it comes to the lego boxes (which I think would be a fair description), they communicate certain aspects of the architecture very effectively (number of layers, shape of layers, connections, etc.), which is not something I immediately see in these images. If you become good at interpreting them, it might be another thing, though. – HelloGoodbye Jan 24 '23 at 13:00
5

You can read the popular paper Understanding Neural Networks Through Deep Visualization which discusses visualization of convolutional nets. Its implementation not only displays each layer but also depicts the activations, weights, deconvolutions and many other things that are deeply discussed in the paper. It's code is in caffe'. The interesting part is that you can replace the pre-trained model with your own.

Green Falcon
  • 14,058
  • 9
  • 57
  • 98
  • that's about showing the weights/activations, not the structure... at least from what I can see in the paper and the repo's readme – Christoph Rackwitz Aug 28 '22 at 09:54
  • @ChristophRackwitz Yes actually. Most of the other answers are about the structure. Mine is about what you've mentioned. By the way, it was about visualisation of neural nets. – Green Falcon Aug 28 '22 at 12:45
5

Tensorspace-JS is a fantastic tool for 3d visualization of network architecture:

enter image description here

https://tensorspace.org/

and here is a nice post about how to write a program:

https://medium.freecodecamp.org/tensorspace-js-a-way-to-3d-visualize-neural-networks-in-browsers-2c0afd7648a8

Ali Mirzaei
  • 151
  • 1
  • 4
5

Tensorflow / Keras / Python

I wrote a small python package called visualkeras that allows you to directly generate the architecture from your keras model.

Install via pip install visualkeras

And then it's as simple as:

import visualkeras
visualkeras.layered_view(<model>)

There are lots of options to tweak it and I am working on more visualizations. Also, always open for PRs or feature requests.

Here's what VGG16 looks like: VGG16 architecture

paulgavrikov
  • 151
  • 1
  • 3
4

Not per se nifty for papers, but very useful for showing people who don't know a lot of about neural networks what their topology may look like. This Javascript library (Neataptic) lets you visualise your network:

enter image description here

Thomas Wagenaar
  • 1,128
  • 8
  • 7
4

Netscope is my everyday tool for Caffe models.

enter image description here

Dmytro Prylipko
  • 836
  • 5
  • 10
2

I have found one amazing website. You just need to upload your h5 model, Then you will get a beautiful visualization within a few seconds. Check it out!

enter image description here

Aravind R
  • 136
  • 3
1

You can use eiffel2, which you can install using pip:

python -m pip install eiffel2

Just import builder from eiffel and provide a list of neurons per layer in your network as an input.

Example:

from eiffel2 import builder

builder([1, 10, 10, 5, 5, 2, 1])
# or the following if you want to have a dark theme
builder([1, 10, 10, 5, 5, 2, 1], bmode="night")

Output:

Normal output

output with  bmode="night"

To see more about eiffel2 visit the Github repository:

https://github.com/Ale9806/Eiffel2/blob/master/README.md

0

For a solution for PyTorch I'd add TorchView.

It is as easy as:

from torchview import draw_graph

model = MLP() batch_size = 2

device='meta' -> no memory is consumed for visualization

model_graph = draw_graph(model, input_size=(batch_size, 128), device='meta') model_graph.visual_graph

Which yields:

enter image description here

It has many customization options as well.

Royi
  • 137
  • 5
0

I'll add a plug for my recent project, TorchExplorer (live demo here). It's sort of a combination of Netron and wandb.watch. It can:

  • Interactively traverse model architectures, showing input/output tensor sizes and module parameters
  • Visualize module input/output tensors, parameters, and associated gradients as histograms over the course of training (modeled off of wandb.watch)
  • Directly integrate with weights and biases or serve standalone with a simple torchexplorer.watch call

enter image description here