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 cm언제든지 좋은 오래된 수학으로 돌아가서와이- 입력 및 출력 노드의 좌표(당황스러운 실수를 하지 않았다면 일반적으로 어느 정도 작동해야 합니다). 그것이 당신이 의도한/원했던 것이였기를 바랍니다.

\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}

스크린샷

관련 정보