无法使用神经网络包更改节点的颜色

无法使用神经网络包更改节点的颜色

在此处输入图片描述

我正在尝试使用神经网络包更改节点的边框颜色和主体颜色。我发现这很困难。我也想将箭头颜色更改为黑色。

\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,它已被弃用,但该包使用它,所以我决定保留它作为这个答案。

相关内容