From 2120f075a3f888458d4b5b5c02e81fab93ee2346 Mon Sep 17 00:00:00 2001 From: SunGaofeng Date: Mon, 15 Apr 2019 02:36:44 +0000 Subject: [PATCH] modify infer shape in pad_op.cc, pad_constant_like_op.cc. No need in psroi_pool_op.cc, crop_op.cc --- paddle/fluid/operators/pad_constant_like_op.cc | 14 ++++++++++++-- paddle/fluid/operators/pad_op.cc | 16 ++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/paddle/fluid/operators/pad_constant_like_op.cc b/paddle/fluid/operators/pad_constant_like_op.cc index 3f827c26fd4..920383e6522 100644 --- a/paddle/fluid/operators/pad_constant_like_op.cc +++ b/paddle/fluid/operators/pad_constant_like_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/pad_constant_like_op.h" +#include namespace paddle { namespace operators { @@ -38,8 +39,13 @@ class PadConstantLikeOp : public framework::OperatorWithKernel { "The dimention of X and Y should be the same."); for (int i = 0; i < x_dim.size(); ++i) { - PADDLE_ENFORCE_GE(x_dim[i], y_dim[i]); + if ((!ctx->IsRuntime()) && ((x_dim[i] == -1) || (y_dim[i] == -1))) { + continue; + } else { + PADDLE_ENFORCE_GE(x_dim[i], y_dim[i]); + } } + ctx->SetOutputDim("Out", x_dim); ctx->ShareLoD("X", /*->*/ "Out"); } @@ -162,7 +168,11 @@ class PadConstantLikeOpGrad : public framework::OperatorWithKernel { ctx->ShareLoD("Y", /*->*/ y_grad_name); for (int i = 0; i < y_dim.size(); ++i) { - PADDLE_ENFORCE_GE(dout_dim[i], y_dim[i]); + if ((!ctx->IsRuntime()) && ((dout_dim[i] == -1) || (y_dim[i] == -1))) { + continue; + } else { + PADDLE_ENFORCE_GE(dout_dim[i], y_dim[i]); + } } } } diff --git a/paddle/fluid/operators/pad_op.cc b/paddle/fluid/operators/pad_op.cc index c28106d3127..4b4f43344f6 100644 --- a/paddle/fluid/operators/pad_op.cc +++ b/paddle/fluid/operators/pad_op.cc @@ -36,7 +36,11 @@ class PadOp : public framework::OperatorWithKernel { "of input tensor."); std::vector out_dims(x_dim.size()); for (int i = 0; i < x_dim.size(); ++i) { - out_dims[i] = x_dim[i] + paddings[i * 2] + paddings[i * 2 + 1]; + if ((!ctx->IsRuntime()) && (x_dim[i] == -1)) { + out_dims[i] = -1; + } else { + out_dims[i] = x_dim[i] + paddings[i * 2] + paddings[i * 2 + 1]; + } } ctx->SetOutputDim("Out", framework::make_ddim(out_dims)); if (out_dims[0] == x_dim[0]) { @@ -100,18 +104,14 @@ class PadOpGrad : public framework::OperatorWithKernel { using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { - auto dout_dims = ctx->GetInputDim(framework::GradVarName("Out")); - auto& paddings = ctx->Attrs().Get>("paddings"); - for (int i = 0; i < dout_dims.size(); ++i) { - dout_dims[i] -= (paddings[i * 2] + paddings[i * 2 + 1]); - } - auto x_grad_name = framework::GradVarName("X"); if (ctx->HasOutput(x_grad_name)) { auto dout_dims = ctx->GetInputDim(framework::GradVarName("Out")); auto& paddings = ctx->Attrs().Get>("paddings"); for (int i = 0; i < dout_dims.size(); ++i) { - dout_dims[i] -= (paddings[i * 2] + paddings[i * 2 + 1]); + if (ctx->IsRuntime() || (dout_dims[i] != -1)) { + dout_dims[i] -= (paddings[i * 2] + paddings[i * 2 + 1]); + } } ctx->SetOutputDim(x_grad_name, dout_dims); } -- GitLab