TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to create a TikZ based version of the following diagram (taken from here), but I don't know how to approach it.

It doesn't need to look exactly like the original, but the basic idea should be preserved. It would especially be great if the paths from *X_n* to the sum function were straight lines without a "bend" like in the original. That makes a matrix layout difficult to use.

The definition of the output function can be left away.

Could someone point me to an approach that will work in this case, or even create a tikz texample?


Update: I ended up combining the approaches by @m0nhawk and @Toscho and came up with this:

Perceptron in TikZ

Sourcecode is here: https://github.com/dbrgn/blog/blob/master/static/img/2013/3/26/perceptron.tex

share|improve this question
Please add a minimal working example (MWE) that illustrates your problem. It's no fun to setup a file from scratch. When you post a compilable code, starting with \documentclass{...} and ending with \end{document} with your existing try-out (no matter how insufficient it is), everybody can jump in much easier. – percusse Mar 26 '13 at 8:30
Approach it the same way you would draw it. Start with the input circles and place a few below each other. Then the wights, and connect them to the circles, etc... Make an attempt and ask a specific question about what part you are having difficulty with. – Peter Grill Mar 26 '13 at 8:37
@percusse The problem is that I don't know what approach/tikzlibrary/layout to use. Therefore a MWE would be just a "base skeleton" with the standalone documentclass. PeterGrill: Ok, I could split it up into different questions (e.g. how to align the inputs around the sum function). But maybe there's a layout or library well suited for this problem, that's why I'm asking. – Danilo Bargen Mar 26 '13 at 8:41
@DaniloBargen That skeleton would be more than enough :) Just spicing up with the required nodes and it would be good to go. You really don't need to go all the way, just to reduce the load on the potential answerers. – percusse Mar 26 '13 at 14:30
@percusse ok, i'll do that next time :) – Danilo Bargen Mar 26 '13 at 21:44
up vote 6 down vote accepted

Here is the simple reconstruction. Issues:

  • Left of equations, can easily be added with node.
  • Make inputs and weights with \foreach.
  • Increase the Activation function to be more like the original one.
  • Improve TikZ styles.



\tikzset{basic/.style={draw,fill=blue!20,text width=1em,text badly centered}}

        \node[functions] (center) {};
        \node[below of=center,font=\scriptsize,text width=4em] {Activation function};
        \draw[thick] (0.5em,0.5em) -- (0,0.5em) -- (0,-0.5em) -- (-0.5em,-0.5em);
        \draw (0em,0.75em) -- (0em,-0.75em);
        \draw (0.75em,0em) -- (-0.75em,0em);
        \node[right of=center] (right) {};
            \path[draw,->] (center) -- (right);
        \node[functions,left=3em of center] (left) {$\sum$};
            \path[draw,->] (left) -- (center);
        \node[weights,left=3em of left] (2) {$w_2$} -- (2) node[input,left of=2] (l2) {$x_2$};
            \path[draw,->] (l2) -- (2);
            \path[draw,->] (2) -- (left);
        \node[below of=2] (dots) {$\vdots$} -- (dots) node[left of=dots] (ldots) {$\vdots$};
        \node[weights,below of=dots] (n) {$w_n$} -- (n) node[input,left of=n] (ln) {$x_n$};
            \path[draw,->] (ln) -- (n);
            \path[draw,->] (n) -- (left);
        \node[weights,above of=2] (1) {$w_1$} -- (1) node[input,left of=1] (l1) {$x_1$};
            \path[draw,->] (l1) -- (1);
            \path[draw,->] (1) -- (left);
        \node[weights,above of=1] (0) {$w_0$} -- (0) node[input,left of=0] (l0) {$1$};
            \path[draw,->] (l0) -- (0);
            \path[draw,->] (0) -- (left);
        \node[below of=ln,font=\scriptsize] {inputs};
        \node[below of=n,font=\scriptsize] {weights};



share|improve this answer
+1 for reference have a look at Should \tikzset or \tikzstyle be used to define TikZ styles? – cmhughes Mar 26 '13 at 16:24
@cmhughes: Never thought \tikzstyle is a "bad". Thanks! – m0nhawk Mar 26 '13 at 17:40
Thanks for this answer, very appreciated :) The lines between the inputs and the sum function are not straight, but it looks fine the way it is! – Danilo Bargen Mar 26 '13 at 21:49

With PSTricks but not completed...

enter image description here

    \C{1}           & \R{w_0}\\
    \C{x_1}         & \R{w_1}\\
    \C{x_2}         & \R{w_2}       & \C{\Sigma}    & [mnode=circle,fillstyle=solid,fillcolor=blue!20,name=symbol]\Symbol   &   [mnode=p]\\
    \vdots          & \vdots\\
    \C{x_n}         & \R{w_n}\\
    \text{inputs}   & \text{weights}
share|improve this answer
Enough with PSTricks, already! Nah, just kidding... :) Good job! – Jubobs Mar 26 '13 at 19:05

Here a shorter code without positioning, so you can scale the picture.


                       text badly centered,minimum width=3em}}
\tikzset{weights/.style={basic,rectangle,minimum width=2em}}
\newcommand{\addsymbol}{\draw[thick] (0.5em,0.5em) -- (0,0.5em) -- 
                        (0,-0.5em) --  (-0.5em,-0.5em)
                        (0em,0.75em) -- (0em,-0.75em)
                        (0.75em,0em) -- (-0.75em,0em);}

    \foreach \h [count=\hi ] in {$x_n$,$x_2$,$x_1$,$1$}{%
          \node[input] (f\hi) at (0,\hi*2cm-5 cm) {\h};
    \node[functions] (sum) at (4,0) {$\sum$};
    \foreach \h [count=\hi ] in {$w_n$,$w_2$,$w_1$,$w_0$}{%
          \path (f\hi) -- node[weights] (w\hi) {\h} (sum);
          \draw[->] (f\hi) -- (w\hi);
          \draw[->] (w\hi) -- (sum);
    \node[functions] (step) at (7,0) {};
    \draw[->] (sum) -- (step);
    \draw[->] (step) -- ++(1,0);
    % Labels
    \node[above=1cm]  at (f4) {inputs};
    \node[above=1cm] at (w4) {weights};

enter image description here

share|improve this answer

If I understand you correctly, you want the nodes wn to lie on straight lines from the nodes xn to the node ∑. Then you can do

\node[…](w1) at ($(x1)!0.5!(sum)$) {\(w_n\)};


share|improve this answer
Thanks, this helped! – Danilo Bargen Mar 27 '13 at 8:13

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.