TeX에서 신경망의 네트워크 다이어그램을 그리는 방법

$\TeX$로 신경망의 네트워크 구성도를 그리는 방법에 대해 정리하고 싶습니다.

개요



TikZ라는 $\TeX$용 그리기 패키지를 사용하여 그립니다.
벡터 이미지로서 그려지기 때문에, 확대 축소에 의한 그림의 흐트러짐이 발생하지 않고, 그림내에 있는 문자가 copipe 가능하게 된다고 하는 이점이 있습니다.
또, 상대 위치에 의한 위치의 지정이나 foreach를 사용할 수 있기 때문에(구체예는 이하의 그리기 예 이나 Tikz foreach 사용 연습 - Qiita 참조), 묘화 처리를 효율적으로 기술할 수 있습니다.

그리기 예



양방향 LSTM(Bi-directional LSTM/LSTM에 대해서는 아는 LSTM ~ 최근의 동향과 함께 - Qiita 참조)의 네트워크 구성도를 그려 보고 싶습니다.

코드


TODO 섹션의 지시에 따라 다시 작성하고 컴파일합니다.
% 古いパッケージや記法のチェック用
% (コンパイル時に古いパッケージや記法を『Package nag Warning:』で始まる警告の形で指摘してくれるので, この警告が少なくなるように記述すると良い)
\RequirePackage[l2tabu, orthodox]{nag}

% latexコマンドでのコンパイル用
% TODO: 欧文の場合, 以下のコメントアウトを解除
% \documentclass{article}

% platexコマンドでのコンパイル用
% TODO: 和文の場合, 以下のコメントアウトを解除
% \documentclass[dvipdfmx]{jsarticle}

% ネットワーク構成図描画用
\usepackage{tikz}

% 省略記号
\def\ellipsis{$\cdots$}

\begin{document}
% ネットワーク構成図
\begin{figure}[tbp]
\centering

% ノード間の距離
\def\nodeDistance{1.1cm}

% 曲線の始点の角度 (°)
\def\angleStartCurve{360 * 9 / 56}

\begin{tikzpicture}[shorten >= 1pt, ->, node distance=\nodeDistance]
% 変数や省略部のスタイル
\tikzset{var/.style={minimum size=15pt}};

% ノードのスタイル
\tikzset{neuron/.style={var, draw, circle}};

% 入力部を描画
\node[var] (I-n) {$x_n$};
\node[var, left of=I-n] (I-3) {\ellipsis};
\foreach \i/\j in {2/3, 1/2}
{
    \node[var, left of=I-\j] (I-\i) {$x_\i$};
}

% 省略部のノードや変数を描画
\foreach \f/\t in {I/F-LSTM, F-LSTM/B-LSTM, B-LSTM/L-S}
{
    \node[var, above of=\f-3] (\t-3) {\ellipsis};
}
\node[var, above of=L-S-3] (O-3) {\ellipsis};

\foreach \n in {1, 2, n}
{
    % 表示されるノードや変数を描画
    \foreach \o/\f/\t in {neuron/I/F-LSTM, neuron/F-LSTM/B-LSTM, neuron/B-LSTM/L-S}
    {
        \node[\o, above of=\f-\n] (\t-\n) {};
    }
    \node[var, above of=L-S-\n] (O-\n) {$y_\n$};

    % 縦方向の線を描画
    \draw (I-\n) to [out=\angleStartCurve, in=360 - \angleStartCurve] (B-LSTM-\n);
    \draw (F-LSTM-\n) to [out=180 - \angleStartCurve, in=180 + \angleStartCurve] (L-S-\n);
    \foreach \f/\t in {I/F-LSTM, B-LSTM/L-S, L-S/O}
    {
        \path (\f-\n) edge (\t-\n);
    }
}

% 横方向の線を描画
\foreach \i/\j in {1/2, 2/3, 3/n}
{
    \foreach \n/\f/\t in {F-LSTM/\i/\j, B-LSTM/\j/\i}
    {
        \path (\n-\f) edge (\n-\t);
    }
}

% 注釈を描画
\foreach \f/\n in {I/Input, B-LSTM/Backward LSTM, F-LSTM/Foward LSTM, L-S/Linear, O/Output}
{
    \node[node distance=2 * \nodeDistance and \nodeDistance, text width=9em, text centered, right of=\f-n] (A-\f) {\n};
}
\end{tikzpicture}
\caption{Bi-directional LSTM}
\label{Fig:Bi-directional LSTM}
\end{figure}
\end{document}

컴파일 결과





참고문헌


  • Neural network | TikZ example
  • TeX에 직접 작도하자! 3 – 사람마다 독말
  • TikZ로 "인라인"그림 그리기 - Qiita
  • How to add caption for a TikZ picture? - TeX - LaTeX Stack Exchange
  • 혈액 kZ — 태스크 소마의 웹파게
  • 옵션 - TikZ를 사용해 보자! - Cute.Guides at 규슈 대학 Kyushu University
  • TikZ - TeX Wiki
  • 좋은 웹페이지 즐겨찾기