From: Сергей Баранников/AI Tools Lab /SRR/Engineer/삼성전자 Date: Tue, 3 Sep 2019 17:06:46 +0000 (+0300) Subject: [mir_caffe] Do not insert Transposes (#7110) X-Git-Tag: accepted/tizen/unified/20190904.110638~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dbcf57f6bcebfa3b047f891c893dac4db1366075;p=platform%2Fcore%2Fml%2Fnnfw.git [mir_caffe] Do not insert Transposes (#7110) Remove insertion of Transpose operations, set the data format on operations instead. Signed-off-by: Sergei Barannikov --- diff --git a/compiler/mir-caffe-importer/caffe_op_creator.cpp b/compiler/mir-caffe-importer/caffe_op_creator.cpp index c0c3c34..34b1da9 100644 --- a/compiler/mir-caffe-importer/caffe_op_creator.cpp +++ b/compiler/mir-caffe-importer/caffe_op_creator.cpp @@ -114,20 +114,6 @@ static mir::Shape convertBlobShape(const BlobShape &shape) using namespace mir; -mir::Operation::Output *CaffeOpCreator::convertCaffeToMIR(mir::Operation::Output *arg) -{ - // NCHW -> NHWC - auto transpose = createOp(arg, std::vector{0, 2, 3, 1}); - return transpose->getOutput(0); -} - -mir::Operation::Output *CaffeOpCreator::convertMIRToCaffe(mir::Operation::Output *arg) -{ - // NHWC -> NCHW - auto transpose = createOp(arg, std::vector{0, 3, 1, 2}); - return transpose->getOutput(0); -} - /// @brief Split arg into @p num_parts equal parts along @p axis axis. std::vector CaffeOpCreator::createSplit(mir::Operation::Output *arg, int32_t num_parts, int32_t axis) @@ -322,8 +308,8 @@ CaffeOpCreator::convertConvolution(const caffe::LayerParameter &layer, // TODO handle properly kernel with layer multiplier auto transposed_tensor = transposeTensor<0, 1, 3, 2>(kernel_weights); auto kernel = createOp(transposed_tensor)->getOutput(0); - result = createOp(convertCaffeToMIR(inputs[0]), kernel, strides, - padding, padding) + result = createOp(inputs[0], kernel, strides, padding, padding, + DataFormat::NCHW) ->getOutput(0); } else @@ -335,19 +321,19 @@ CaffeOpCreator::convertConvolution(const caffe::LayerParameter &layer, } kernel_weights = transposeTensor<3, 0, 1, 2>(kernel_weights); auto kernel = createOp(kernel_weights)->getOutput(0); - result = - createOp(convertCaffeToMIR(inputs[0]), kernel, strides, padding, padding) - ->getOutput(0); + result = createOp(inputs[0], kernel, strides, padding, padding, DataFormat::NCHW) + ->getOutput(0); } // Add the bias, if any. if (params.bias_term()) { auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); result = createOp(result, bias)->getOutput(0); } - return {convertMIRToCaffe(result)}; + return {result}; } std::vector @@ -369,17 +355,18 @@ CaffeOpCreator::convertDeconvolution(const caffe::LayerParameter &layer, kernel_weights = fixGroupedKernel(opts.group(), kernel_weights); } auto kernel = createOp(kernel_weights)->getOutput(0); - auto result = createOp(convertCaffeToMIR(inputs[0]), kernel, strides, padding) + auto result = createOp(inputs[0], kernel, strides, padding, DataFormat::NCHW) ->getOutput(0); // bias_term is optional (so might not be present) and defaults to true if (opts.bias_term()) { auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); result = createOp(result, bias)->getOutput(0); } - return {convertMIRToCaffe(result)}; + return {result}; } std::vector @@ -497,27 +484,24 @@ CaffeOpCreator::convertPooling(const caffe::LayerParameter &layer, convertPoolingParam(params, input->getShape(), window_size, strides, padding_before, padding_after); - input = convertCaffeToMIR(input); mir::Operation::Output *result; switch (params.pool()) { case PoolingParameter::AVE: result = createOp(input, window_size, strides, padding_before, - padding_after, true, mir::DataFormat::NHWC) + padding_after, true, mir::DataFormat::NCHW) ->getOutput(0); break; case PoolingParameter::MAX: result = createOp(input, window_size, strides, padding_before, - padding_after, mir::DataFormat::NHWC) + padding_after, mir::DataFormat::NCHW) ->getOutput(0); break; default: assert(false); } - result = convertMIRToCaffe(result); - return {result}; } @@ -602,16 +586,18 @@ CaffeOpCreator::convertScale(const caffe::LayerParameter &layer, { const auto ¶ms = layer.scale_param(); auto scale = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - auto result = createOp(convertCaffeToMIR(inputs[0]), scale)->getOutput(0); + scale = createOp(scale, Shape{1, scale->getShape().dim(0), 1, 1})->getOutput(0); + auto result = createOp(inputs[0], scale)->getOutput(0); // Add the bias, if any. if (params.bias_term()) { auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); result = createOp(result, bias)->getOutput(0); } - return {convertMIRToCaffe(result)}; + return {result}; } void CaffeOpCreator::checkBatchNorm(const caffe::LayerParameter &layer, @@ -655,11 +641,14 @@ CaffeOpCreator::convertBatchNorm(const caffe::LayerParameter &layer, var_accessor.at(idx) = 1.0f / std::sqrt(var_accessor.at(idx) * scale_factor + eps); auto c2 = createOp(var_tensor)->getOutput(0); + c1 = createOp(c1, Shape{1, c1->getShape().dim(0), 1, 1})->getOutput(0); + c2 = createOp(c2, Shape{1, c2->getShape().dim(0), 1, 1})->getOutput(0); + // Y = (X + C1) * C2 - input = convertCaffeToMIR(input); auto result = createOp(input, c1)->getOutput(0); result = createOp(result, c2)->getOutput(0); - return {convertMIRToCaffe(result)}; + + return {result}; } std::vector diff --git a/compiler/mir-caffe-importer/caffe_op_creator.h b/compiler/mir-caffe-importer/caffe_op_creator.h index 98f2161..19be0c9 100644 --- a/compiler/mir-caffe-importer/caffe_op_creator.h +++ b/compiler/mir-caffe-importer/caffe_op_creator.h @@ -127,10 +127,6 @@ public: private: mir::Graph *_graph = nullptr; - mir::Operation::Output *convertCaffeToMIR(mir::Operation::Output *arg); - - mir::Operation::Output *convertMIRToCaffe(mir::Operation::Output *arg); - std::vector createSplit(mir::Operation::Output *arg, int32_t num_parts, int32_t axis);