
Diese Frage ist der Aufbau einer Lösung gepostetHier. Der Code, den ich unten habe, muss optimiert werden, da die Ausgabeebene nicht im Verhältnis zum Rest der Abbildung zentriert ist.
Ich möchte wissen, wie ich die Ausgabeebene mit dem Rest der Abbildung zentrieren kann.
Außerdem wollte ich wissen, wie ich die richtige Position der Ausgabeebene festlegen kann, anstatt sie wie derzeit fest zu codieren:
\node[output neuron, pin=right:Output \#\y] (O-\name) at (4*\layersep,-\y) {};
Hier ist der Code, den ich bisher habe:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\def\layersep{2.5cm}
\begin{tikzpicture}[
shorten >=1pt,->,
draw=black!50,
node distance=\layersep,
every pin edge/.style={<-,shorten <=1pt},
neuron/.style={circle,fill=black!25,minimum size=17pt,inner sep=0pt},
input neuron/.style={neuron, fill=green!50},
output neuron/.style={neuron, fill=red!50},
hidden neuron/.style={neuron, fill=blue!50},
annot/.style={text width=4em, text centered}
]
% Draw the input layer nodes
\foreach \name / \y in {1,...,8}
% 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) {};
% set number of hidden layers
\newcommand\Nhidden{3}
% Draw the hidden layer nodes
\foreach \N in {1,...,\Nhidden} {
\foreach \y in {1,...,9} {
\path[yshift=0.5cm]
node[hidden neuron] (H\N-\y) at (\N*\layersep,-\y cm) {};
}
\node[annot,above of=H\N-1, node distance=1cm] (hl\N) {Hidden layer \N};
}
% Draw the output layer node
\foreach \name / \y in {1,...,4}
% This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
\node[output neuron, pin=right:Output \#\y] (O-\name) at (4*\layersep,-\y) {};
% How to calculate the exact location of the output layers instead of hardcoding the value
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,8}
\foreach \dest in {1,...,9}
\path (I-\source) edge (H1-\dest);
% connect all hidden stuff
\foreach [remember=\N as \lastN (initially 1)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,9}
\path (H\lastN-\source) edge (H\N-\dest);
% Connect every node in the hidden layer with the output layer
\foreach [remember=\N as \lastN (initially 3)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,4}
\path (H\lastN-\source) edge (O-\dest);
% Annotate the layers
\node[annot,left of=hl1] {Input layer};
\node[annot,right of=hl\Nhidden] {Output layer};
\end{tikzpicture}
% End of code
\end{document}
Antwort1
Ändern Sie die Koordinaten für Knoten in der Ausgabeebene von (4*\layersep,-\y)
in (4*\layersep,-\y-2)
:
Komplettes MWE:
\documentclass[tikz, margin=3mm]{standalone}
\begin{document}
\def\layersep{2.5cm}
\begin{tikzpicture}[
shorten >=1pt,->,
draw=black!50,
node distance=\layersep,
every pin edge/.style={<-,shorten <=1pt},
neuron/.style={circle,fill=black!25,minimum size=17pt,inner sep=0pt},
input neuron/.style={neuron, fill=green!50},
output neuron/.style={neuron, fill=red!50},
hidden neuron/.style={neuron, fill=blue!50},
annot/.style={text width=4em, text centered}
]
% Draw the input layer nodes
\foreach \name / \y in {1,...,8}
% 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) {};
% set number of hidden layers
\newcommand\Nhidden{3}
% Draw the hidden layer nodes
\foreach \N in {1,...,\Nhidden} {
\foreach \y in {1,...,9} {
\path[yshift=0.5cm]
node[hidden neuron] (H\N-\y) at (\N*\layersep,-\y cm) {};
}
\node[annot,above of=H\N-1, node distance=1cm] (hl\N) {Hidden layer \N};
}
% Draw the output layer node
\foreach \name / \y in {1,...,4}
% This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
\node[output neuron,
pin=right:Output \#\y] (O-\name)
at (4*\layersep,-\y-2) {}; % <-----------
% How to calculate the exact location of the output layers instead of hardcoding the value
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,8}
\foreach \dest in {1,...,9}
\path (I-\source) edge (H1-\dest);
% connect all hidden stuff
\foreach [remember=\N as \lastN (initially 1)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,9}
\path (H\lastN-\source) edge (H\N-\dest);
% Connect every node in the hidden layer with the output layer
\foreach [remember=\N as \lastN (initially 3)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,4}
\path (H\lastN-\source) edge (O-\dest);
% Annotate the layers
\node[annot,left of=hl1] {Input layer};
\node[annot,right of=hl\Nhidden] {Output layer};
\end{tikzpicture}
\end{document}
Antwort2
Es ist schwierig, Ihnen eine nicht fest codierte Antwort zu geben, da alle anderen Werte fest codiert sind. Sie benötigen
at (4*\layersep,{-\y*1cm-(9-4-1)*0.5cm})
weil es 9 versteckte Knoten pro Schicht, 4 Ausgabeknoten und dann ein fest codiertes [yshift=0.5cm]
in der Konstruktion der versteckten Neuronen gibt, daher das zusätzliche -1
. Das Fazit ist, dass wenn Sie die Anzahl der Ausgabeknoten von auf einen anderen Wert ändern , Sie in der obigen Formel auf denselben Wert 4
ändern müssen .4
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\def\layersep{2.5cm}
\begin{tikzpicture}[
shorten >=1pt,->,
draw=black!50,
node distance=\layersep,
every pin edge/.style={<-,shorten <=1pt},
neuron/.style={circle,fill=black!25,minimum size=17pt,inner sep=0pt},
input neuron/.style={neuron, fill=green!50},
output neuron/.style={neuron, fill=red!50},
hidden neuron/.style={neuron, fill=blue!50},
annot/.style={text width=4em, text centered}
]
% Draw the input layer nodes
\foreach \name / \y in {1,...,8}
% 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) {};
% set number of hidden layers
\newcommand\Nhidden{3}
% Draw the hidden layer nodes
\foreach \N in {1,...,\Nhidden} {
\foreach \y in {1,...,9} {
\path[yshift=0.5cm]
node[hidden neuron] (H\N-\y) at (\N*\layersep,-\y*1cm) {};
}
\node[annot,above of=H\N-1, node distance=1cm] (hl\N) {Hidden layer \N};
}
% Draw the output layer node
\foreach \name / \y in {1,...,4}
% This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4}
\node[output neuron, pin=right:Output \#\y] (O-\name)
at (4*\layersep,{-\y*1cm-(9-4-1)*0.5cm}) {};
% How to calculate the exact location of the output layers instead of hardcoding the value
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,8}
\foreach \dest in {1,...,9}
\path (I-\source) edge (H1-\dest);
% connect all hidden stuff
\foreach [remember=\N as \lastN (initially 1)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,9}
\path (H\lastN-\source) edge (H\N-\dest);
% Connect every node in the hidden layer with the output layer
\foreach [remember=\N as \lastN (initially 3)] \N in {2,...,\Nhidden}
\foreach \source in {1,...,9}
\foreach \dest in {1,...,4}
\path (H\lastN-\source) edge (O-\dest);
% Annotate the layers
\node[annot,left of=hl1] {Input layer};
\node[annot,right of=hl\Nhidden] {Output layer};
\end{tikzpicture}
\end{document}