TikZ を活用した深層学習モデル構造図の作成テクニック

TikZ と LaTeX の基礎環境

深層学習の研究論文や発表資料を作成する際、Convolutional Neural Network (CNN) などのネットワーク構造を視覚的に表現することは重要です。LaTeX の拡張パッケージである TikZ は、ベクター形式で高品質な図形描画を可能にする強力なツールです。

ローカル環境への LaTeX インストールは重く時間がかかる場合がありますが、Overleaf などのオンラインコンパイラを利用すれば、ブラウザ上ですぐに編集と確認を行うことができます。日本語対応も整備されているため、手軽に実験を始められます。

TikZ の基本的な描画命令

TikZ では `tikzpicture` エンビロンメント内で座標系に基づいて描画を行います。基本となる座標は直交座標 `(x,y)` または極座標 `(角度:半径)` で指定します。

線分と形状の制御

`\draw` コマンドを使用して点を結んだり、多角形を描画したりできます。以下の例では座標変数の定義と接続、そして線のスタイル(色、太さ、矢印)を変更する方法を示しています。

\begin{tikzpicture}[scale=1.5]
    \draw[help lines] (0,0) grid(4,4);
    
    % 座標の定義
    \coordinate (start_point) at (1,1);
    \coordinate (end_point) at (3,3);
    \coordinate (control_pt) at (1,3);

    % 線分の描画
    \draw[thick, blue] (start_point) -- (end_point);
    \draw[red, ->] (start_point) -- (control_pt);
    
    % 矢印の方向を変えて複数接続
    \draw[green, <->] (control_pt) -- (3,1);
\end{tikzpicture}

線の太さは `thick`, `ultra thick` など、または `line width=` オプションで指定可能です。点線などは `dashed` や `dotted` を追加することで変更できます。

閉じた形状と曲線

矩形や円、弧などを描画するにはそれぞれの専用コマンドを使用します。また、`to[out=...,in=...]` 構文を使うことで滑らかな曲線を描くことが可能です。

\begin{tikzpicture}
    \draw[help lines] (0,0) grid(5,3);
    % 矩形 (左下,右上)
    \draw[fill=cyan!30] (1,1) rectangle (3,2.5);
    % 円 (中心,半径)
    \draw[fill=yellow!50] (4,1) circle[radius=0.6];
    % 自由曲線 (開始点,経路,終了点)
    \draw[brown, very thick] (0,0) 
        to[out=90,in=180] (1,2) 
        to[out=0,in=90] (3,1);
\end{tikzpicture}

数値関数のプロット

TikZ の `plot` 機能を用いると、数学的な関数グラフを直接描画できます。`domain` で表示範囲を限定し、`\x` 変数に対して関数を評価します。

\begin{tikzpicture}
    \draw[->] (0,0) -- (4,0) node[right] {$x$};
    \draw[->] (0,0) -- (0,4) node[above] {$y$};
    \draw[blue, thick, domain=0:3.5] 
        plot (\x, {\x*\x/3});
\end{tikzpicture}

カスタムマクロによるレイヤー描画

単一の図形だけでなく、再帰的または反復的な構造を持つ神経網を表す場合、一からコードを書くのは非効率的です。`\newcommand` を使って、立方体(層)を描画するためのテンプレートマクロを作成しましょう。

以下のマクロは、位置、サイズ、色、ラベルなどを受け取り、自動的に 3D 的な立方体を描画します。変数名や引数の順序を調整してオリジナル性の高い実装にしました。

