From e2f8217f924053f852a9cec61bb37c7ff39f5589 Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sun, 27 Nov 2016 17:58:56 +0100 Subject: [PATCH] Add conv layer visualization --- tikz/convolution-layer/Makefile | 31 ++++++++++ tikz/convolution-layer/README.md | 3 + tikz/convolution-layer/convolution-layer.png | Bin 0 -> 29094 bytes tikz/convolution-layer/convolution-layer.tex | 59 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 tikz/convolution-layer/Makefile create mode 100644 tikz/convolution-layer/README.md create mode 100644 tikz/convolution-layer/convolution-layer.png create mode 100644 tikz/convolution-layer/convolution-layer.tex diff --git a/tikz/convolution-layer/Makefile b/tikz/convolution-layer/Makefile new file mode 100644 index 0000000..824d962 --- /dev/null +++ b/tikz/convolution-layer/Makefile @@ -0,0 +1,31 @@ +SOURCE = convolution-layer +DELAY = 80 +DENSITY = 300 +WIDTH = 512 + +make: + pdflatex $(SOURCE).tex -output-format=pdf + make clean + +clean: + rm -rf $(TARGET) *.class *.html *.log *.aux *.data *.gnuplot + +gif: + pdfcrop $(SOURCE).pdf + convert -verbose -delay $(DELAY) -loop 0 -density $(DENSITY) $(SOURCE)-crop.pdf $(SOURCE).gif + make clean + +png: + make + make svg + inkscape $(SOURCE).svg -w $(WIDTH) --export-png=$(SOURCE).png + +transparentGif: + convert $(SOURCE).pdf -transparent white result.gif + make clean + +svg: + #inkscape $(SOURCE).pdf --export-plain-svg=$(SOURCE).svg + pdf2svg $(SOURCE).pdf $(SOURCE).svg + # Necessary, as pdf2svg does not always create valid svgs: + inkscape $(SOURCE).svg --export-plain-svg=$(SOURCE).svg diff --git a/tikz/convolution-layer/README.md b/tikz/convolution-layer/README.md new file mode 100644 index 0000000..010411e --- /dev/null +++ b/tikz/convolution-layer/README.md @@ -0,0 +1,3 @@ +Compiled example +---------------- +![Example](convolution-layer.png) diff --git a/tikz/convolution-layer/convolution-layer.png b/tikz/convolution-layer/convolution-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4da38f210e13d9f03190f96af294cd3de5d956 GIT binary patch literal 29094 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 literal 0 HcmV?d00001 diff --git a/tikz/convolution-layer/convolution-layer.tex b/tikz/convolution-layer/convolution-layer.tex new file mode 100644 index 0000000..eec1565 --- /dev/null +++ b/tikz/convolution-layer/convolution-layer.tex @@ -0,0 +1,59 @@ +\documentclass{standalone} +\usepackage{amssymb} +\usepackage{tikz} +\usetikzlibrary{arrows.meta} +\usetikzlibrary{decorations.pathreplacing} + +\begin{document} +\newcommand{\distance}{6} +\newcommand{\xup}{3.5} +\newcommand{\yup}{6} +\newcommand{\upsizex}{1} +\newcommand{\upsizey}{2} +\newcommand{\upshift}{3/4*\upsizey} +\newcommand{\distancedots}{1} + +\begin{tikzpicture} + % Print input feature maps + \foreach \i in {0, 0.2, ..., 0.6} { + \draw[fill=white] (0+\i, 0) -- (2+\i, 3) -- (2+\i, 7) -- (\i, 4) -- (\i, 0); + } + + % Print filters + \foreach \i in {0, 0.2, ..., 0.6, 1.3} { + \draw[fill=white] (\xup+\i, \yup) -- (\xup+\upsizex+\i, \yup+\upshift) -- (\xup+\upsizex+\i, \yup+\upsizey+\upshift) -- (\xup+\i, \yup+\upsizey) -- (\xup+\i, \yup); + \draw[fill=white] (\xup+\i, \yup) -- (\xup+\i+0.1, \yup) -- (\xup+\i+0.1, \yup+\upsizey) -- (\xup+\i, \yup+\upsizey) -- (\xup+\i, \yup); + \draw[fill=white] (\xup+\i+0.1, \yup) -- (\xup+\upsizex+\i+0.1, \yup+\upshift) -- (\xup+\upsizex+\i+0.1, \yup+\upsizey+\upshift) -- (\xup+\i+0.1, \yup+\upsizey) -- (\xup+\i+0.1, \yup); + \draw[fill=white] (\xup+\i, \yup+\upsizey) -- (\xup+\i+0.1, \yup+\upsizey) -- (\xup+\upsizex+\i+0.1, \yup+\upsizey+\upshift) -- (\xup+\upsizex+\i, \yup+\upsizey+\upshift) -- (\xup+\i, \yup+\upsizey); + } + + \foreach \i in {0, 0.2, ..., 0.6, 1.2} { + \draw[fill=white] (\distance+\i, 0) -- (\distance+2+\i, 3) -- (\distance+2+\i, 7) -- (\distance+\i, 4) -- (\distance+\i, 0); + } + + \draw [decorate,decoration={brace,amplitude=+4pt,mirror},xshift=0pt,yshift=-2pt] +(-0.1,0) -- (0.7,0) node [black,midway,yshift=-0.6cm, align=center] {\footnotesize$3$ feature maps\\\footnotesize(e.g. RGB)}; + \draw [decorate,decoration={brace,amplitude=+4pt,mirror},xshift=0pt,yshift=-2pt] +(\distance-0.1,0) -- (\distance+1.3,0) node [black,midway,yshift=-0.6cm, align=center] {\footnotesize$n$ feature maps}; + \draw [decorate,decoration={brace,amplitude=+4pt},xshift=0pt,yshift=+2pt] +(\xup-0.1+\upsizex,\yup+\upsizey+\upshift) -- (\xup+1.5+\upsizex,\yup+\upsizey+\upshift) node [black,midway,yshift=+0.6cm, align=center] {\footnotesize $n$ filters of\\\footnotesize size $3\times 3 \times 3$}; + \draw[very thick, ->,>=latex] (3, 4.5) [out=70, in=110] to (\distance-0.5, 4.5); + \draw [color=white,decorate,decoration={brace,amplitude=+4pt, mirror},xshift=0pt,yshift=+2pt] +(1.1, 0) -- (3.1, 3) node [sloped,black,midway,yshift=+0.6cm, align=center] {width $w$}; + \draw [color=white,decorate,decoration={brace,amplitude=+4pt, mirror},xshift=0pt,yshift=+2pt] +(\distance+1.7, 0) -- (\distance+3.7, 3) node [sloped,black,midway,yshift=+0.6cm, align=center] {width $w$}; + \draw [decorate,decoration={brace,amplitude=+4pt},xshift=-2pt,yshift=0pt] +(0, 0) -- (0, 4) node [sloped,black,midway,yshift=+0.6cm, align=center] {height $h$}; + \draw [decorate,decoration={brace,amplitude=+4pt},xshift=-2pt,yshift=0pt] +(\distance, 0) -- (\distance, 4) node [sloped,black,midway,yshift=+0.6cm, align=center] {height $h$}; + \node at (-2.5,7) {\Large network}; + \node at (-2.5,2) {\Large data}; + \node at (\distance+0.95,3.9) {\dots}; + \node at (\distance+0.95,2) {\dots}; + \node at (\distance+0.95,0.1) {\dots}; + + \node at (\xup+1.05,\yup+1.9) {\dots}; + \node at (\xup+1.05,\yup+1.0) {\dots}; + \node at (\xup+1.05,\yup+0.1) {\dots}; +\end{tikzpicture} +\end{document}