You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by zh...@apache.org on 2018/07/02 20:59:13 UTC

[incubator-mxnet] branch master updated: [MXNET-210]give warning for variables with same name in graph visualization (#10429)

This is an automated email from the ASF dual-hosted git repository.

zhasheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/master by this push:
     new 7c74d1f  [MXNET-210]give warning for variables with same name in graph visualization (#10429)
7c74d1f is described below

commit 7c74d1f6367324258480e5b78bdadb1cfa557e6a
Author: Lai Wei <ro...@gmail.com>
AuthorDate: Mon Jul 2 13:59:07 2018 -0700

    [MXNET-210]give warning for variables with same name in graph visualization (#10429)
    
    * give warning for variables with same name in graph visualization
    
    * fix line too long
    
    * print repetead node names
    
    * update warning and unit test
    
    * add assert for repeated node
    
    * add graphviz for arm
    
    * update docker install
    
    * skip unittest if graphviz could not be imported
    
    * optimize imports
---
 python/mxnet/visualization.py     | 11 ++++++++++-
 tests/python/unittest/test_viz.py | 30 +++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/python/mxnet/visualization.py b/python/mxnet/visualization.py
index 2b9da15..fc6db1d 100644
--- a/python/mxnet/visualization.py
+++ b/python/mxnet/visualization.py
@@ -26,7 +26,7 @@ from __future__ import absolute_import
 import re
 import copy
 import json
-
+import warnings
 from .symbol import Symbol
 
 def _str2tuple(string):
@@ -252,6 +252,15 @@ def plot_network(symbol, title="plot", save_format='pdf', shape=None, node_attrs
         shape_dict = dict(zip(interals.list_outputs(), out_shapes))
     conf = json.loads(symbol.tojson())
     nodes = conf["nodes"]
+    # check if multiple nodes have the same name
+    if len(nodes) != len(set([node["name"] for node in nodes])):
+        seen_nodes = set()
+        # find all repeated names
+        repeated = set(node['name'] for node in nodes if node['name'] in seen_nodes
+                       or seen_nodes.add(node['name']))
+        warning_message = "There are multiple variables with the same name in your graph, " \
+                          "this may result in cyclic graph. Repeated names: " + ','.join(repeated)
+        warnings.warn(warning_message, RuntimeWarning)
     # default attributes of node
     node_attr = {"shape": "box", "fixedsize": "true",
                  "width": "1.3", "height": "0.8034", "style": "filled"}
diff --git a/tests/python/unittest/test_viz.py b/tests/python/unittest/test_viz.py
index 73cfa94..eb5921f 100644
--- a/tests/python/unittest/test_viz.py
+++ b/tests/python/unittest/test_viz.py
@@ -15,8 +15,12 @@
 # specific language governing permissions and limitations
 # under the License.
 
+import unittest
+import warnings
+
 import mxnet as mx
 
+
 def test_print_summary():
     data = mx.sym.Variable('data')
     bias = mx.sym.Variable('fc1_bias', lr_mult=1.0)
@@ -32,5 +36,29 @@ def test_print_summary():
     shape["data"]=(1,3,28,28)
     mx.viz.print_summary(sc1, shape)
 
+def graphviz_exists():
+    try:
+        import graphviz
+    except ImportError:
+        return False
+    else:
+        return True
+
+@unittest.skipIf(not graphviz_exists(), "Skip test_plot_network as Graphviz could not be imported")
+def test_plot_network():
+    # Test warnings for cyclic graph
+    net = mx.sym.Variable('data')
+    net = mx.sym.FullyConnected(data=net, name='fc', num_hidden=128)
+    net = mx.sym.Activation(data=net, name='relu1', act_type="relu")
+    net = mx.sym.FullyConnected(data=net, name='fc', num_hidden=10)
+    net = mx.sym.SoftmaxOutput(data=net, name='out')
+    with warnings.catch_warnings(record=True) as w:
+        digraph = mx.viz.plot_network(net, shape={'data': (100, 200)},
+                                      node_attrs={"fixedsize": "false"})
+    assert len(w) == 1
+    assert "There are multiple variables with the same name in your graph" in str(w[-1].message)
+    assert "fc" in str(w[-1].message)
+
 if __name__ == "__main__":
-    test_print_summary()
+    import nose
+    nose.runmodule()