From 01bbacb465da79d3b4d1a3f313b172fe295642f5 Mon Sep 17 00:00:00 2001 From: Pablo Tello Date: Tue, 30 Apr 2019 10:32:42 +0100 Subject: COMPMID-2176: Add dilation support in calculate_same_pad() Change-Id: Ic12138cd3ebd3198c854b13eef02717137bda660 Signed-off-by: Pablo Tello Reviewed-on: https://review.mlplatform.org/c/1059 Tested-by: Arm Jenkins Reviewed-by: Usama Arif Comments-Addressed: Usama Arif Reviewed-by: Michalis Spyrou --- arm_compute/core/Utils.h | 19 ++++++++++--------- src/core/Utils.cpp | 24 +++++++++++++++--------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/arm_compute/core/Utils.h b/arm_compute/core/Utils.h index 2640264f55..1de0df6096 100644 --- a/arm_compute/core/Utils.h +++ b/arm_compute/core/Utils.h @@ -828,10 +828,11 @@ inline void permute_strides(Dimensions &dimensions, const PermutationVector & * @param[in] weights_shape Weights shape * @param[in] conv_info Convolution information (containing strides) * @param[in] data_layout (Optional) Data layout of the input and weights tensor + * @param[in] dilation (Optional) Dilation factor used in the convolution. * * @return PadStrideInfo for SAME padding */ -PadStrideInfo calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info, DataLayout data_layout = DataLayout::NCHW); +PadStrideInfo calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info, DataLayout data_layout = DataLayout::NCHW, const Size2D &dilation = Size2D(1u, 1u)); /** Returns expected width and height of the deconvolution's output tensor. * @@ -846,10 +847,10 @@ PadStrideInfo calculate_same_pad(TensorShape input_shape, TensorShape weights_sh * * @return A pair with the new width in the first position and the new height in the second. */ -const std::pair deconvolution_output_dimensions(unsigned int in_width, unsigned int in_height, - unsigned int kernel_width, unsigned int kernel_height, - unsigned int padx, unsigned int pady, - unsigned int stride_x, unsigned int stride_y); +std::pair deconvolution_output_dimensions(unsigned int in_width, unsigned int in_height, + unsigned int kernel_width, unsigned int kernel_height, + unsigned int padx, unsigned int pady, + unsigned int stride_x, unsigned int stride_y); /** Returns expected width and height of output scaled tensor depending on dimensions rounding mode. * @@ -862,10 +863,10 @@ const std::pair deconvolution_output_dimensions(unsi * * @return A pair with the new width in the first position and the new height in the second. */ -const std::pair scaled_dimensions(unsigned int width, unsigned int height, - unsigned int kernel_width, unsigned int kernel_height, - const PadStrideInfo &pad_stride_info, - const Size2D &dilation = Size2D(1U, 1U)); +std::pair scaled_dimensions(unsigned int width, unsigned int height, + unsigned int kernel_width, unsigned int kernel_height, + const PadStrideInfo &pad_stride_info, + const Size2D &dilation = Size2D(1U, 1U)); /** Convert a tensor format into a string. * diff --git a/src/core/Utils.cpp b/src/core/Utils.cpp index 44d819942e..589b7375ae 100644 --- a/src/core/Utils.cpp +++ b/src/core/Utils.cpp @@ -326,24 +326,30 @@ std::string arm_compute::lower_string(const std::string &val) return res; } -PadStrideInfo arm_compute::calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info, DataLayout data_layout) +PadStrideInfo arm_compute::calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info, DataLayout data_layout, const Size2D &dilation) { const unsigned int width_idx = arm_compute::get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); const unsigned int height_idx = arm_compute::get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); const auto &strides = conv_info.stride(); const int out_width = std::ceil(float(input_shape[width_idx]) / float(strides.first)); const int out_height = std::ceil(float(input_shape[height_idx]) / float(strides.second)); - const int pad_width = ((out_width - 1) * strides.first + weights_shape[width_idx] - input_shape[width_idx]); - const int pad_height = ((out_height - 1) * strides.second + weights_shape[height_idx] - input_shape[height_idx]); + const int pad_width = (out_width - 1) * strides.first + (weights_shape[width_idx] + (dilation.x() - 1) * (weights_shape[width_idx] - 1) - input_shape[width_idx]); + const int pad_height = (out_height - 1) * strides.second + (weights_shape[height_idx] + (dilation.y() - 1) * (weights_shape[height_idx] - 1) - input_shape[height_idx]); const int same_pad_left = pad_width / 2; const int same_pad_top = pad_height / 2; const int same_pad_right = pad_width - same_pad_left; const int same_pad_bottom = pad_height - same_pad_top; - return PadStrideInfo(strides.first, strides.second, same_pad_left, same_pad_right, same_pad_top, same_pad_bottom, DimensionRoundingType::CEIL); + return { static_cast(strides.first), + static_cast(strides.second), + static_cast(same_pad_left), + static_cast(same_pad_right), + static_cast(same_pad_top), + static_cast(same_pad_bottom), + DimensionRoundingType::CEIL }; } -const std::pair arm_compute::deconvolution_output_dimensions( +std::pair arm_compute::deconvolution_output_dimensions( unsigned int in_width, unsigned int in_height, unsigned int kernel_width, unsigned int kernel_height, unsigned int padx, unsigned int pady, unsigned int stride_x, unsigned int stride_y) { @@ -356,10 +362,10 @@ const std::pair arm_compute::deconvolution_output_di return std::make_pair(w, h); } -const std::pair arm_compute::scaled_dimensions(unsigned int width, unsigned int height, - unsigned int kernel_width, unsigned int kernel_height, - const PadStrideInfo &pad_stride_info, - const Size2D &dilation) +std::pair arm_compute::scaled_dimensions(unsigned int width, unsigned int height, + unsigned int kernel_width, unsigned int kernel_height, + const PadStrideInfo &pad_stride_info, + const Size2D &dilation) { const unsigned int pad_left = pad_stride_info.pad_left(); const unsigned int pad_top = pad_stride_info.pad_top(); -- cgit v1.2.1