From fe77223dee6e7bd43f2ec011627e3dce83c07bb4 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 9 Dec 2019 21:47:13 +0300 Subject: [PATCH] Modify nGraph's ConvolutionBackpropData and GroupConvolution --- modules/dnn/src/layers/convolution_layer.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/modules/dnn/src/layers/convolution_layer.cpp b/modules/dnn/src/layers/convolution_layer.cpp index 4d1fe5f..3b5a7d8 100644 --- a/modules/dnn/src/layers/convolution_layer.cpp +++ b/modules/dnn/src/layers/convolution_layer.cpp @@ -544,6 +544,12 @@ public: const int group = inpCn / inpGroupCn; std::vector kernel_shape = getShape(blobs[0]); + if (group != 1) + { + kernel_shape[0] /= group; + kernel_shape.insert(kernel_shape.begin(), group); + } + auto ieWeights = std::make_shared(ngraph::element::f32, kernel_shape, blobs[0].data); if (fusedWeights) { @@ -566,14 +572,12 @@ public: std::shared_ptr conv_node; if (group != 1) { - conv_node = std::make_shared( + conv_node = std::make_shared( ieInpNode, ieWeights, ngraph::Strides(strides), - ngraph::Strides(dilations), ngraph::CoordinateDiff(std::vector(pads_begin.begin(), pads_begin.end())), ngraph::CoordinateDiff(std::vector(pads_end.begin(), pads_end.end())), - ngraph::Strides{}, - group, + ngraph::Strides(dilations), pad_type); } else { conv_node = std::make_shared( @@ -2037,37 +2041,29 @@ public: Mat newWeights = blobs[0].reshape(1, inpCn); transpose(weightsMat, newWeights); } - size_t batch = ieInpNode->get_shape()[0]; - std::vector out_shape = {batch, (size_t)numOutput}; std::vector paddings_end; - std::vector inpShape = ieInpNode->get_shape(); if (padMode.empty()) { for (int i = 0; i < pads_end.size(); i++) { - out_shape.push_back(strides[i] * (inpShape[2 + i] - 1) + - kernel_size[i] - pads_begin[i] - pads_end[i] + adjust_pads[i]); paddings_end.push_back(pads_end[i] - adjust_pads[i]); } } else if (padMode == "SAME") { for (int i = 0; i < pads_begin.size(); i++) { - out_shape.push_back(strides[i] * (inpShape[2 + i] - 1) + 1 + adjust_pads[i]); paddings_end.push_back(kernel_size[i] - pads_begin[i] - 1 - adjust_pads[i]); } } else { paddings_end = pads_end; } - auto deconv = std::make_shared( - ngraph::Shape{out_shape}, - ieWeights, + auto deconv = std::make_shared( ieInpNode, + ieWeights, ngraph::Strides(strides), - ngraph::Strides(dilations), ngraph::CoordinateDiff(std::vector(pads_begin.begin(), pads_begin.end())), ngraph::CoordinateDiff(std::vector(paddings_end.begin(), paddings_end.end())), - (strides.size() == 2 ? ngraph::Strides{1, 1} : ngraph::Strides{1, 1, 1})); + ngraph::Strides(dilations)); if (hasBias() || fusedBias) { std::vector shape(deconv->get_shape().size(), 1); -- 2.7.4