需要帮助来改进基本神经网络的graphviz渲染

时间:2013-03-31 20:01:27

标签: neural-network graphviz

我尝试使用Graphviz来获取基本神经网络状态的图片。输入层有14个神经元,输出层只有一个神经元。可以选择隐藏层的数量以及每层内的神经元数量。通常,只有一个隐藏层。虽然这个层中的神经元数量可能相当大(如1000)。但是,出于演示目的,我只需要5个神经元(我意识到我永远不会得到数百个神经元的有用图片)。我想:

  • 写下每个神经元之间边缘(连接)的重量
  • 根据重量
  • 修改边缘的厚度
  • 可能标记每一层

关于厚度,我知道我可以使用" penwidth"。我也知道集群,它可以帮助限制每一层并标记它们。到目前为止,我的主要问题是输入层(14个神经元)和隐藏层之间有太多边缘,Graphiz可以产生清晰的图像。如果我添加标签来显示连接的权重,那就更糟了。 我认为在输入和隐藏图层之间放置更多空间可以提高渲染的可读性,但我没有找到如何做到这一点,尽管进行了长时间的研究。

以下是目前的样子: Current rendering of the neural network, without weights

以下是此图片后面自动生成的点代码:

digraph graphname {
0.0 -> 1.0;
0.1 -> 1.0;
0.2 -> 1.0;
0.3 -> 1.0;
0.4 -> 1.0;
0.5 -> 1.0;
0.6 -> 1.0;
0.7 -> 1.0;
0.8 -> 1.0;
0.9 -> 1.0;
0.10 -> 1.0;
0.11 -> 1.0;
0.12 -> 1.0;
0.13 -> 1.0;
0.0 -> 1.1;
0.1 -> 1.1;
0.2 -> 1.1;
0.3 -> 1.1;
0.4 -> 1.1;
0.5 -> 1.1;
0.6 -> 1.1;
0.7 -> 1.1;
0.8 -> 1.1;
0.9 -> 1.1;
0.10 -> 1.1;
0.11 -> 1.1;
0.12 -> 1.1;
0.13 -> 1.1;
0.0 -> 1.2;
0.1 -> 1.2;
0.2 -> 1.2;
0.3 -> 1.2;
0.4 -> 1.2;
0.5 -> 1.2;
0.6 -> 1.2;
0.7 -> 1.2;
0.8 -> 1.2;
0.9 -> 1.2;
0.10 -> 1.2;
0.11 -> 1.2;
0.12 -> 1.2;
0.13 -> 1.2;
0.0 -> 1.3;
0.1 -> 1.3;
0.2 -> 1.3;
0.3 -> 1.3;
0.4 -> 1.3;
0.5 -> 1.3;
0.6 -> 1.3;
0.7 -> 1.3;
0.8 -> 1.3;
0.9 -> 1.3;
0.10 -> 1.3;
0.11 -> 1.3;
0.12 -> 1.3;
0.13 -> 1.3;
0.0 -> 1.4;
0.1 -> 1.4;
0.2 -> 1.4;
0.3 -> 1.4;
0.4 -> 1.4;
0.5 -> 1.4;
0.6 -> 1.4;
0.7 -> 1.4;
0.8 -> 1.4;
0.9 -> 1.4;
0.10 -> 1.4;
0.11 -> 1.4;
0.12 -> 1.4;
0.13 -> 1.4;
1.0 -> 2.0;
1.1 -> 2.0;
1.2 -> 2.0;
1.3 -> 2.0;
1.4 -> 2.0;
}

在此代码中,神经元以这种方式编号:LAYER_NUMBER.NEURON_NUMBER。 请注意,神经元在图片中没有以正确的顺序出现,这个问题我也没有解决......

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这是一个包含一些不同想法的图表:

ranksep增加了“排名”之间的距离。 保证金使节点更大。 (可能有更好的方法来做到这一点。)

为每个节点着色并使该节点的每个边都使用相同的色调。为了便于阅读,您可以使节点更轻,并使该色调的边缘更暗。不要担心使用颜色名称,因为它支持#rrggbb表示法。

