Skip to content

Commit

Permalink
[bug fix] fix unfold bug in compile time (#38907)
Browse files Browse the repository at this point in the history
  • Loading branch information
ghostxsl authored Jan 13, 2022
1 parent eaccdc7 commit 7f12345
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 29 deletions.
35 changes: 15 additions & 20 deletions paddle/fluid/operators/unfold_op.cc
Original file line number Diff line number Diff line change
Expand Up @@ -143,22 +143,18 @@ class UnfoldOp : public framework::OperatorWithKernel {
"but recieved dilations_height: %d dilations_width: %d.",
dilations[0], dilations[1]));

bool contain_unknown_dim = framework::contain_unknown_dim(in_dims);
bool check = ctx->IsRuntime() || !contain_unknown_dim;
if (check) {
std::vector<int> out_dims;
out_dims.push_back(in_dims[0]);

int output_channels = in_dims[1] * kernel_sizes[0] * kernel_sizes[1];
out_dims.push_back(output_channels);

int output_height =
CalcOutputSize(in_dims[2], kernel_sizes[0], dilations[0], paddings[0],
paddings[2], strides[0]);
int output_width =
CalcOutputSize(in_dims[3], kernel_sizes[1], dilations[1], paddings[1],
paddings[3], strides[1]);
// check output height and width
std::vector<int> out_dims;
out_dims.push_back(in_dims[0]);
int output_channels = in_dims[1] * kernel_sizes[0] * kernel_sizes[1];
out_dims.push_back(output_channels);

int output_height =
CalcOutputSize(in_dims[2], kernel_sizes[0], dilations[0], paddings[0],
paddings[2], strides[0]);
int output_width = CalcOutputSize(in_dims[3], kernel_sizes[1], dilations[1],
paddings[1], paddings[3], strides[1]);
if (ctx->IsRuntime()) {
// only check output height and width in runtime
PADDLE_ENFORCE_GT(
output_height, 0,
platform::errors::InvalidArgument(
Expand All @@ -179,11 +175,10 @@ class UnfoldOp : public framework::OperatorWithKernel {
in_dims[2], in_dims[3], kernel_sizes[0], kernel_sizes[1],
strides[0], strides[1], dilations[0], dilations[1], output_height,
output_width));
int output_col_length = output_height * output_width;
out_dims.push_back(output_col_length);

ctx->SetOutputDim("Y", framework::make_ddim(out_dims));
}
int output_col_length = output_height * output_width;
out_dims.push_back(output_col_length);
ctx->SetOutputDim("Y", framework::make_ddim(out_dims));
}

protected:
Expand Down
10 changes: 1 addition & 9 deletions paddle/fluid/operators/unfold_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include <memory>
#include <vector>

#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/operators/math/im2col.h"
#include "paddle/fluid/operators/math/math_function.h"
Expand All @@ -29,15 +30,6 @@ inline int CalcOutputSize(int input_size, int filter_size, int dilation,
int padding1, int padding2, int stride) {
const int dkernel = dilation * (filter_size - 1) + 1;
int output_size = (input_size + padding1 + padding2 - dkernel) / stride + 1;
PADDLE_ENFORCE_GT(
output_size, 0UL,
platform::errors::InvalidArgument(
"Due to the settings of padding(%d, %d), filter_size(%d), "
"dilation(%d) and "
"stride(%d), the output size is less than 0, please check "
"again. Input_size:%d",
padding1, padding2, filter_size, dilation, stride, input_size));

return output_size;
}

Expand Down

0 comments on commit 7f12345

Please sign in to comment.