입력 레이어 1개, 히든 레이어 1개, 출력 레이어 1개로 구성된 신경망을 그리고 싶습니다. 샘플 라텍스 코드를 검색하여 출력 레이어를 추가했는데 다음과 같습니다.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\def\layersep{2.5cm}
\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}
\node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,5}
\path[yshift=0.5cm]
node[hidden neuron] (H-\name) at (\layersep,-\y cm) {};
% Draw the output layer node
%\node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {};
% 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}
\node[output neuron, pin=right:Output \#\y] (O-\name) at (2*\layersep,-\y cm) {};
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,4}
\foreach \dest in {1,...,5}
\path (I-\source) edge (H-\dest);
% Connect every node in the hidden layer with the output layer
\foreach \source in {1,...,5}
%\path (H-\source) edge (O);
\foreach \dest in {1,...,4}
\path (H-\source) edge (O-\dest);
% 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}
% End of code
\end{document}
결과는 다음과 같습니다
각 단위에 표기법을 그리려고 할 때 다른 사람의 작업에서 검색했는데 레이블 속성 label
=180:$x_{\pgfmathresult}$`를 사용하므로 선언합니다.
\pgfmathparse{\x}
그런 다음 내 코드를 다음으로 변경하십시오.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\def\layersep{2.5cm}
\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
\pgfmathparse{\x}
\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[input neuron, label=180:$x_{\pgfmathresult}$,
pin=left:Input \#\y] (I-\name) at (0,-\y) {};
% Draw the hidden layer nodes
\foreach \name / \y in {1,...,5}
\path[yshift=0.5cm]
node[hidden neuron, label=180:$x_{\pgfmathresult}$], (H-\name) at (\layersep,-\y cm) {};
% Draw the output layer node
%\node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {};
% 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}
\node[output neuron, label=180:$x_{\pgfmathresult}$,\documentclass[10pt]{•} pin=right:Output \#\y] (O-\name) at (2*\layersep,-\y cm) {};
% Connect every node in the input layer with every node in the
% hidden layer.
\foreach \source in {1,...,4}
\foreach \dest in {1,...,5}
\path (I-\source) edge (H-\dest);
% Connect every node in the hidden layer with the output layer
\foreach \source in {1,...,5}
%\path (H-\source) edge (O);
\foreach \dest in {1,...,4}
\path (H-\source) edge (O-\dest);
% 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}
% End of code
\end{document}
그러나 정의되지 않은 제어 시퀀스 \x\pgfmathparse{\x} 오류가 있습니다. 어떻게 해결해야 할지 모르겠습니다. 도움을 주셔서 감사합니다.
답변1
의견을 통해 문제에 대한 해결책을 찾습니다. 귀하의 코드가 (불필요하다) 복잡하다고 불평하므로(비교적 오래된 예를 기반으로 함) 다음과 같은 단순화된 코드를 사용하는 것이 좋습니다. 이 코드는 TikZ 라이브러리 chains
와 positioning
스타일 정의 및 노드 위치 지정을 위한 최신 구문을 사용합니다.
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{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,
on chain},
annot/.style = {text width=4em, align=center}
]
% Draw the input layer nodes
\foreach \i in {1,...,4}
\node[neuron=green!50,
pin=180:Input \#\i] (I-\i) {$x_{\i}$};
% Draw the hidden layer nodes
\node[neuron=blue!50,
above right=6mm and 24mm of I-1.center] (H-1) {$x_{1}$};
\foreach \i [count=\j from 1] in {2,...,5}
\node[neuron=blue!50,
below=of H-\j] (H-\i) {$x_{\i}$};
% Draw the output layer node
\node[neuron=red!50,
pin= {[pin edge=->]0:Output \#1},
right=of I-1 -| H-1] (O-1) {$x_{1}$};
\foreach \i [count=\j from 1] in {2,...,4}
\node[neuron=red!50,
pin= {[pin edge=->]0:Output \#\j},
below=of O-\j] (O-\i) {$x_{\i}$};
% 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,...,5}
{
\path (I-\i) edge (H-\j)
(H-\j) edge (O-\i);
}
\end{tikzpicture}
\end{document}