From 55d26ae8151846c5e8dc90b42064a1fadb51c40d Mon Sep 17 00:00:00 2001
From: Pariksheet Pinjari <pariksheet.pinjari@huawei.com>
Date: Thu, 25 Oct 2018 05:28:10 +0530
Subject: [PATCH] [Frontend][Darknet] L2 normalization support in darknet
 (#1916)

* l2 normalization

* retrigger CI
---
 nnvm/python/nnvm/frontend/darknet.py             | 12 ++++++++++++
 nnvm/python/nnvm/testing/darknet.py              |  1 +
 .../python/frontend/darknet/test_forward.py      | 16 +++++++++++++++-
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/nnvm/python/nnvm/frontend/darknet.py b/nnvm/python/nnvm/frontend/darknet.py
index bf3a16cdb..4da2e90bc 100644
--- a/nnvm/python/nnvm/frontend/darknet.py
+++ b/nnvm/python/nnvm/frontend/darknet.py
@@ -267,6 +267,13 @@ def _darknet_upsampling(inputs, attrs):
     new_attrs['scale'] = attrs.get('scale', 1)
     return _darknet_get_nnvm_op(op_name)(*inputs, **new_attrs), None
 
+def _darknet_l2normalize(inputs, attrs):
+    """Process the l2 normalization operation."""
+    op_name, new_attrs = 'l2_normalize', {}
+    new_attrs['eps'] = attrs.get('eps', 0)
+    new_attrs['axis'] = attrs.get('axis', 1)
+    return _darknet_get_nnvm_op(op_name)(*inputs, **new_attrs), None
+
 def _darknet_softmax_output(inputs, attrs):
     """Process the softmax operation."""
     temperature = attrs.get('temperature', 1)
@@ -370,6 +377,7 @@ _DARKNET_CONVERT_MAP = {
     LAYERTYPE.REGION          : _darknet_region,
     LAYERTYPE.SHORTCUT        : _darknet_shortcut,
     LAYERTYPE.UPSAMPLE        : _darknet_upsampling,
+    LAYERTYPE.L2NORM          : _darknet_l2normalize,
     LAYERTYPE.YOLO            : _darknet_yolo,
     LAYERTYPE.DETECTION       : _darknet_op_not_support,
     LAYERTYPE.CROP            : _darknet_op_not_support,
@@ -630,6 +638,10 @@ class GraphProto(object):
 
         elif LAYERTYPE.UPSAMPLE == layer.type:
             attr.update({'scale' : layer.stride})
+
+        elif LAYERTYPE.L2NORM == layer.type:
+            pass
+
         else:
             err = "Darknet layer type {} is not supported in nnvm.".format(layer.type)
             raise NotImplementedError(err)
diff --git a/nnvm/python/nnvm/testing/darknet.py b/nnvm/python/nnvm/testing/darknet.py
index d4d33a694..328ad2ae6 100644
--- a/nnvm/python/nnvm/testing/darknet.py
+++ b/nnvm/python/nnvm/testing/darknet.py
@@ -512,6 +512,7 @@ layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int ou
 layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam);
 layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam);
 layer make_upsample_layer(int batch, int w, int h, int c, int stride);
+layer make_l2norm_layer(int batch, int inputs);
 void free_network(network *net);
 """
                    )
diff --git a/nnvm/tests/python/frontend/darknet/test_forward.py b/nnvm/tests/python/frontend/darknet/test_forward.py
index f836ca477..1f5e89c6e 100644
--- a/nnvm/tests/python/frontend/darknet/test_forward.py
+++ b/nnvm/tests/python/frontend/darknet/test_forward.py
@@ -107,7 +107,7 @@ def test_forward(net, build_dtype='float32'):
                 out.insert(0, attributes)
                 out.insert(0, _read_memory_buffer((layer.total*2, ), layer.biases))
                 out.insert(0, _read_memory_buffer((layer.n, ), layer.mask, dtype='int32'))
-                layer_ou tshape = (layer.batch, layer.out_c,
+                layer_outshape = (layer.batch, layer.out_c,
                                   layer.out_h, layer.out_w)
                 out.insert(0, _read_memory_buffer(layer_outshape, layer.output))
             elif i == net.n-1:
@@ -361,6 +361,19 @@ def test_forward_upsample():
     test_forward(net)
     LIB.free_network(net)
 
+def test_forward_l2normalize():
+    '''test l2 normalization layer'''
+    net = LIB.make_network(1)
+    layer = LIB.make_l2norm_layer(1, 224*224*3)
+    layer.c = layer.out_c = 3
+    layer.h = layer.out_h = 224
+    layer.w = layer.out_w = 224
+    net.layers[0] = layer
+    net.w = net.h = 224
+    LIB.resize_network(net, 224, 224)
+    test_forward(net)
+    LIB.free_network(net)
+
 def test_forward_elu():
     '''test elu activation layer'''
     net = LIB.make_network(1)
@@ -520,6 +533,7 @@ if __name__ == '__main__':
     test_forward_region()
     test_forward_yolo_op()
     test_forward_upsample()
+    test_forward_l2normalize()
     test_forward_elu()
     test_forward_rnn()
     test_forward_crnn()
-- 
GitLab