diff --git a/paddle/fluid/operators/conv_op.h b/paddle/fluid/operators/conv_op.h index caf3a9a4bc71c07352598aa5f4ba71c3ca578d39..ad025c468332194dcda6d418a9339efdd53b5227 100644 --- a/paddle/fluid/operators/conv_op.h +++ b/paddle/fluid/operators/conv_op.h @@ -64,17 +64,19 @@ inline int ConvOutputSize(int input_size, int filter_size, int dilation, return output_size; } -inline void UpdatePaddingAndDilation(std::vector* paddings, - std::vector* dilation, + +template +inline void UpdatePaddingAndDilation(std::vector* paddings, + std::vector* dilation, const std::string padding_algorithm, const framework::DDim data_dims, - const std::vector& strides, - const std::vector& ksize) { + const std::vector& strides, + const std::vector& ksize) { // set padding size == data_dims.size() * 2 - auto data_shape = framework::vectorize(data_dims); + auto data_shape = framework::vectorize(data_dims); if (static_cast(paddings->size()) == data_dims.size()) { for (int i = 0; i < data_dims.size(); ++i) { - int copy_pad = *(paddings->begin() + 2 * i); + T copy_pad = *(paddings->begin() + 2 * i); paddings->insert(paddings->begin() + 2 * i + 1, copy_pad); } } else { @@ -86,11 +88,11 @@ inline void UpdatePaddingAndDilation(std::vector* paddings, // when padding_algorithm is "VALID" or "SAME" if (padding_algorithm == "SAME") { for (int i = 0; i < data_dims.size(); ++i) { - int out_size = (data_dims[i] + strides[i] - 1) / strides[i]; - int pad_sum = + T out_size = (data_dims[i] + strides[i] - 1) / strides[i]; + T pad_sum = std::max((out_size - 1) * strides[i] + ksize[i] - data_shape[i], 0); - int pad_0 = pad_sum / 2; - int pad_1 = pad_sum - pad_0; + T pad_0 = pad_sum / 2; + T pad_1 = pad_sum - pad_0; *(paddings->begin() + i * 2) = pad_0; *(paddings->begin() + i * 2 + 1) = pad_1; diff --git a/paddle/fluid/operators/pool_op.h b/paddle/fluid/operators/pool_op.h index 5db94f95b99d28b496d8b0621d8336e6603c4167..53551a8c50a4eff192b8a7c4b51af67c8b198a2a 100644 --- a/paddle/fluid/operators/pool_op.h +++ b/paddle/fluid/operators/pool_op.h @@ -57,17 +57,19 @@ class Pool3dOpMaker : public framework::OpProtoAndCheckerMaker { public: void Make() override; }; -inline void UpdatePadding(std::vector* paddings, const bool global_pooling, + +template +inline void UpdatePadding(std::vector* paddings, const bool global_pooling, const bool adaptive, const std::string padding_algorithm, const framework::DDim data_dims, - const std::vector& strides, - const std::vector& ksize) { + const std::vector& strides, + const std::vector& ksize) { // set padding size == data_dims.size() * 2 - auto data_shape = framework::vectorize(data_dims); + auto data_shape = framework::vectorize(data_dims); if (static_cast(paddings->size()) == data_dims.size()) { for (int i = 0; i < data_dims.size(); ++i) { - int copy_pad = *(paddings->begin() + 2 * i); + T copy_pad = *(paddings->begin() + 2 * i); paddings->insert(paddings->begin() + 2 * i + 1, copy_pad); } } else { @@ -79,11 +81,11 @@ inline void UpdatePadding(std::vector* paddings, const bool global_pooling, // when padding_algorithm is "VALID" or "SAME" if (padding_algorithm == "SAME") { for (int i = 0; i < data_dims.size(); ++i) { - int out_size = (data_dims[i] + strides[i] - 1) / strides[i]; - int pad_sum = + T out_size = (data_dims[i] + strides[i] - 1) / strides[i]; + T pad_sum = std::max((out_size - 1) * strides[i] + ksize[i] - data_shape[i], 0); - int pad_0 = pad_sum / 2; - int pad_1 = pad_sum - pad_0; + T pad_0 = pad_sum / 2; + T pad_1 = pad_sum - pad_0; *(paddings->begin() + i * 2) = pad_0; *(paddings->begin() + i * 2 + 1) = pad_1; } @@ -101,11 +103,12 @@ inline void UpdatePadding(std::vector* paddings, const bool global_pooling, } } -inline void UpdateKsize(std::vector* ksize, +template +inline void UpdateKsize(std::vector* ksize, const framework::DDim data_dims) { ksize->resize(static_cast(data_dims.size())); for (size_t i = 0; i < ksize->size(); ++i) { - *(ksize->begin() + i) = static_cast(data_dims[i]); + *(ksize->begin() + i) = static_cast(data_dims[i]); } }