TikZ를 사용하여 컨볼루션 신경망 작성

TikZ를 사용하여 컨볼루션 신경망 작성

TikZ를 사용하여 그림에 이와 같은 CNN을 그리고 싶습니다. 어떤 아이디어가 있습니까?이것

답변1

이는 시작을 제공하기 위한 것입니다(전체 스크린 샷을 완전히 재현하려는 시도는 아닙니다). 이 답변은 이러한 블록을 매우 편리하게 생성할 수 있는 스타일과 함께 제공되므로 3d matrix항목만 작성하면 됩니다. 각 행렬에 다른 이름을 지정했는지 확인하십시오. 그렇지 않으면 한 행렬이 다른 행렬에서 블록 크기를 상속받을 수 있습니다. (또한 코드를 두 번 실행해야 합니다.) 또한 행렬과 특정 요소 사이에 화살표를 그리는 방법도 보여줍니다.

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

여기에 이미지 설명을 입력하세요

있다어떤 문제경로 구성 내부에 행렬을 추가하려고 할 때. 그래서 경로를 따라 좌표를 추가하고 이를 사용하여 행렬을 배치했습니다.

관련 정보