我发现使用这样的颜色大大增加了复杂图形的视觉清晰度。在着色时跟踪边缘要容易得多,如果某些东西的重量很轻,它可能会变得难以看见或完全看不见。

这种着色的另一个好处是它可以回应染色真实神经元的方法。见灵感http://neuroimages.tumblr.com

digraph graphname {
graph [rankdir="LR" ranksep="3.0"]
node [style=filled];
edge [penwidth="0.5" color="#e0e0e0"];

0.1 [fillcolor="cadetblue"];
0.2 [fillcolor="coral"];
0.3 [fillcolor="green"];
0.4 [fillcolor="gold"];
0.6 [fillcolor="cyan"];

1.0 [margin=0.4];
1.1 [margin=0.4];
1.2 [margin=0.4];
1.3 [margin=0.4];
1.4 [margin=0.4];

0.0 -> 1.0;
0.1 -> 1.0 [color="cadetblue1" penwidth="1"];
0.2 -> 1.0 [color="coral2" penwidth="2"];
0.3 -> 1.0 [color="green3" penwidth="6"];
0.4 -> 1.0 [color="gold4" penwidth="8"];
0.5 -> 1.0;
0.6 -> 1.0;
0.7 -> 1.0;
0.8 -> 1.0;
0.9 -> 1.0;
0.10 -> 1.0;
0.11 -> 1.0;
0.12 -> 1.0;
0.13 -> 1.0;
0.0 -> 1.1;
0.1 -> 1.1 [color="cadetblue2" penwidth="2"];
0.2 -> 1.1 [color="coral3" penwidth="5"];
0.3 -> 1.1 [color="green4" penwidth="8"];
0.4 -> 1.1; 
0.5 -> 1.1 [color="cyan1" penwidth="1"];
0.6 -> 1.1;
0.7 -> 1.1;
0.8 -> 1.1;
0.9 -> 1.1;
0.10 -> 1.1;
0.11 -> 1.1;
0.12 -> 1.1;
0.13 -> 1.1;
0.0 -> 1.2;
0.1 -> 1.2 [color="cadetblue3"  penwidth="3"];
0.2 -> 1.2 [color="coral4"  penwidth="6"];
0.3 -> 1.2;
0.4 -> 1.2 [color="gold1" penwidth="1"];
0.5 -> 1.2 [color="cyan2" penwidth="2"];
0.6 -> 1.2;
0.7 -> 1.2;
0.8 -> 1.2;
0.9 -> 1.2;
0.10 -> 1.2;
0.11 -> 1.2;
0.12 -> 1.2;
0.13 -> 1.2;
0.0 -> 1.3;
0.1 -> 1.3 [color="cadetblue4" penwidth="4"];
0.2 -> 1.3;
0.3 -> 1.3 [color="green1" penwidth="1"];
0.4 -> 1.3 [color="gold2" penwidth="2"];
0.5 -> 1.3 [color="cyan3" penwidth="3"];
0.6 -> 1.3;
0.7 -> 1.3;
0.8 -> 1.3;
0.9 -> 1.3;
0.10 -> 1.3;
0.11 -> 1.3;
0.12 -> 1.3;
0.13 -> 1.3;
0.0 -> 1.4;
0.1 -> 1.4 [color="cadetblue4"  penwidth="2"];
0.2 -> 1.4 [color="coral4" penwidth="2"];
0.3 -> 1.4 [color="green4" penwidth="2"];
0.4 -> 1.4 [color="gold4" penwidth="2"];
0.5 -> 1.4 [color="cyan4" penwidth="2"];
0.6 -> 1.4;
0.7 -> 1.4;
0.8 -> 1.4;
0.9 -> 1.4;
0.10 -> 1.4;
0.11 -> 1.4;
0.12 -> 1.4;
0.13 -> 1.4;
1.0 -> 2.0;
1.1 -> 2.0;
1.2 -> 2.0;
1.3 -> 2.0;
1.4 -> 2.0;
}