我正在尝试使用神经网络包更改节点的边框颜色和主体颜色。我发现这很困难。我也想将箭头颜色更改为黑色。
\documentclass[border=5mm]{standalone}
\usepackage{xpatch}
\usepackage{neuralnetwork}
\begin{document}
%\tikzset{inputlayer/.style={line width=1pt, fill=black}}
\makeatletter
{\nn@nodecaption{\nn@layerindex}{}} {\nn@nodecaption{\nn@layerindex}{\nn@nodeindex}}{}{}
% define the nodeindex to be zero initially
\newcommand\nn@nodeindex{0}
\newcommand{\nodetextx}[2]{
\ifnum \nn@nodeindex=0
$\mathbf{c_1}$
\else
$i_{#2}$
\fi
}
\newcommand{\nodetextz}[2]{$o_1$}
\newcommand{\nodetexth}[2]{
\ifnum \nn@nodeindex=0
$\mathbf{c_2}$
\else
$h_{1, #2}$
\fi
}
\newcommand{\nodetexthto}[2]{
\ifnum \nn@nodeindex=0
$\mathbf{c_2}$
\else
$h_{2, #2}$
\fi
}
\newcommand{\nodetexthtoo}[2]{
\ifnum \nn@nodeindex=0
$\mathbf{c_2}$
\else
$h_{3, #2}$
\fi
}
\resizebox{1.5\columnwidth}{!}{%
\begin{neuralnetwork}[height=1.5 ,maintitleheight=1cm,layertitleheight=4cm,]
\inputlayer[count=8, bias=false, title={Input}, text=\nodetextx]
\hiddenlayer[count=5, bias=false, title={Dense1}, text=\nodetexth]
\linklayers
\hiddenlayer[count=5, bias=false, title={Dense2}, text=\nodetexthto]
\linklayers
\hiddenlayer[count=5, bias=false, title={Dense3}, text=\nodetexthtoo]
\linklayers
\outputlayer[count=3, title={Output}, text=\nodetextz]
\linklayers
\end{neuralnetwork}}
\end{document}
答案1
链接颜色很简单,有一个可选参数,\linklayers
您可以在其中指定要用于链接的几个键。其中之一是style
,它可以包含颜色(以及其他内容)。例如:
\linklayers[style=black]
有关链接键的更多信息,请参阅该软件包的 Github 页面在 README 文件末尾。
节点的颜色有点复杂,这是在包中硬编码的。例如,命令\hiddenlayer
在包中定义如下:
\newcommand{\hiddenlayer}[1][] { \layer[bias=true,nodeclass={hidden neuron},#1] }
这意味着\layer
将调用一个命令,并将nodeclass
键设置为hidden neuron
,并通过将任何其他参数添加到此\layer
命令#1
,如计数、标题和文本。nodeclasshidden neuron
定义如下,颜色为硬编码值:
\tikzstyle{hidden neuron}=[neuron, fill=blue!40];
因此,要改变颜色,一个解决方案是定义一个使用不同命令的新图层,nodeclass
在其中设置不同的颜色,如下所示:
\tikzstyle{hiddenorange}=[neuron, fill=orange];
\newcommand{\hiddenlayerorange}[1][] { \layer[bias=true,nodeclass={hiddenorange},#1] }
但是,这意味着您需要为每种颜色创建并使用新命令和新样式。为了更易于使用,可以将颜色参数作为图层的键给出。按照包的约定neuralnetwork
,定义键和存储键值的代码是:
\define@key{layer}{layercolor} {\def\nnlayercolor{#1}}
layercolor
这意味着作为命令参数给出的键\layer
将存储在宏中\nnlayercolor
。现在这个宏可以在样式中使用:
\makeatletter
\define@key{layer}{layercolor} {\def\nnlayercolor{#1}}
\makeatother
\tikzstyle{hiddencl}=[neuron, fill=\nnlayercolor]
\newcommand{\hiddenlayercolor}[1][] { \layer[bias=true,nodeclass={hiddencl},#1] }
注意\define@key
包含@
符号,因此命令必须被\makeatletter
和包围\makeatother
。
完整的 MWE(根据问题中给出的代码简化):
\documentclass{article}
\usepackage{neuralnetwork}
\newcommand{\nodetextx}[2]{$i_{#2}$}
\newcommand{\nodetextz}[2]{$o_#2$}
\newcommand{\nodetexth}[2]{$h_{#1,#2}$}
\begin{document}
\makeatletter
\define@key{layer}{layercolor} {\def\nnlayercolor{#1}}
\makeatother
\tikzstyle{hiddencl}=[neuron, fill=\nnlayercolor]
\newcommand{\hiddenlayercolor}[1][] { \layer[bias=true,nodeclass={hiddencl},#1] }
\resizebox{\textwidth}{!}{%
\begin{neuralnetwork}[height=1.5,maintitleheight=1cm,layertitleheight=4cm,]
\inputlayer[count=8, bias=false, title={Input}, text=\nodetextx]
\hiddenlayercolor[layercolor=orange!60, count=5, bias=false, title={Dense1}, text=\nodetexth]
\linklayers
\hiddenlayercolor[layercolor=purple!40, count=5, bias=false, title={Dense2}, text=\nodetexth]
\linklayers
\hiddenlayer[count=5, bias=false, title={Dense3}, text=\nodetexth]
\linklayers[style=black]
\outputlayer[count=3, title={Output}, text=\nodetextz]
\linklayers
\end{neuralnetwork}}
\end{document}
结果:
请注意,此代码使用了\tikzstyle
,它已被弃用,但该包使用它,所以我决定保留它作为这个答案。