1

I would like to draw like this : enter image description here

Currently, what I have is enter image description here

My current code is

\begin{figure}
\centering
\label{fig:nn2}
\begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep]
    \tikzstyle{every pin edge}=[<-,shorten <=1pt]
    \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt]
    \tikzstyle{input neuron}=[neuron, fill=green!50];
    \tikzstyle{output neuron}=[neuron, fill=red!50];
    \tikzstyle{hidden neuron}=[neuron, fill=blue!50];
    \tikzstyle{annot} = [text width=4em, text centered]

    % Draw the input layer nodes
    \foreach \name / \y in {1,...,4}
    % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
        %\if \y in {1,2,3,4}        
        \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
        %\else
        %\node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
    %\node[input neuron, pin=left:Input \#4] (+1) at (0,-4) {$x_{\name}$};

    % Draw the hidden layer nodes
    \foreach \name / \y in {1,...,4}
        \path[yshift=0.5cm]
            node[hidden neuron] (H-\name) at (\layersep,-\y cm) {$h_{\name}$};

    % Draw the output layer node
    \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {$y_{0}$};

    % Connect every node in the input layer with every node in the
    % hidden layer.
    \foreach \source in {1,...,4}
        \foreach \dest in {1,...,4}
            \path (I-\source) edge (H-\dest);

    % Connect every node in the hidden layer with the output layer
    \foreach \source in {1,...,4}
        \path (H-\source) edge (O);

    % Annotate the layers
    \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer};
    \node[annot,left of=hl] {Input layer};
    \node[annot,right of=hl] {Output layer};
\end{tikzpicture}
\caption{A figure shows the structure of a general neural networks model}
\end{figure}

I try to use "if-else". and after revising, my code is:

\begin{figure}
\centering
\label{fig:nn2}
\begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep]
    \tikzstyle{every pin edge}=[<-,shorten <=1pt]
    \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt]
    \tikzstyle{input neuron}=[neuron, fill=green!50];
    \tikzstyle{output neuron}=[neuron, fill=red!50];
    \tikzstyle{hidden neuron}=[neuron, fill=blue!50];
    \tikzstyle{annot} = [text width=4em, text centered]

    % Draw the input layer nodes
    \foreach \name / \y in {1,...,4}
    % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
        \if \y in {1,2,3,4}        
        \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
        \else
        %\node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
    %\node[input neuron, pin=left:Input \#4] (+1) at (0,-4) {$x_{\name}$};

    % Draw the hidden layer nodes
    \foreach \name / \y in {1,...,4}
        \path[yshift=0.5cm]
            node[hidden neuron] (H-\name) at (\layersep,-\y cm) {$h_{\name}$};

    % Draw the output layer node
    \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {$y_{0}$};

    % Connect every node in the input layer with every node in the
    % hidden layer.
    \foreach \source in {1,...,4}
        \foreach \dest in {1,...,4}
            \path (I-\source) edge (H-\dest);

    % Connect every node in the hidden layer with the output layer
    \foreach \source in {1,...,4}
        \path (H-\source) edge (O);

    % Annotate the layers
    \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer};
    \node[annot,left of=hl] {Input layer};
    \node[annot,right of=hl] {Output layer};
\end{tikzpicture}
\caption{A figure shows the structure of a general neural networks model}
\end{figure}

however, there is an error: Extra }, or forgotten \endgroup

Thank you!

Alex
  • 603
  • What is your question? – Michael Fraiman Apr 20 '17 at 06:27
  • Your question is follows-up question to https://tex.stackexchange.com/questions/365404/tikz-neural-network-draw-notation, for which you got complete and concise answer. Why you not use it? From it to what you like to have now is more simple and clear way. – Zarko Apr 20 '17 at 07:14

2 Answers2

4

You were missing the curley braces around the loop body and the \fi to close the if-statement. Also the \if statement does not work as you intended:

\if<token1><token2> (test if character codes agree)

TeX will expand macros following \if until two unexpandable tokens are found. If either token is a control sequence, TeX considers it to have character code 256 and category code 16, unless the current equivalent of that control sequence has been \let equal to a non-active character token. In this way, each token specifies a (character code, category code) pair. The condition is true if the character codes are equal, independent of the category codes. For example, after \def\a{*} and \let\b=* and \def\c{/}, the tests \if*\a and \if\a\b will be true, but \if\a\c will be false. Also \if\a\par will be false, but \if\par\let will be true.