% マクロ定義:\drawCubeLayer{横幅幅}{奥行き}{X偏移}{Y偏移}{Z偏移}{塗りつぶし色}{ラベル文字}{識別 ID}{接続元リスト}
\newcommand{\drawCubeLayer}[9]{%
    % パラメータの取得と局所変数の設定
    \def\layerSize{#1} \def\layerDepth{#2}
    \def\offsetX{#3} \def\offsetY{#4} \def\offsetZ{#5}
    \def\layerColor{#6} \def\layerLabel{#7}
    \def\layerID{#8} \def\linkList{#9}

    % 基準座標の計算
    \pgfmathsetmacro\widthHalf{\layerSize/2}
    
    % キューブの頂点座標定義 (前面と背面)
    \coordinate (#8_center_back) at (\offsetX, \offsetZ+\widthHalf, \offsetY-\widthHalf);
    \coordinate (#8_corner_bl) at (\offsetX+\layerDepth, -\widthHalf+\offsetZ, -\widthHalf+\offsetY); % 背面右下
    \coordinate (#8_corner_br) at (\offsetX+\layerDepth, \widthHalf+\offsetZ, -\widthHalf+\offsetY); % 背面右上
    \coordinate (#8_corner_fl) at (\offsetX, -\widthHalf+\offsetZ, \widthHalf+\offsetY);       % 正面左下
    \coordinate (#8_corner_fr) at (\offsetX+\layerDepth, -\widthHalf+\offsetZ, \widthHalf+\offsetY); % 正面右下
    \coordinate (#8_corner_tl) at (\offsetX, \widthHalf+\offsetZ, \widthHalf+\offsetY);         % 正面上左
    \coordinate (#8_corner_tr) at (\offsetX+\layerDepth, \widthHalf+\offsetZ, \widthHalf+\offsetY); % 正面上右

    % 前層からの接続線描画
    \ifnum \value{linkListCount}>0
        \foreach \src in \linkList {
            \draw[line width=0.5pt] (\src)--(#8_center_back);
        }
    \fi

    % キューブの輪郭描画
    \draw[line width=0.4pt] (#8_corner_fl) -- (#8_corner_fr) -- (#8_corner_tr) -- (#8_corner_tl) -- cycle;
    \draw[line width=0.4pt] (#8_corner_fl) -- (#8_corner_bl);
    \draw[line width=0.4pt] (#8_corner_fr) -- (#8_corner_br);
    \draw[line width=0.4pt] (#8_corner_tl) -- (\offsetX+\layerDepth/2, \widthHalf+\offsetZ, -\widthHalf+\offsetY);
    
    % ラベルの配置
    \node[below] at (#8_corner_fl) {\layerLabel};
}

このマクロを使用すると、複雑なパラメータ設定を簡略化できます。以下は、入力層からエンコーダ、デコーダを経て出力に至る U-Net 類似構造を描画する完全なコード例です。

完成された CNN アーキテクチャ図
\begin{tikzpicture}
    % スタート地点の定義
    \drawCubeLayer{3.5}{0.05}{0}{0}{0}{gray!60}{}{input}{}

    % エンコーダパス
    \drawCubeLayer{3.0}{0.2}{0.3}{0}{0}{white}{conv_a}{}{}
    \drawCubeLayer{2.5}{0.4}{0.3}{0}{0}{white}{pool_1}{{conv_a}}
    
    % 特徴融合の例
    \drawCubeLayer{2.0}{0.8}{0.3}{0}{0}{blue!20}{merge}{}{}

    % デコーダパスおよび最終出力
    \drawCubeLayer{2.0}{0.8}{0.3}{0}{0}{white}{deconv_a}{{merge}}
    \drawCubeLayer{3.0}{0.1}{0.3}{0}{0}{green!40}{output}{{deconv_a}}
\end{tikzpicture>

各キューブは相対的なオフセット計算によって自動的に配置されます。特に複数の入力を結合する場合(Feature Fusion)、`linkList` 引数に参照先の ID を渡すことで、適切な連結線が生成されるよう設計されています。

参考資源

より高度なサンプルやライブラリについては、以下の GitHub リポジトリなどが参考になります。

  • PlotNeuralNet: https://github.com/HarisIqbal88/PlotNeuralNet
  • SimpleCVReproduction: https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn
  • Overleaf Project Samples: 公式テンプレートを参照

タグ: LaTeX tikz DeepLearning Visualization ComputerVision

9月23日 23:44 投稿