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/06/29 02:15:47 UTC

[incubator-mxnet] branch master updated: support shared parameter in summary (#11379)

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 36f2aae  support shared parameter in summary (#11379)
36f2aae is described below

commit 36f2aae9fb97159d226f24c9b1f829eccc318c14
Author: Sheng Zha <sz...@users.noreply.github.com>
AuthorDate: Thu Jun 28 19:15:39 2018 -0700

    support shared parameter in summary (#11379)
---
 python/mxnet/gluon/block.py         | 10 ++++++++++
 tests/python/unittest/test_gluon.py |  4 ++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/python/mxnet/gluon/block.py b/python/mxnet/gluon/block.py
index 0ef2849..731d541 100644
--- a/python/mxnet/gluon/block.py
+++ b/python/mxnet/gluon/block.py
@@ -563,6 +563,7 @@ class Block(object):
             :class:`mxnet.ndarray.NDArray` is supported.
         """
         summary = OrderedDict()
+        seen = set()
         hooks = []
 
         def _get_shape_str(args):
@@ -611,9 +612,14 @@ class Block(object):
 
                 params = 0
                 summary[m_key]['trainable'] = 0
+                summary[m_key]['shared'] = 0
                 for p in block._reg_params.values():
                     params += p.data().size
                     summary[m_key]['trainable'] += 0 if p.grad_req == 'null' else p.data().size
+                    if p in seen:
+                        summary[m_key]['shared'] += p.data().size
+                    else:
+                        seen.add(p)
                 summary[m_key]['n_params'] = params
 
             from .nn.basic_layers import Sequential, HybridSequential
@@ -624,6 +630,7 @@ class Block(object):
         summary['Input']['output_shape'] = _get_shape_str(inputs)
         summary['Input']['n_params'] = 0
         summary['Input']['trainable'] = 0
+        summary['Input']['shared'] = 0
 
         try:
             self.apply(_register_summary_hook)
@@ -635,16 +642,19 @@ class Block(object):
             print('='*80)
             total_params = 0
             trainable_params = 0
+            shared_params = 0
             for layer in summary:
                 print(line_format.format(layer,
                                          str(summary[layer]['output_shape']),
                                          summary[layer]['n_params']))
                 total_params += summary[layer]['n_params']
                 trainable_params += summary[layer]['trainable']
+                shared_params += summary[layer]['shared']
             print('='*80)
             print('Total params: ' + str(total_params))
             print('Trainable params: ' + str(trainable_params))
             print('Non-trainable params: ' + str(total_params - trainable_params))
+            print('Shared params: ' + str(shared_params))
             print('-'*80)
         finally:
             for h in hooks:
diff --git a/tests/python/unittest/test_gluon.py b/tests/python/unittest/test_gluon.py
index 7fff6b8..d275cd6 100644
--- a/tests/python/unittest/test_gluon.py
+++ b/tests/python/unittest/test_gluon.py
@@ -1264,9 +1264,9 @@ def test_summary():
 
     net2 = nn.Sequential()
     with net2.name_scope():
-        net2.add(nn.Embedding(10, 20))
+        net2.add(nn.Embedding(40, 30))
         net2.add(gluon.rnn.LSTM(30))
-        net2.add(nn.Dense(40, flatten=False))
+        net2.add(nn.Dense(40, flatten=False, params=net2[0].params))
     net2.initialize()
     net2.summary(mx.nd.ones((80, 32)))