(The TeXbook page 209)

Therefore you are comparing in the first iteration step 1 and i, in the second 2 and i and so on, always evaluating to false. Instead I am checking whether it is the last iteration step with \ifnum:

\begin{figure}
\centering
\label{fig:nn2}
\begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep]
    \tikzstyle{every pin edge}=[<-,shorten <=1pt]
    \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt]
    \tikzstyle{input neuron}=[neuron, fill=green!50];
    \tikzstyle{output neuron}=[neuron, fill=red!50];
    \tikzstyle{hidden neuron}=[neuron, fill=blue!50];
    \tikzstyle{annot} = [text width=4em, text centered]
    \newcommand{\n}{4} % number of neurons per layer

    % Draw the input layer nodes
    \foreach \name / \y in {1,...,\n}{
    % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
        \ifnum \y=\n
            \node[input neuron, pin=left:Input \#$n$] (I-\name) at (0,-\y) {$x_{n}$};
        \else
            \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
        \fi
    }

    % Draw the hidden layer nodes
    \foreach \name / \y in {1,...,\n}{
        \ifnum \y=\n
            \path[yshift=0.5cm] node[hidden neuron] (H-\name) at (\layersep,-\y cm) {$h_{n}$};
        \else
            \path[yshift=0.5cm] node[hidden neuron] (H-\name) at (\layersep,-\y cm) {$h_{\name}$};
        \fi
    }

    % Draw the output layer node
    \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {$y_{0}$};

    % Connect every node in the input layer with every node in the
    % hidden layer.
    \foreach \source in {1,...,\n}
        \foreach \dest in {1,...,\n}
            \path (I-\source) edge (H-\dest);

    % Connect every node in the hidden layer with the output layer
    \foreach \source in {1,...,\n}
        \path (H-\source) edge (O);

    % Annotate the layers
    \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer};
    \node[annot,left of=hl] {Input layer};
    \node[annot,right of=hl] {Output layer};
\end{tikzpicture}
\caption{A figure shows the structure of a general neural networks model}
\end{figure}

However, I would not use any if here:

\begin{figure}
\centering
\label{fig:nn2}
\begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep]
    \tikzstyle{every pin edge}=[<-,shorten <=1pt]
    \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt]
    \tikzstyle{input neuron}=[neuron, fill=green!50];
    \tikzstyle{output neuron}=[neuron, fill=red!50];
    \tikzstyle{hidden neuron}=[neuron, fill=blue!50];
    \tikzstyle{annot} = [text width=4em, text centered]
    \newcommand{\numberNeuronsPerLayer}{4}
    \edef\numberNeuronsPerLayerMinusOne{\number\numexpr\numberNeuronsPerLayer-1\relax}

    % Draw the input layer nodes
    \foreach \name / \y in {1,...,\numberNeuronsPerLayerMinusOne}{
    % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
        \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {$x_{\name}$};
    }
    \node[input neuron, pin=left:Input \#$n$] (I-\numberNeuronsPerLayer) at (0,-\numberNeuronsPerLayer) {$x_{n}$};

    % Draw the hidden layer nodes
    \begin{scope}[yshift=0.5cm]
        \foreach \name / \y in {1,...,\numberNeuronsPerLayerMinusOne}{
            \path node[hidden neuron] (H-\name) at (\layersep,-\y cm) {$h_{\name}$};
        }
        \path node[hidden neuron] (H-\numberNeuronsPerLayer) at (\layersep,-\numberNeuronsPerLayer cm) {$h_{n}$};
    \end{scope}

    % Draw the output layer node
    \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {$y_{0}$};

    % Connect every node in the input layer with every node in the
    % hidden layer.
    \foreach \source in {1,...,\numberNeuronsPerLayer}
        \foreach \dest in {1,...,\numberNeuronsPerLayer}
            \path (I-\source) edge (H-\dest);

    % Connect every node in the hidden layer with the output layer
    \foreach \source in {1,...,\numberNeuronsPerLayer}
        \path (H-\source) edge (O);

    % Annotate the layers
    \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer};
    \node[annot,left of=hl] {Input layer};
    \node[annot,right of=hl] {Output layer};
