TikZ を使用して畳み込みニューラル ネットワークを作成する

TikZ を使用して畳み込みニューラル ネットワークを作成する

TikZ を使用して、図のような CNN を描画したいのですが、何かアイデアはありますか?これ

答え1

これは、開始点を提供するためのものです (フルスクリーン ショットを完全に再現する試みではありません)。この回答には、3d matrixこれらのブロックを非常に簡単に作成できるスタイルが付属しており、エントリを入力するだけで済みます。各マトリックスに異なる名前を付けるようにしてください。そうしないと、1 つのマトリックスが別のマトリックスからブロック サイズを継承する可能性があります。(コードを 2 回実行する必要もあります)。マトリックスと特定の要素の間に矢印を描く方法も示します。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{eqparbox}
\usetikzlibrary{matrix,positioning,arrows.meta,bending}
\newbox\matrixcellbox
\tikzset{math center align per column/.style={nodes={execute at begin
 node={\setbox\matrixcellbox=\hbox\bgroup$},
 execute at end
 node={$\egroup\eqmakebox[\tikzmatrixname\the\pgfmatrixcurrentcolumn][c]{\copy\matrixcellbox}}}},
 math center align per matrix/.style={nodes={execute at begin
 node={\setbox\matrixcellbox=\hbox\bgroup$},
 execute at end
 node={$\egroup\eqmakebox[\tikzmatrixname][c]{\copy\matrixcellbox}}}},
 3d matrix/.style={matrix of nodes,nodes in empty cells,math center align per
 matrix,nodes={draw,anchor=center,outer sep=0pt,inner sep=1pt,
 text height={height("\raisebox{0.2ex}{A}")},text depth={depth("g")}},
 column sep=-\pgflinewidth,row sep=-\pgflinewidth,execute at end matrix={
 \foreach \XX in {1,...,\the\pgfmatrixcurrentcolumn}
 {\draw (\tikzmatrixname-1-\XX.north east) -- ++ (#1,#1);}
 \ifnum\the\pgfmatrixcurrentrow>1
 \foreach \XX in {1,...,\the\numexpr\the\pgfmatrixcurrentrow-1}
 {\draw (\tikzmatrixname-\XX-\the\pgfmatrixcurrentcolumn.south east) -- ++ (#1,#1);}
 \fi
 \draw (\tikzmatrixname-1-1.north west) -- ++ (#1,#1) -- 
  ([xshift=1ex,yshift=1ex]\tikzmatrixname-1-\the\pgfmatrixcurrentcolumn.north east) --
  ([xshift=1ex,yshift=1ex]\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east)  --
  (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east); 
 }},3d matrix/.default=1ex,
 Rightarrow/.style={double,double
     distance=#1,>={Implies[bend]},shorten <=0.4ex},Rightarrow/.default=1ex}
\begin{document}
\begin{tikzpicture}[node distance=4em]
 \node[3d matrix] (mat1){ 
    0 & 0 & 1 & 1 & 0 & 0 & -1 & -1 & 0 & 0 \\
 };
 \node[3d matrix,above=of mat1] (mat2){ 
    0 & 0 & 1 & 1 & 0 & 0 & -1 & -1 & 0 & 0\\
    0 & 0 & -1 & -1 & 0 & 0 & 1 & 1 & 0 & 0\\
 };
 \node[3d matrix,above=of mat2] (mat3){ 
    0 & 1 & 0 & -1 & 0 \\
    0 & -1 & 0 & 1 & 0 \\
 };
 \node[3d matrix,above=of mat3] (mat4){ 0 & -4 & 0 \\};
 \node[3d matrix,above=of mat4] (mat5){ 4 & -4 \\};
 \node[3d matrix,above=of mat5] (mat6){ 0.99 & 0.01 \\};
 \draw[-{Latex[bend]}] (mat1.east) to[out=0,in=0] 
  coordinate[near end](aux1) ([xshift=1ex]mat2-1-10.east);
 \path (aux1) node[right,above right,3d matrix]{-1 & 0 & 1\\}; 
 \draw[-{Latex[bend]}] (mat1.east) to[out=0,in=0] ([xshift=1ex]mat2-2-10.east);
 \draw[Rightarrow,->] (mat1) -- coordinate[midway,right=2em] (aux2) (mat2);
 \path (aux2) node[right,3d matrix] (mat1a){1 & 0 & -1 \\};
 \draw[Rightarrow,->] (mat2) -- (mat3);
 \draw[Rightarrow,->] (mat3) -- (mat4)
    coordinate[midway,right=1em] (aux3);
 \path (aux3) node[right,3d matrix] (mat3a){-1 & 0 & 1 \\
        1 & 0 & -1\\};
 \foreach \X in {1,2,3} {\foreach \Y in {1,2}
  {\draw[-latex] (mat4-1-\X) -- (mat5-1-\Y);}}
 \draw[Rightarrow,->] (mat5) -- (mat6);
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

がある何らかの問題パス構造内にマトリックスを追加しようとすると、パスに沿って座標を追加し、それを使用してマトリックスを配置します。

関連情報