diff --git a/nnvm/python/nnvm/frontend/darknet.py b/nnvm/python/nnvm/frontend/darknet.py index bf3a16cdb23e19456b7297436f5aee456b9bf535..4da2e90bca42b5a5ea11a0dfc7371ad13c5857b1 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 d4d33a6949f31135cc30cc8947bab8d1bf0e8914..328ad2ae6a10fde506c9a8bf7f6d1d5a836db816 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 f836ca477ddad4d3be8eb8fe99a814b2e51f742f..1f5e89c6e4d5656beff771043b8cc93115b471ee 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()