\end{tikzpicture}
\caption{A figure shows the structure of a general neural networks model}
\end{figure}
jakun
  • 5,981
2

Based on my answer to your question:

enter image description here

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{calc, chains, positioning}

\begin{document}
    \begin{tikzpicture}[shorten >=1pt,->, draw=black!50,
        node distance = 6mm and 24mm,
          start chain = going below,
every pin edge/.style = {<-,shorten <=1pt},
        neuron/.style = {circle, fill=#1,
                         minimum size=17pt, inner sep=0pt},
         annot/.style = {text width=4em, align=center}
                        ]
% Draw the input and hidden layer nodes
\ifnum\i<4 
    \node[neuron=green!50, on chain,
          pin=180:Input \#\i    % if you not like to have this inputs, just erase them
          ]              (I-\i)  {$x_{\i}$};
    \node[neuron=blue!50,
      right=of I-\i]     (H-\i)  {};
\else 
    \node[neuron=green!50, on chain,
          pin=180:Input \#\i    % if you not like to have this inputs, just erase them
          ]              (I-\i)  {$+1$}; 
    \node[neuron=blue!50,
          right=of I-\i] (H-\i)  {$+1$}; 
\fi
}
% Draw the output layer node
    \node[neuron=red!50,
          right=of $(H-2)!0.5!(H-3)$]  (O-1)   {};
% Connect input nodes with hidden nodes and
%  hiden nodes with output nodes with the output layer
    \foreach \i in {1,...,4}
        \foreach \j in {1,...,4}
{
    \draw (I-\i) edge (H-\j)
          (H-\j) edge (O-1);
}
    \draw (O-1) -- node[below] {$h_{w,b}(x)$} + (2,0);
% Annotate layers
\node[annot,below=of I-4.center]        {Layer 1};
\node[annot,below=of H-4.center]        {Layer 2};
\node[annot,below=of O-1 |- H-4.center] {Layer 3};
    \end{tikzpicture}
\end{document}

Conditionals: as follows from above MWE

\ifnum\i<4
    action 1
\else
    action 2
\fi;

Addendum: your problem you can solve without conditional statement:

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{calc, chains, positioning}

\begin{document}
    \begin{tikzpicture}[shorten >=1pt,->, draw=black!50,
        node distance = 6mm and 24mm,
          start chain = going below,
every pin edge/.style = {<-,shorten <=1pt},
        neuron/.style = {circle, fill=#1,
                         minimum size=17pt, inner sep=0pt},
         annot/.style = {text width=4em, align=center}
                        ]
% Draw the input and hyden layer nodes
\foreach \i in {1,2,3}
{
    \node[neuron=green!50, on chain,
          pin=180:Input \#\i    % if you not like to have this inputs, just erase them
          ]             (I-\i)  {$x_{\i}$};
    \node[neuron=blue!50,
      right=of I-\i]    (H-\i)     {};
}
    \node[neuron=green!50, 
          pin=180:Input \#\i    % if you not like to have this inputs, just erase them
          below=of I-3
          ]              (I-4)  {$+1$};
    \node[neuron=blue!50,
          below=of H-3] (H-4)  {$+1$};
% Draw the output layer node
    \node[neuron=red!50,
          right=of $(H-2)!0.5!(H-3)$]  (O-1)   {};
% Connect input nodes with hidden nodes and
%  hiden nodes with output nodes with the output layer
    \foreach \i in {1,...,4}
        \foreach \j in {1,...,4}
{
    \draw (I-\i) edge (H-\j)
          (H-\j) edge (O-1);
}
    \draw (O-1) -- node[below] {$h_{w,b}(x)$} + (2,0);
% Annotate layers
\node[annot,below=of I-4.center]        {Layer 1};
\node[annot,below=of H-4.center]        {Layer 2};
\node[annot,below=of O-1 |- H-4.center] {Layer 3};
    \end{tikzpicture}
\end{document}

The result is the same as before.

Zarko
  • 296,517