Tikz:垂直居中神經元

Tikz:垂直居中神經元

我想用 Tikz 繪製一個完全連接的神經網絡,並想知道是否有一種簡單的方法可以將所有神經元垂直居中?如果可能的話,我想使用我的方法。這是我的程式碼和範例:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}

\def\layersep{2cm}
\def\hsep{1cm}
\def\ilsize{4}
\def\hlsize{8}
\def\olsize{6}
\def\rootlrp{6}
\def\neuronsize{4mm}

\tikzset{>=latex}

\begin{figure}
\centering

\begin{tikzpicture}[shorten >=0pt, ->, draw=black!100, node distance=\layersep]
\tikzstyle{every pin edge}=[<-,shorten <=1pt]
\tikzstyle{neuron}=[circle, draw, fill=black!100, minimum size=\neuronsize,inner sep=0pt]
\tikzstyle{input neuron}=[neuron, fill=black!0]
\tikzstyle{hidden neuron}=[neuron, fill=black!0]
\tikzstyle{output neuron}=[neuron, fill=black!0]

%%%%%%%%%%%%
% DRAW NODES
%%%%%%%%%%%%
% Draw the input layer nodes
\foreach \name / \y in {1,...,\ilsize}
    \node[input neuron] (In-\name) at (0.0cm+\hsep,-\y cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H0-\name) at (1.5cm+\hsep,-\y cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H1-\name) at (3.0cm+\hsep,-\y cm) {};
% Draw the output layer nodes
\foreach \name / \y in {1,...,\olsize}
    \node[hidden neuron] (Out-\name) at (4.5cm+\hsep,-\y cm) {};

%%%%%%%%%%%%%%%%%%
% DRAW CONNECTIONS
%%%%%%%%%%%%%%%%%%
% Connect every node in the input layer with every node in the hidden layer.
\foreach \source in {1,...,\ilsize}
    \foreach \dest in {1,...,\hlsize}
        \path (In-\source) edge (H0-\dest);
% Connect first with second hidden layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\hlsize}
        \path (H0-\source) edge (H1-\dest);
% Connect every node from the last hidden layer with the output layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\olsize}
        \path (H1-\source) edge (Out-\dest);

\end{tikzpicture}
\end{figure}

\end{document}

在此輸入影像描述

答案1

這是另一個版本ABlueChampions 答案,我現在才看到,這讓你的情節完好無損,但我真的不能把\tikzstyles 留在裡面。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}
% really bad practice, sorry
\def\layersep{2cm}
\def\hsep{1cm}
\def\ilsize{4}
\def\hlsize{8}
\def\olsize{6}
\def\rootlrp{6}
\def\neuronsize{4mm}

\tikzset{>=latex}

\begin{figure}
\centering

\begin{tikzpicture}[shorten >=0pt, ->, draw=black!100, node distance=\layersep,
     every pin edge/.style={<-,shorten <=1pt},
     neuron/.style={circle, draw, fill=black!100, minimum size=\neuronsize,inner sep=0pt},
     input neuron/.style={neuron, fill=black!0},
     hidden neuron/.style={neuron, fill=black!0},
     output neuron/.style={neuron, fill=black!0}]
\pgfmathsetmacro{\iyshift}{0.5*\ilsize-0.5*\hlsize}
\pgfmathsetmacro{\oyshift}{0.5*\olsize-0.5*\hlsize}
%%%%%%%%%%%%
% DRAW NODES
%%%%%%%%%%%%
% Draw the input layer nodes
\foreach \name / \y in {1,...,\ilsize}
    \node[input neuron] (In-\name) at (0.0cm+\hsep,-\y cm+\iyshift cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H0-\name) at (1.5cm+\hsep,-\y cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H1-\name) at (3.0cm+\hsep,-\y cm) {};
% Draw the output layer nodes
\foreach \name / \y in {1,...,\olsize}
    \node[hidden neuron] (Out-\name) at (4.5cm+\hsep,-\y cm+\oyshift cm) {};

%%%%%%%%%%%%%%%%%%
% DRAW CONNECTIONS
%%%%%%%%%%%%%%%%%%
% Connect every node in the input layer with every node in the hidden layer.
\foreach \source in {1,...,\ilsize}
    \foreach \dest in {1,...,\hlsize}
        \path (In-\source) edge (H0-\dest);
% Connect first with second hidden layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\hlsize}
        \path (H0-\source) edge (H1-\dest);
% Connect every node from the last hidden layer with the output layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\olsize}
        \path (H1-\source) edge (Out-\dest);

\end{tikzpicture}
\end{figure}

\end{document}

在此輸入影像描述

答案2

你總是可以求助於古老的數學並添加- 0.5*\hlsize cm + 0.5*\ilsize cmy- 輸入和輸出節點的座標(如果我沒有犯一些尷尬的錯誤,這應該可以正常工作)。我希望這就是您的意思/想要的:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}

\def\layersep{2cm}
\def\hsep{1cm}
\def\ilsize{4}
\def\hlsize{8}
\def\olsize{6}
\def\rootlrp{6}
\def\neuronsize{4mm}

\tikzset{>=latex}

\begin{figure}
\centering

\begin{tikzpicture}[shorten >=0pt, ->, draw=black!100, node distance=\layersep]
\tikzstyle{every pin edge}=[<-,shorten <=1pt]
\tikzstyle{neuron}=[circle, draw, fill=black!100, minimum size=\neuronsize,inner sep=0pt]
\tikzstyle{input neuron}=[neuron, fill=black!0]
\tikzstyle{hidden neuron}=[neuron, fill=black!0]
\tikzstyle{output neuron}=[neuron, fill=black!0]

%%%%%%%%%%%%
% DRAW NODES
%%%%%%%%%%%%
% Draw the input layer nodes
\foreach \name / \y in {1,...,\ilsize}
    \node[input neuron] (In-\name) at (0.0cm+\hsep,-\y cm - 0.5*\hlsize cm + 0.5*\ilsize cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H0-\name) at (1.5cm+\hsep,-\y cm) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,\hlsize}
    \node[hidden neuron] (H1-\name) at (3.0cm+\hsep,-\y cm) {};
% Draw the output layer nodes
\foreach \name / \y in {1,...,\olsize}
    \node[hidden neuron] (Out-\name) at (4.5cm+\hsep,-\y cm - 0.5*\hlsize cm + 0.5*\olsize cm) {};

%%%%%%%%%%%%%%%%%%
% DRAW CONNECTIONS
%%%%%%%%%%%%%%%%%%
% Connect every node in the input layer with every node in the hidden layer.
\foreach \source in {1,...,\ilsize}
    \foreach \dest in {1,...,\hlsize}
        \path (In-\source) edge (H0-\dest);
% Connect first with second hidden layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\hlsize}
        \path (H0-\source) edge (H1-\dest);
% Connect every node from the last hidden layer with the output layer
\foreach \source in {1,...,\hlsize}
    \foreach \dest in {1,...,\olsize}
        \path (H1-\source) edge (Out-\dest);

\end{tikzpicture}
\end{figure}

\end{document}

螢幕截圖

相關內容