From 96b641bc269c6685a7871b27009f98099ea3941d Mon Sep 17 00:00:00 2001 From: Haris Iqbal Date: Wed, 12 Sep 2018 17:13:15 +0200 Subject: [PATCH] Initialize --- examples/HED/HED.pdf | Bin 0 -> 25359 bytes examples/HED/HED.tex | 107 ++++++++++++++++++++ examples/SoftmaxLoss/SoftmaxLoss.pdf | Bin 0 -> 61133 bytes examples/SoftmaxLoss/SoftmaxLoss.tex | 49 ++++++++++ examples/VGG16/vgg16.pdf | Bin 0 -> 24004 bytes examples/VGG16/vgg16.tex | 57 +++++++++++ examples/fcn-DT/fcn-DT.pdf | Bin 0 -> 31251 bytes examples/fcn-DT/fcn-DT.tex | 140 +++++++++++++++++++++++++++ examples/fcn8s/fcn8.pdf | Bin 0 -> 25775 bytes examples/fcn8s/fcn8.tex | 87 +++++++++++++++++ layers/Conv.sty | 55 +++++++++++ layers/ConvRelu.sty | 63 ++++++++++++ layers/ConvReluPool.sty | 69 +++++++++++++ layers/Deconv.sty | 58 +++++++++++ layers/DomainTransform.sty | 64 ++++++++++++ layers/FullyConnected.sty | 55 +++++++++++ layers/FullyConnectedRelu.sty | 61 ++++++++++++ layers/GenericSequentialLayer.sty | 58 +++++++++++ layers/Multiply.sty | 42 ++++++++ layers/SigmaSum.sty | 42 ++++++++ layers/Sum.sty | 42 ++++++++ layers/Up.sty | 58 +++++++++++ layers/init.tex | 32 ++++++ layers/texput.log | 21 ++++ 24 files changed, 1160 insertions(+) create mode 100644 examples/HED/HED.pdf create mode 100644 examples/HED/HED.tex create mode 100644 examples/SoftmaxLoss/SoftmaxLoss.pdf create mode 100644 examples/SoftmaxLoss/SoftmaxLoss.tex create mode 100644 examples/VGG16/vgg16.pdf create mode 100644 examples/VGG16/vgg16.tex create mode 100644 examples/fcn-DT/fcn-DT.pdf create mode 100644 examples/fcn-DT/fcn-DT.tex create mode 100644 examples/fcn8s/fcn8.pdf create mode 100644 examples/fcn8s/fcn8.tex create mode 100644 layers/Conv.sty create mode 100644 layers/ConvRelu.sty create mode 100644 layers/ConvReluPool.sty create mode 100644 layers/Deconv.sty create mode 100644 layers/DomainTransform.sty create mode 100644 layers/FullyConnected.sty create mode 100644 layers/FullyConnectedRelu.sty create mode 100644 layers/GenericSequentialLayer.sty create mode 100644 layers/Multiply.sty create mode 100644 layers/SigmaSum.sty create mode 100644 layers/Sum.sty create mode 100644 layers/Up.sty create mode 100644 layers/init.tex create mode 100644 layers/texput.log diff --git a/examples/HED/HED.pdf b/examples/HED/HED.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c72a146ba8d4a06515e341182da1955403db59a3 GIT binary patch literal 25359 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%0D|+X<}Ia< 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 N6M#%ZBc&pZ{9g$2R#yN3 literal 0 HcmV?d00001 diff --git a/examples/HED/HED.tex b/examples/HED/HED.tex new file mode 100644 index 0000000..dace597 --- /dev/null +++ b/examples/HED/HED.tex @@ -0,0 +1,107 @@ +\documentclass[border=15pt, multi, tikz]{standalone} +%\usepackage{blocks} +\usepackage{import} +\subimport{../../layers/}{init} +\usetikzlibrary{positioning} + +\newcommand{\midarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw=\edgecolor] (-0.3,0) -- ++(0.3,0);} + +\begin{document} +\begin{tikzpicture} +\tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down},draw=\edgecolor,opacity=0.7] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw Layer Blocks +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% conv1_1,conv1_2,pool1 +\pic[shift={(0,0,0)}] at (0,0,0) {ConvReluPool={blockname=crp1,% + numFilters={{"64","64","32"}},height=40,width={2,2},depth=40,zlabel=I}}; +% conv2_1,conv2_2,pool2 +\pic[shift={(2.1,0,0)}] at (crp1-east) {ConvReluPool={blockname=crp2,% + numFilters={{"128","128"}},height=35,width={3,3},depth=35,zlabel=I/2}}; +%% conv3_1,conv3_2,conv3_3,pool3 +\pic[shift={(2,0,0)}] at (crp2-east) {ConvReluPool={blockname=crp3,% + numFilters={{"256","256","256"}},height=30,width={4,4,4},depth=30,zlabel=I/4}}; +%% conv4_1,conv4_2,conv4_3,pool4 +\pic[shift={(1.8,0,0)}] at (crp3-east) {ConvReluPool={blockname=crp4,% + numFilters={{"512","512","512"}},height=23,width={7,7,7},depth=23,zlabel=I/8}}; +%% conv5_1,conv5_2,conv5_3,pool5 +\pic[shift={(1.5,0,0)}] at (crp4-east) {ConvRelu={blockname=crp5,% + numFilters={{"512","512","512"}},height=15,width={7,7,7},depth=15,zlabel=I/16}}; +%% score32 +\pic[shift={(1,0,0)}] at (crp5-east) {Conv={blockname=score32,% + numFilters={{"21","4096"}},height=15,width=1,depth=15,zlabel=I/16}}; + +%% Upsampling Deconv Layer +\pic[shift={(2,0,0)}] at (score32-east) {Deconv={blockname=up32,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-16) +%% score16 +\pic[shift={(0,0,10)}] at (crp5-anchor) {Conv={blockname=score16,% + numFilters={{"1","4096"}},height=20,width=1,depth=20,zlabel=I/8}}; +%% Upsampling Deconv Layer +\pic[shift={(0.5,0,0)}] at (up32-west) {Deconv={blockname=up16,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-8) +%% score8 +\pic[shift={(1,0,14)}] at (crp4-anchor) {Conv={blockname=score8,% + numFilters={{"1","4096"}},height=25,width=1,depth=25,zlabel=I/4}}; + +%% Upsampling Deconv Layer +\pic[shift={(0.5,0,0)}] at (up16-west) {Deconv={blockname=up8,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-4) +%% score8 +\pic[shift={(0,0,18)}] at (crp3-east) {Conv={blockname=score4,% + numFilters={{"1","4096"}},height=30,width=1,depth=30,zlabel=I/2}}; +%% Upsampling Deconv Layer +\pic[shift={(0.5,0,0)}] at (up8-west) {Deconv={blockname=up4,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-2) +%% score8 +\pic[shift={(0,0,22)}] at (crp2-east) {Conv={blockname=score2,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=I}}; +%% Upsampling Deconv Layer +\pic[shift={(0.5,0,0)}] at (up4-west) {Deconv={blockname=up2,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=I}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Final convolution +\pic[shift={(3,0,0)}] at (up2-east) {Conv={blockname=output,% + numFilters={{"1","4096"}},height=33,width=1,depth=33,zlabel=I}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw connections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\draw [connection] (crp1-east) -- node {\midarrow} (crp2-west); +\draw [connection] (crp2-east) -- node {\midarrow} (crp3-west); +\draw [connection] (crp3-east) -- node {\midarrow} (crp4-west); +\draw [connection] (crp4-east) -- node {\midarrow} (crp5-west); +\draw [connection] (crp5-east) -- node {\midarrow} (score32-west); +\draw [connection] (score32-east) -- node {\midarrow} (up32-west); + +\path (crp4-east) -- (crp5-west) coordinate[pos=0.4] (between4_5) ; +\draw [connection] (between4_5) -- node {\midarrow} ++(0,0,10) -- node {\midarrow} (score16-west); +\draw [connection] (score16-east) -- node{\midarrow}++(6,0,0)-- node{\midarrow}(up16-out); + +\path (crp3-east) -- (crp4-west) coordinate[pos=0.4] (between3_4) ; +\draw [connection] (between3_4) -- node {\midarrow} ++(0,0,14) -- node {\midarrow} (score8-west); +\draw [connection] (score8-east) -- node{\midarrow}++(11.55,0,0)-- node{\midarrow}(up8-out); + +\path (crp2-east) -- (crp3-west) coordinate[pos=0.4] (between2_3) ; +\draw [connection] (between2_3) -- node {\midarrow} ++(0,0,18) -- node {\midarrow} (score4-west); +\draw [connection] (score4-east) -- node{\midarrow}++(17.3,0,0)-- node{\midarrow}(up4-out); + +\path (crp1-east) -- (crp2-west) coordinate[pos=0.4] (between1_2) ; +\draw [connection] (between1_2) -- node {\midarrow} ++(0,0,22) -- node {\midarrow} (score2-west); +\draw [connection] (score2-east) -- node{\midarrow}++(22.7,0,0)-- node{\midarrow}(up2-out); + +\draw [connection] (up2-east) -- node {\midarrow} (output-west); + +\draw [connection] (output-east) -- node {\midarrow} ++(,0,0); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\end{tikzpicture} +\end{document}\grid diff --git a/examples/SoftmaxLoss/SoftmaxLoss.pdf b/examples/SoftmaxLoss/SoftmaxLoss.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd240367d4131ecc778f8229147d7be18cd6bc60 GIT binary patch literal 61133 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 literal 0 HcmV?d00001 diff --git a/examples/SoftmaxLoss/SoftmaxLoss.tex b/examples/SoftmaxLoss/SoftmaxLoss.tex new file mode 100644 index 0000000..c9f9ff9 --- /dev/null +++ b/examples/SoftmaxLoss/SoftmaxLoss.tex @@ -0,0 +1,49 @@ +\documentclass[border=15pt, multi, tikz]{standalone} +%\usepackage{blocks} +\usepackage{import} +\subimport{../../layers/}{init} +\usetikzlibrary{positioning} + +\newcommand{\midarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw=\edgecolor] (-0.3,0) -- ++(0.3,0);} +\newcommand{\up}{0.25} +\newcommand{\down}{0.25} +\newcommand{\arrowlength}{4} + +\begin{document} +\begin{tikzpicture} +\tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down},draw=\edgecolor,opacity=0.7] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw Layer Blocks +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% conv1_1,conv1_2,pool1 +\pic[shift={(0,0,0)},fill={rgb:blue,1.5;red,3.5;green,3.5;white,5}] at (0,0,0) {GenericSequentialLayer={blockname=crp1,% + numFilters={{" ",""}},height=20,width={7},depth=20, blocklabel=SoftmaxLoss: $E_\mathcal{S}$ ,ylabel= ,zlabel= }}; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw connections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\draw [connection] (crp1-east)++(0,\up,0) -- node {\midarrow} ++(\arrowlength.0,0) +node [anchor=south east,scale=2.1]{$E_\mathcal{S} [p;\theta]$}; +\draw (crp1-west)++(0,\up,0) coordinate (crp1-west-up); +\draw [connection] (crp1-west-up)++(-\arrowlength,0,0) +node[anchor=south west,scale=2.1]{$p(x^{(t)})$} +-- node {\midarrow} (crp1-west-up); + +\draw [connection] (crp1-west)++(0,-\down,0) -- node {\midarrow} ++(-\arrowlength.0,0) +node[anchor=north west,inner sep = 10, xshift=-25,scale=2.3] +{ + $\frac{\partial L}{\partial E_\mathcal{S}}\frac{\partial E_\mathcal{S}}{\partial p}$ +}; +\draw (crp1-east)++(0,-\down,0) coordinate (crp1-east-down); +\draw [connection] (crp1-east-down)++(\arrowlength,0,0) +node[anchor=north east,inner sep = 10, xshift=25,scale=2.3] +{ + $\frac{\partial L}{\partial E_\mathcal{S}} = \lambda_\mathcal{S}$ +} +-- node {\midarrow} (crp1-east-down); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\end{tikzpicture} +\end{document} diff --git a/examples/VGG16/vgg16.pdf b/examples/VGG16/vgg16.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e835834af05e7a1dfaae457088da765467ff42b GIT binary patch literal 24004 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%0DxGV?9Or1Z^8$ecFj58^@mLsbXa0 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 literal 0 HcmV?d00001 diff --git a/examples/VGG16/vgg16.tex b/examples/VGG16/vgg16.tex new file mode 100644 index 0000000..ccd5688 --- /dev/null +++ b/examples/VGG16/vgg16.tex @@ -0,0 +1,57 @@ +\documentclass[border=15pt, multi, tikz]{standalone} +%\usepackage{blocks} +\usepackage{import} +\subimport{../../layers/}{init} +\usetikzlibrary{positioning} + +\newcommand{\midarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw=\edgecolor] (-0.3,0) -- ++(0.3,0);} +\begin{document} +\begin{tikzpicture} +\tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down},draw=\edgecolor,opacity=0.7] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw Layer Blocks +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% conv1_1,conv1_2,pool1 +\pic[shift={(0,0,0)}] at (0,0,0) {ConvReluPool={blockname=crp1,% + numFilters={{"64","64","32"}},height=40,width={2,2},depth=40,ylabel=224,zlabel=224}}; +% conv2_1,conv2_2,pool2 +\pic[shift={(2.1,0,0)}] at (crp1-east) {ConvReluPool={blockname=crp2,% + numFilters={{"128","128"}},height=35,width={3,3},depth=35,ylabel=112,zlabel=112}}; +%% conv3_1,conv3_2,conv3_3,pool3 +\pic[shift={(2,0,0)}] at (crp2-east) {ConvReluPool={blockname=crp3,% + numFilters={{"256","256","256"}},height=30,width={4,4,4},depth=30,ylabel=56,zlabel=56}}; +%% conv4_1,conv4_2,conv4_3,pool4 +\pic[shift={(1.8,0,0)}] at (crp3-east) {ConvReluPool={blockname=crp4,% + numFilters={{"512","512","512"}},height=23,width={7,7,7},depth=23,ylabel=28,zlabel=28}}; +%% conv5_1,conv5_2,conv5_3,pool5 +\pic[shift={(1.5,0,0)}] at (crp4-east) {ConvReluPool={blockname=crp5,% + numFilters={{"512","512","512"}},height=15,width={7,7,7},depth=15,ylabel=14,zlabel=14}}; +%% fc6, +\pic[shift={(1.2,0,0)}] at (crp5-east) {FullyConnectedRelu={blockname=fc6,% + numFilters={{"4096","dummy"}},height=10,width={10},depth=10,ylabel=7,zlabel=7}}; +%% fc7 +\pic[shift={(1,0,0)}] at (fc6-east) {FullyConnectedRelu={blockname=fc7,% + numFilters={{"4096","dummy"}},height=3,width={10},depth=3,ylabel= ,zlabel=1 }}; + +%% fc8 +\pic[shift={(1,0,0)}] at (fc7-east) {FullyConnected={blockname=fc8,% + numFilters={{"K","dummy"}},height=3,width=7,depth=3,ylabel=,zlabel=1}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Output +%% Softmax +%\pic[shift={(1,0,0)}] at (elt2-east) {Deconv={blockname=up8,% +% numFilters={{"21","4096"}},height=35,width=1,depth=35,zlabel=I}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw connections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\draw [connection] (crp1-east) -- node {\midarrow} (crp2-west); +\draw [connection] (crp2-east) -- node {\midarrow} (crp3-west); +\draw [connection] (crp3-east) -- node {\midarrow} (crp4-west); +\draw [connection] (crp4-east) -- node {\midarrow} (crp5-west); +\draw [connection] (crp5-east) -- node {\midarrow} (fc6-west); +\draw [connection] (fc6-east) -- node {\midarrow} (fc7-west); +\draw [connection] (fc7-east) -- node {\midarrow} (fc8-west); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\end{tikzpicture} +\end{document} diff --git a/examples/fcn-DT/fcn-DT.pdf b/examples/fcn-DT/fcn-DT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ddba1f99c1b0472b51d6ff5f2db2b991ea9c1373 GIT binary patch literal 31251 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 Fe*izP)dK(k literal 0 HcmV?d00001 diff --git a/examples/fcn-DT/fcn-DT.tex b/examples/fcn-DT/fcn-DT.tex new file mode 100644 index 0000000..d88816c --- /dev/null +++ b/examples/fcn-DT/fcn-DT.tex @@ -0,0 +1,140 @@ +\documentclass[border=15pt, multi, tikz]{standalone} +%\usepackage{blocks} +\usepackage{import} +\subimport{../../layers/}{init} +\usetikzlibrary{positioning} + +\tikzstyle{connection1}=[ultra thick,every node/.style={sloped,allow upside down},draw={rgb:blue,0;red,4;green,2;white,0},opacity=0.7] + +\newcommand{\localmidarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw={rgb:blue,0;red,4;green,2;white,0}] (-0.3,0) -- ++(0.3,0);} + +\begin{document} +\begin{tikzpicture} +\tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down},draw=\edgecolor,opacity=0.7] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw ConvNet Layers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% conv1_1,conv1_2,pool1 +\pic[shift={(0,0,0)}] at (0,0,0) {ConvReluPool={blockname=crp1,% + numFilters={{"64","64","32"}},height=40,width={2,2},depth=40,zlabel=I}}; +% conv2_1,conv2_2,pool2 +\pic[shift={(2.1,0,0)}] at (crp1-east) {ConvReluPool={blockname=crp2,% + numFilters={{"128","128"}},height=35,width={3,3},depth=35,zlabel=I/2}}; +%% conv3_1,conv3_2,conv3_3,pool3 +\pic[shift={(2,0,0)}] at (crp2-east) {ConvReluPool={blockname=crp3,% + numFilters={{"256","256","256"}},height=30,width={4,4,4},depth=30,zlabel=I/4}}; +%% conv4_1,conv4_2,conv4_3,pool4 +\pic[shift={(1.5,0,0)}] at (crp3-east) {ConvReluPool={blockname=crp4,% + numFilters={{"512","512","512"}},height=23,width={7,7,7},depth=23,zlabel=I/8}}; +%% conv5_1,conv5_2,conv5_3,pool5 +\pic[shift={(1.5,0,0)}] at (crp4-east) {ConvReluPool={blockname=crp5,% + numFilters={{"512","512","512"}},height=15,width={7,7,7},depth=15,zlabel=I/16}}; +%% fc6, fc7 +\pic[shift={(1.2,0,0)}] at (crp5-east) {ConvRelu={blockname=cp6_7,% + numFilters={{"4096","4096"}},height=10,width={10,10},depth=10,zlabel=I/32}}; +%% score32 +\pic[shift={(1,0,0)}] at (cp6_7-east) {Conv={blockname=score32,% + numFilters={{"21","4096"}},height=10,width=1,depth=10,zlabel=I/32}}; +%% Upsampling Deconv Layer +\pic[shift={(2,0,0)}] at (score32-east) {Deconv={blockname=up16,% + numFilters={{"21","4096"}},height=40,width=1,depth=40,zlabel=I}}; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw Edge Layers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% upsampling crp2 x2 +\pic[shift={(-0.75,-8,0)}] at (crp2-anchor) {Deconv={blockname=crp2_upx2,% + numFilters={{"bilinear x2","4096"}},height=7.5,width=7.5,depth=7.5,zlabel=}}; +%% upsampling crp3 x4 +\pic[shift={(-0.75,-8,0)}] at (crp3-anchor) {Deconv={blockname=crp3_upx4,% + numFilters={{"bilinear x4","4096"}},height=7.5,width=7.5,depth=7.5,zlabel=}}; + +%% edge +\pic[shift={(7,-11,0)}] at (crp4-west) {Conv={blockname=edge,% + numFilters={{"1x1 conv","4096"}}, height=30,width=1,depth=30,zlabel=I}}; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Domain Transform Module +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\pic[shift={(5,0,0)},fill={rgb:blue,1;red,2;green,4;white,7}] at (up16-east) {DomainTransform={blockname=diff1,% + numFilters={{"21","4096"}},height=40,width=1,depth=40,zlabel=}}; + +\pic[shift={(2,0,0)},fill={rgb:blue,1;red,2;green,4;white,7}] at (diff1-east) {DomainTransform={blockname=diff2,% + numFilters={{"21","4096"}},height=40,width=1,depth=40,zlabel=}}; + +\pic[shift={(2,0,0)},fill={rgb:blue,1;red,2;green,4;white,7}] at (diff2-east) {DomainTransform={blockname=diff3,% + numFilters={{"21","4096"}},height=40,width=1,depth=40,zlabel=}}; + +\pic[shift={(2,0,0)},fill={rgb:blue,1;red,2;green,4;white,7}] at (diff3-east) {DomainTransform={blockname=diff4,% + numFilters={{"21","4096"}},height=40,width=1,depth=40,zlabel=}}; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Arrows on Domain Transform +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\draw [connection1] (diff1-anchor)+(0,3,3) -- node{ } ++(0,3,-3); +\draw [connection1] (diff1-anchor)+(0,3,3)-- node{\localmidarrow} ++(0,3,2.9); +\draw [connection1] (diff1-anchor)+(0,3,-2.9) -- node{\localmidarrow} ++(0,3,-3); + +\draw [connection1] (diff1-anchor)+(0,2,3) -- node{ } ++(0,2,-3); +\draw [connection1] (diff1-anchor)+(0,2,3)-- node{\localmidarrow} ++(0,2,2.9); +\draw [connection1] (diff1-anchor)+(0,2,-2.9) -- node{\localmidarrow} ++(0,2,-3); +%%%%%%%%%%%%%%%%%% +\draw [connection1] (diff2-anchor)+(0,-3,-3) -- node{ } ++(0,-3,3); +\draw [connection1] (diff2-anchor)+(0,-3,-3)-- node{\localmidarrow} ++(0,-3,-2.9); +\draw [connection1] (diff2-anchor)+(0,-3,2.9) -- node{\localmidarrow} ++(0,-3,3); + +\draw [connection1] (diff2-anchor)+(0,-2,-3) -- node{ } ++(0,-2,3); +\draw [connection1] (diff2-anchor)+(0,-2,-3)-- node{\localmidarrow} ++(0,-2,-2.9); +\draw [connection1] (diff2-anchor)+(0,-2,2.9) -- node{\localmidarrow} ++(0,-2,3); +%%%%%%%%%%%%%%%%%% +\draw [connection1] (diff3-anchor)+(0,3,3) -- node{ } ++(0,-3,3); +\draw [connection1] (diff3-anchor)+(0,3,3)-- node{\localmidarrow} ++(0,2.9,3); +\draw [connection1] (diff3-anchor)+(0,-2.9,3) -- node{\localmidarrow} ++(0,-3,3); + +\draw [connection1] (diff3-anchor)+(0,3,2) -- node{ } ++(0,-3,2); +\draw [connection1] (diff3-anchor)+(0,3,2)-- node{\localmidarrow} ++(0,2.9,2); +\draw [connection1] (diff3-anchor)+(0,-2.9,2) -- node{\localmidarrow} ++(0,-3,2); +%%%%%%%%%%%%%%%%%% +\draw [connection1] (diff4-anchor)+(0,-3,-3) -- node{ } ++(0,3,-3); +\draw [connection1] (diff4-anchor)+(0,-3,-3)-- node{\localmidarrow} ++(0,-2.9,-3); +\draw [connection1] (diff4-anchor)+(0,2.9,-3) -- node{\localmidarrow} ++(0,3,-3); + +\draw [connection1] (diff4-anchor)+(0,-3,-2) -- node{ } ++(0,3,-2); +\draw [connection1] (diff4-anchor)+(0,-3,-2)-- node{\localmidarrow} ++(0,-2.9,-2); +\draw [connection1] (diff4-anchor)+(0,2.9,-2) -- node{\localmidarrow} ++(0,3,-2); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw connections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ConvNet Connections\draw [connection] (crp1-east) -- node {\midarrow} (crp2-west); +\draw [connection] (crp2-east) -- node {\midarrow} (crp3-west); +\draw [connection] (crp3-east) -- node {\midarrow} (crp4-west); +\draw [connection] (crp4-east) -- node {\midarrow} (crp5-west); +\draw [connection] (crp5-east) -- node {\midarrow} (cp6_7-west); +\draw [connection] (cp6_7-east) -- node {\midarrow} (score32-west); +\draw [connection] (score32-east) -- node {\midarrow} (up16-west); +% Diffusion Block internal connections +\draw [connection] (up16-east) -- node {\midarrow} (diff1-west); +\draw [connection] (diff1-east) -- node {\midarrow} (diff2-west); +\draw [connection] (diff2-east) -- node {\midarrow} (diff3-west); +\draw [connection] (diff3-east) -- node {\midarrow} (diff4-west); +\draw [connection] (diff4-east) -- node {\midarrow} ++(2,0,0); + +% EdgeNet Input Connections +\draw [connection](crp1-south)--node {\midarrow}(edge-west-|crp1-south)--node {\midarrow}(edge-west-|crp2-south); +\draw [connection](crp2-south)--node {\midarrow}(crp2_upx2-north); +\draw [connection](crp2_upx2-south)--node {\midarrow}(edge-west-|crp2-south)--node {\midarrow}(edge-west-|crp3-south); +\draw [connection](crp3-south)--node {\midarrow}(crp3_upx4-north); +\draw [connection](crp3_upx4-south)--node {\midarrow}(edge-west-|crp3-south)--node {\midarrow}(edge-west); +% EdgeNet Output Connections +\draw [connection](edge-east) +node[anchor=south west,inner sep = 10, yshift=-20, xshift=180,scale=2.3]{Edges} +--node {\midarrow}(diff4-south |-edge-east)--node {\midarrow}(diff4-south); +\draw [connection](diff3-south |-edge-east)--node {\midarrow}(diff3-south); +\draw [connection](diff2-south |-edge-east)--node {\midarrow}(diff2-south); +\draw [connection](diff1-south |-edge-east)--node {\midarrow}(diff1-south); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\end{tikzpicture} +\end{document} diff --git a/examples/fcn8s/fcn8.pdf b/examples/fcn8s/fcn8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ff823a33512d9855b4117fb56c216371fa47f16 GIT binary patch literal 25775 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 XCl?Q=xA1WB^6+w@($Pt)%Ao!iK|s%2 literal 0 HcmV?d00001 diff --git a/examples/fcn8s/fcn8.tex b/examples/fcn8s/fcn8.tex new file mode 100644 index 0000000..261a12b --- /dev/null +++ b/examples/fcn8s/fcn8.tex @@ -0,0 +1,87 @@ +\documentclass[border=15pt, multi, tikz]{standalone} +%\usepackage{blocks} +\usepackage{import} +\subimport{../../layers/}{init} +\usetikzlibrary{positioning} + +\newcommand{\midarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw=\edgecolor] (-0.3,0) -- ++(0.3,0);} +\begin{document} +\begin{tikzpicture} +\tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down},draw=\edgecolor,opacity=0.7] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw Layer Blocks +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% conv1_1,conv1_2,pool1 +\pic[shift={(0,0,0)}] at (0,0,0) {ConvReluPool={blockname=crp1,% + numFilters={{"64","64","32"}},height=40,width={2,2},depth=40,zlabel=I}}; +% conv2_1,conv2_2,pool2 +\pic[shift={(2.1,0,0)}] at (crp1-east) {ConvReluPool={blockname=crp2,% + numFilters={{"128","128"}},height=35,width={3,3},depth=35,zlabel=I/2}}; +%% conv3_1,conv3_2,conv3_3,pool3 +\pic[shift={(2,0,0)}] at (crp2-east) {ConvReluPool={blockname=crp3,% + numFilters={{"256","256","256"}},height=30,width={4,4,4},depth=30,zlabel=I/4}}; +%% conv4_1,conv4_2,conv4_3,pool4 +\pic[shift={(1.8,0,0)}] at (crp3-east) {ConvReluPool={blockname=crp4,% + numFilters={{"512","512","512"}},height=23,width={7,7,7},depth=23,zlabel=I/8}}; +%% conv5_1,conv5_2,conv5_3,pool5 +\pic[shift={(1.5,0,0)}] at (crp4-east) {ConvReluPool={blockname=crp5,% + numFilters={{"512","512","512"}},height=15,width={7,7,7},depth=15,zlabel=I/16}}; +%% fc6, fc7 +\pic[shift={(1.2,0,0)}] at (crp5-east) {ConvRelu={blockname=cp6_7,% + numFilters={{"4096","4096"}},height=10,width={10,10},depth=10,zlabel=I/32}}; +%% score32 +\pic[shift={(1,0,0)}] at (cp6_7-east) {Conv={blockname=score32,% + numFilters={{"1","4096"}},height=10,width=1,depth=10,zlabel=I/32}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-16) +%% Upsampling Deconv Layer +\pic[shift={(1,0,0)}] at (score32-east) {Deconv={blockname=up32,% + numFilters={{"1","4096"}},height=15,width=1,depth=15,zlabel=I/16}}; +%% score16 +\pic[shift={(0,-4,0)}] at (up32-west) {Conv={blockname=score16,% + numFilters={{"1","4096"}},height=15,width=1,depth=15,zlabel=I/16}}; +%% Elementwise sum between score16 and up32 +\pic[shift={(1.5,0,0)}] at (up32-east) {Sum={blockname=elt1,% + numFilters={{"1","4096"}},height=15,width=1,depth=15,zlabel=I/16}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Joining with previous streams (fcn-8) +%% Upsampling Deconv Layer +\pic[shift={(1,0,0)}] at (elt1-east) {Deconv={blockname=up16,% + numFilters={{"1","4096"}},height=20,width=1,depth=20,zlabel=I/8}}; +%% score8 +\pic[shift={(0,-7,0)}] at (up16-west) {Conv={blockname=score8,% + numFilters={{"1","4096"}},height=20,width=1,depth=20,zlabel=I/8}}; +%% Elementwise sum between score8 and up16 +\pic[shift={(1.5,0,0)}] at (up16-east) {Sum={blockname=elt2,% + numFilters={{"1","4096"}},height=20,width=1,depth=20,zlabel=I/8}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Output +%% Upsampling to original image size +\pic[shift={(1,0,0)}] at (elt2-east) {Deconv={blockname=up8,% + numFilters={{"1","4096"}},height=35,width=1,depth=35,zlabel=I}}; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Draw connections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\draw [connection] (crp1-east) -- node {\midarrow} (crp2-west); +\draw [connection] (crp2-east) -- node {\midarrow} (crp3-west); +\draw [connection] (crp3-east) -- node {\midarrow} (crp4-west); +\draw [connection] (crp4-east) -- node {\midarrow} (crp5-west); +\draw [connection] (crp5-east) -- node {\midarrow} (cp6_7-west); +\draw [connection] (cp6_7-east) -- node {\midarrow} (score32-west); +\draw [connection] (score32-east) -- node {\midarrow} (up32-west); + +\path (crp4-east) -- (crp5-west) coordinate[pos=0.25] (between4_5) ; +\draw [connection] (between4_5) -- node {\midarrow} (score16-west-|between4_5) -- node {\midarrow} (score16-west); +\draw [connection] (up32-east) -- node {\midarrow} (elt1-west); +\draw [connection] (score16-east) -- node {\midarrow} (score16-east -| elt1-south) -- node {\midarrow} (elt1-south); +\draw [connection] (elt1-east) -- node {\midarrow} (up16-west); + +\path (crp3-east) -- (crp4-west) coordinate[pos=0.25] (between3_4) ; +\draw [connection] (between3_4) -- node {\midarrow} (score8-west-|between3_4) -- node {\midarrow} (score8-west); +\draw [connection] (up16-east) -- node {\midarrow} (elt2-west); +\draw [connection] (score8-east) -- node {\midarrow} (score8-east -| elt2-south)-- node {\midarrow} (elt2-south); +\draw [connection] (elt2-east) -- node {\midarrow} (up8-west); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\end{tikzpicture} +\end{document}\grid diff --git a/layers/Conv.sty b/layers/Conv.sty new file mode 100644 index 0000000..1981139 --- /dev/null +++ b/layers/Conv.sty @@ -0,0 +1,55 @@ +\ProvidesPackage{Conv} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw conv combination +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{Conv/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [conv] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [conv] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale, 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} diff --git a/layers/ConvRelu.sty b/layers/ConvRelu.sty new file mode 100644 index 0000000..9f217ea --- /dev/null +++ b/layers/ConvRelu.sty @@ -0,0 +1,63 @@ +\ProvidesPackage{ConvRelu} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw convRelu +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\tikzset{ConvRelu/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [relu] + (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x/3,0,0) coordinate (a1) -- ++(0,-\cubescale*\cubey,0) coordinate (b1) -- ++(\cubescale*\x/3,0,0) coordinate (c) -- cycle + (d) -- (a1) -- ++(0,0,-\cubescale*\cubez) coordinate (h1) -- ++(+\cubescale*\x/3,0,0) coordinate (e) -- cycle; +\draw [conv] + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- (c) -- cycle + (d) -- (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [conv] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + %(0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + % Black Label name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (d)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale, 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +%\draw (0.5*\SecondLastLayerOriginX*\cubescale , -\cubescale*\cubey/2 , -\cubescale*\cubez/2) coordinate (\cubeblockname-center); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=dsdasfkdas, +blockname=a, +} + diff --git a/layers/ConvReluPool.sty b/layers/ConvReluPool.sty new file mode 100644 index 0000000..d2bc8c4 --- /dev/null +++ b/layers/ConvReluPool.sty @@ -0,0 +1,69 @@ +\ProvidesPackage{ConvReluPool} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw convRelu+pooling combination +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{ConvReluPool/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [relu] + (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x/3,0,0) coordinate (a1) -- ++(0,-\cubescale*\cubey,0) coordinate (b1) -- ++(\cubescale*\x/3,0,0) coordinate (c) -- cycle + (d) -- (a1) -- ++(0,0,-\cubescale*\cubez) coordinate (h1) -- ++(+\cubescale*\x/3,0,0) coordinate (e) -- cycle; +\draw [conv] + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- (c) -- cycle + (d) -- (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +% Pooling layer +\draw [pool] + (\SecondLastLayerOriginX*\cubescale +1*\cubescale,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-1*\cubescale,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(1*\cubescale,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) edge (g) -- (c) -- cycle + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- (e) -- cycle; + +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + %(d) edge ["\bf\cubeblockname"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (e) + + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + %(0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (d)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale + 1*\cubescale , 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +%\draw (0.5*\SecondLastLayerOriginX*\cubescale , -\cubescale*\cubey/2 , -\cubescale*\cubez/2) coordinate (\cubeblockname-center); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +\path (\cubeblockname-anchor) -- ++(0,\cubescale*\cubey/2,0) coordinate (\cubeblockname-north); +\path (\cubeblockname-anchor) -- ++(0,-\cubescale*\cubey/2,0) coordinate (\cubeblockname-south); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} diff --git a/layers/Deconv.sty b/layers/Deconv.sty new file mode 100644 index 0000000..cf98ad3 --- /dev/null +++ b/layers/Deconv.sty @@ -0,0 +1,58 @@ +\ProvidesPackage{Deconv} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw Deconvolution layer +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{Deconv/.pic={\tikzset{/block/.cd,#1} +% deconv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [deconv] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [deconv] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale, 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +\path (\cubeblockname-anchor) -- ++(0,\cubescale*\cubey/2,0) coordinate (\cubeblockname-north); +\path (\cubeblockname-anchor) -- ++(0,-\cubescale*\cubey/2,0) coordinate (\cubeblockname-south); + +\path (\cubeblockname-anchor) -- ++(0,0,\cubescale*\cubez/2) coordinate (\cubeblockname-out); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} diff --git a/layers/DomainTransform.sty b/layers/DomainTransform.sty new file mode 100644 index 0000000..7e15afa --- /dev/null +++ b/layers/DomainTransform.sty @@ -0,0 +1,64 @@ +\ProvidesPackage{DomainTransform} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw generic sequential layer +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\tikzset{DomainTransform/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [layer] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [layer] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale + 2*\cubescale , 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +\path (\cubeblockname-anchor) -- ++(0,\cubescale*\cubey/2,0) coordinate (\cubeblockname-north); +\path (\cubeblockname-anchor) -- ++(0,-\cubescale*\cubey/2,0) coordinate (\cubeblockname-south); + + + +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} + diff --git a/layers/FullyConnected.sty b/layers/FullyConnected.sty new file mode 100644 index 0000000..3fe83ba --- /dev/null +++ b/layers/FullyConnected.sty @@ -0,0 +1,55 @@ +\ProvidesPackage{FullyConnected} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw conv combination +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{FullyConnected/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [fullyconn] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [fullyconn] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale + 2*\cubescale , 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} diff --git a/layers/FullyConnectedRelu.sty b/layers/FullyConnectedRelu.sty new file mode 100644 index 0000000..caeb796 --- /dev/null +++ b/layers/FullyConnectedRelu.sty @@ -0,0 +1,61 @@ +\ProvidesPackage{FullyConnectedRelu} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw fully connected +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{FullyConnectedRelu/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [fullyrelu] + (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x/3,0,0) coordinate (a1) -- ++(0,-\cubescale*\cubey,0) coordinate (b1) -- ++(\cubescale*\x/3,0,0) coordinate (c) -- cycle + (d) -- (a1) -- ++(0,0,-\cubescale*\cubez) coordinate (h1) -- ++(+\cubescale*\x/3,0,0) coordinate (e) -- cycle; +\draw [fullyconn] + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- (c) -- cycle + (d) -- (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [fullyconn] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale, 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +%\draw (0.5*\SecondLastLayerOriginX*\cubescale , -\cubescale*\cubey/2 , -\cubescale*\cubez/2) coordinate (\cubeblockname-center); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} + diff --git a/layers/GenericSequentialLayer.sty b/layers/GenericSequentialLayer.sty new file mode 100644 index 0000000..cbebf98 --- /dev/null +++ b/layers/GenericSequentialLayer.sty @@ -0,0 +1,58 @@ +\ProvidesPackage{GenericSequentialLayer} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw generic sequential layer +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{GenericSequentialLayer/.pic={\tikzset{/block/.cd,#1} +% conv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [layer] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [layer] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale + 2*\cubescale , 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +\path (\cubeblockname-anchor) -- ++(0,\cubescale*\cubey/2,0) coordinate (\cubeblockname-north); +\path (\cubeblockname-anchor) -- ++(0,-\cubescale*\cubey/2,0) coordinate (\cubeblockname-south); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} + diff --git a/layers/Multiply.sty b/layers/Multiply.sty new file mode 100644 index 0000000..28b493d --- /dev/null +++ b/layers/Multiply.sty @@ -0,0 +1,42 @@ +\ProvidesPackage{Multiply} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw Elementwise operations +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\tikzset{Multiply/.pic={\tikzset{/block/.cd,#1} + +\draw (0,0,0) circle (\SphereRadius); + +\draw (0,0,0) coordinate (\cubeblockname-anchor); +\draw (\SphereRadius,0,0) coordinate (\cubeblockname-east); +\draw (-\SphereRadius,0,0) coordinate (\cubeblockname-west); +\draw (0,\SphereRadius,0) coordinate (\cubeblockname-north); +\draw (0,-\SphereRadius,0) coordinate (\cubeblockname-south); + +\draw[very thick] (-2*\SphereRadius/4,-2*\SphereRadius/4,0) -- (2*\SphereRadius/4,2*\SphereRadius/4,0); +\draw[very thick] (2*\SphereRadius/4,-2*\SphereRadius/4,0) -- (-2*\SphereRadius/4,2*\SphereRadius/4,0); + +\shade[ball color=blue,opacity=0.30] (0,0,0) circle (\SphereRadius); + +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +radius/.store in=\SphereRadius, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +radius=0.5, +blocklabel=, +blockname=, +} diff --git a/layers/SigmaSum.sty b/layers/SigmaSum.sty new file mode 100644 index 0000000..694512c --- /dev/null +++ b/layers/SigmaSum.sty @@ -0,0 +1,42 @@ +\ProvidesPackage{SigmaSum} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw Reduction sum operations +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\tikzset{SigmaSum/.pic={\tikzset{/block/.cd,#1} + +\draw (0,0,0) circle [radius=\SphereRadius] node[scale=4*\SphereRadius] {$\Sigma$}; + +\draw (0,0,0) coordinate (\cubeblockname-anchor); +\draw (\SphereRadius,0,0) coordinate (\cubeblockname-east); +\draw (-\SphereRadius,0,0) coordinate (\cubeblockname-west); +\draw (0,\SphereRadius,0) coordinate (\cubeblockname-north); +\draw (0,-\SphereRadius,0) coordinate (\cubeblockname-south); + +%\draw[very thick] (-2*\SphereRadius/4,-2*\SphereRadius/4,0) -- (2*\SphereRadius/4,2*\SphereRadius/4,0); +%\draw [very thick] (c1-east)++(0,\up,0) node [anchor=south west, inner sep = 10, xshift=10,scale=1.2]{$p_{i,j}^{(k)} - p_{(i+\Delta i),(j+\Delta j)}^{(k)}$} -- node {\midarrow} (abs1-west-up); + +\shade[ball color=green,opacity=0.30] (0,0,0) circle (\SphereRadius); + +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +radius/.store in=\SphereRadius, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +radius=0.5, +blocklabel=, +blockname=, +} diff --git a/layers/Sum.sty b/layers/Sum.sty new file mode 100644 index 0000000..d99c2fc --- /dev/null +++ b/layers/Sum.sty @@ -0,0 +1,42 @@ +\ProvidesPackage{Sum} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw Elementwise operations +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\tikzset{Sum/.pic={\tikzset{/block/.cd,#1} + +\draw (0,0,0) circle (\SphereRadius); + +\draw (0,0,0) coordinate (\cubeblockname-anchor); +\draw (\SphereRadius,0,0) coordinate (\cubeblockname-east); +\draw (-\SphereRadius,0,0) coordinate (\cubeblockname-west); +\draw (0,\SphereRadius,0) coordinate (\cubeblockname-north); +\draw (0,-\SphereRadius,0) coordinate (\cubeblockname-south); + +\draw[very thick] (-2*\SphereRadius/4,0,0) -- (2*\SphereRadius/4,0,0); +\draw[very thick] (0,-2*\SphereRadius/4,0) -- (0,2*\SphereRadius/4,0); + +\shade[ball color=blue,opacity=0.30] (0,0,0) circle (\SphereRadius); + +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +radius/.store in=\SphereRadius, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +radius=0.5, +blocklabel=, +blockname=, +} diff --git a/layers/Up.sty b/layers/Up.sty new file mode 100644 index 0000000..d8f455b --- /dev/null +++ b/layers/Up.sty @@ -0,0 +1,58 @@ +\ProvidesPackage{Up} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%This Block can draw Deconvolution layer +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\tikzset{Up/.pic={\tikzset{/block/.cd,#1} +% deconv layers +\foreach \x [ count=\i,evaluate=\x as \numfilters using {array({\cubexlabel},\i-1)}, evaluate=\x as \k using {\x+\prev}, remember=\k as \prev (initially 0)] in \cubex +{ +\draw [up] (\k*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(-\cubescale*\x,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\x,0,0) coordinate (c) -- cycle + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) edge coordinate[pos=1] (f) ++(0,-\cubescale*\cubey,0) (f) edge (g) + (d) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (h) edge (g) -- ++(+\cubescale*\x,0,0) coordinate (e) -- cycle; +% labelling each conv layer with number of filters in each layer +\path [every edge/.append style={pic actions}] + (b) edge ["\numfilters"',midway] (b -| c); +\xdef\SecondLastLayerOriginX{\k} %making value of \k available after the loop as well +} +\draw [up] + (\SecondLastLayerOriginX*\cubescale ,\cubescale*\cubey/2 , \cubescale*\cubez/2) coordinate + (d) -- ++(0,0,-\cubescale*\cubez) coordinate (e) -- ++(0,-\cubescale*\cubey,0) coordinate (f) -- (c) -- cycle ; +% Labelling the block +\path [every edge/.append style={pic actions}] + % name or size of depth dimension + (c) edge ["\small\cubezlabel"',pos=0,text width=14*\cubescale*\cubez,text centered,sloped] (f) + % name or size of height dimension + (0,0,\cubez*\cubescale/2) coordinate (o) edge ["\cubeylabel",midway] (o |- o) + % Block name + (0,-\cubey*\cubescale/2,+\cubez*\cubescale/2) coordinate (o)+(0,-20pt) coordinate (o1) edge ["\textcolor{black}{ \bf \cubeblocklabel}"',midway,white] (o1 -| c) ; + +\draw (\SecondLastLayerOriginX*\cubescale, 0,0) coordinate (\cubeblockname-east); +\draw (0,0,0) coordinate (\cubeblockname-west); +\path (\cubeblockname-west) -- (\cubeblockname-east) coordinate[pos=0.5] (\cubeblockname-anchor); +\path (\cubeblockname-anchor) -- ++(0,\cubescale*\cubey/2,0) coordinate (\cubeblockname-north); +\path (\cubeblockname-anchor) -- ++(0,-\cubescale*\cubey/2,0) coordinate (\cubeblockname-south); + +\path (\cubeblockname-anchor) -- ++(0,0,\cubescale*\cubez/2) coordinate (\cubeblockname-out); +}, +/block/.search also={/tikz}, +/block/.cd, +width/.store in=\cubex, +height/.store in=\cubey, +depth/.store in=\cubez, +scale/.store in=\cubescale, +numFilters/.store in=\cubexlabel, +ylabel/.store in=\cubeylabel, +zlabel/.store in=\cubezlabel, +blocklabel/.store in=\cubeblocklabel, +blockname/.store in=\cubeblockname, +width=2, +height=13, +depth=15, +scale=.2, +numFilters=, +ylabel=, +zlabel=, +blocklabel=, +blockname=, +} diff --git a/layers/init.tex b/layers/init.tex new file mode 100644 index 0000000..c5be37a --- /dev/null +++ b/layers/init.tex @@ -0,0 +1,32 @@ +%\ProvidesPackage{init} +\usetikzlibrary{quotes,arrows.meta} +\usetikzlibrary{positioning} + +\newcommand*{\SecondLastLayerOriginX}{No value} +\def\edgecolor{rgb:blue,4;red,1;green,4;black,3} +\newcommand{\midarrow}{\tikz \draw[-Stealth,line width =0.8mm,draw=\edgecolor] (-0.3,0) -- ++(0.3,0);} + +\tikzstyle{conv} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.4, pic actions, fill={rgb:yellow,5;red,2.5;white,5}] +\tikzstyle{relu} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.6, pic actions, fill={rgb:yellow,5;red,5;white,4},draw={rgb:yellow,5;red,5;white,4}] +\tikzstyle{pool} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.6, pic actions, fill={rgb:red,1;black,0.3}]% colour coeff will be normalized to 1 +\tikzstyle{deconv}=[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.4, pic actions, fill={rgb:blue,5;green,2.5;white,5}] +\tikzstyle{up}=[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.5, pic actions, fill={rgb:blue,5;green,2.5;white,1}] +\tikzstyle{layer} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.4, pic actions] +\tikzstyle{fullyconn} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.4, pic actions, fill={rgb:blue,5;red,2.5;white,5}] +\tikzstyle{fullyrelu} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.6, pic actions, fill={rgb:blue,5;red,5;white,4},draw={rgb:blue,5;red,5;white,4}] +\tikzstyle{DT} =[every edge/.append style={pic actions, densely dashed, opacity=.7},fill opacity=0.4, pic actions, fill={rgb:blue,1;red,2;green,4;white,7}] + +\usepackage{ConvReluPool} +\usepackage{ConvRelu} +\usepackage{Conv} +\usepackage{Deconv} +\usepackage{Up} +%\usepackage{Eltwise} +\usepackage{Multiply} +\usepackage{Sum} +\usepackage{SigmaSum} +\usepackage{FullyConnected} +\usepackage{FullyConnectedRelu} +\usepackage{DomainTransform} +\usepackage{GenericSequentialLayer} + diff --git a/layers/texput.log b/layers/texput.log new file mode 100644 index 0000000..5390e16 --- /dev/null +++ b/layers/texput.log @@ -0,0 +1,21 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016/Debian) (preloaded format=pdflatex 2018.3.2) 28 MAR 2018 09:46 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**DomainTransform.tex + +! Emergency stop. +<*> DomainTransform.tex + +*** (job aborted, file error in nonstop mode) + + +Here is how much of TeX's memory you used: + 3 strings out of 493013 + 117 string characters out of 6135683 + 53262 words of memory out of 5000000 + 3649 multiletter control sequences out of 15000+600000 + 3640 words of font info for 14 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 0i,0n,0p,1b,6s stack positions out of 5000i,500n,10000p,200000b,80000s +! ==> Fatal error occurred, no output PDF file produced!