提交 0289a009 编写于 作者: Y Yibing Liu

follow comments to cleanup code

上级 dd926498
...@@ -27,21 +27,26 @@ class ReshapeOp : public framework::OperatorWithKernel { ...@@ -27,21 +27,26 @@ class ReshapeOp : public framework::OperatorWithKernel {
protected: protected:
void InferShape(const framework::InferShapeContext &ctx) const override { void InferShape(const framework::InferShapeContext &ctx) const override {
auto *in = ctx.Input<framework::Tensor>("X"); // input check
PADDLE_ENFORCE_NOT_NULL(ctx.InputVar("X"), "Input(X) shouldn't be null");
auto shape = ctx.Attr<std::vector<int>>("shape"); auto shape = ctx.Attr<std::vector<int>>("shape");
int64_t capacity = -1; PADDLE_ENFORCE(shape.size() > 0, "Attr(shape) shouldn't be empty.");
for (auto dim : shape) { for (auto dim : shape) {
PADDLE_ENFORCE(dim > 0, "Each dimension of shape must be positive."); PADDLE_ENFORCE(dim > 0, "Each dimension of shape must be positive.");
if (capacity < 0) {
capacity = dim;
} else {
capacity *= dim;
}
} }
// capacity check
int64_t capacity =
std::accumulate(shape.begin(), shape.end(), 1, std::multiplies<int>());
auto *in = ctx.Input<framework::Tensor>("X");
int64_t in_size = framework::product(in->dims()); int64_t in_size = framework::product(in->dims());
PADDLE_ENFORCE_EQ(capacity, in_size, PADDLE_ENFORCE_EQ(capacity, in_size,
"The size of Input(X) mismatches with Attr(shape)."); "The size of Input(X) mismatches with Attr(shape).");
ctx.Output<framework::Tensor>("Out")->Resize(in->dims()); // resize output
std::vector<int64_t> shape_int64(shape.size(), 0);
std::transform(shape.begin(), shape.end(), shape_int64.begin(),
[](int a) { return static_cast<int64_t>(a); });
auto out_dims = framework::make_ddim(shape_int64);
ctx.Output<framework::Tensor>("Out")->Resize(out_dims);
} }
}; };
...@@ -56,6 +61,17 @@ class ReshapeOpMaker : public framework::OpProtoAndCheckerMaker { ...@@ -56,6 +61,17 @@ class ReshapeOpMaker : public framework::OpProtoAndCheckerMaker {
AddComment(R"DOC(Reshape operator AddComment(R"DOC(Reshape operator
Reshape Input(X) into the shape specified by Attr(shape). Reshape Input(X) into the shape specified by Attr(shape).
An example:
Given a 2-D tensor X with 2 rows and 2 columns
[[1, 2], [3, 4]]
with target shape = [1, 4], the reshape operator will tansform
the tensor X into a 1-D tensor:
[1, 2, 3, 4]
)DOC"); )DOC");
} }
}; };
...@@ -70,6 +86,9 @@ class ReshapeGradOp : public framework::OperatorWithKernel { ...@@ -70,6 +86,9 @@ class ReshapeGradOp : public framework::OperatorWithKernel {
protected: protected:
void InferShape(const framework::InferShapeContext &ctx) const override { void InferShape(const framework::InferShapeContext &ctx) const override {
PADDLE_ENFORCE_NOT_NULL(ctx.InputVar("X"), "Input(X) shouldn't be null.");
PADDLE_ENFORCE_NOT_NULL(ctx.InputVar(framework::GradVarName("Out")),
"Input(Out@GRAD) shouldn't be null.");
auto dims = ctx.Input<framework::Tensor>("X")->dims(); auto dims = ctx.Input<framework::Tensor>("X")->dims();
auto *d_in = ctx.Output<framework::Tensor>(framework::GradVarName("X")); auto *d_in = ctx.Output<framework::Tensor>(framework::GradVarName("X"));
d_in->Resize(dims); d_in->Resize(dims);
......
...@@ -30,11 +30,10 @@ class ReshapeKernel : public framework::OpKernel { ...@@ -30,11 +30,10 @@ class ReshapeKernel : public framework::OpKernel {
out->mutable_data<T>(ctx.GetPlace()); out->mutable_data<T>(ctx.GetPlace());
auto shape = ctx.Attr<std::vector<int>>("shape"); auto shape = ctx.Attr<std::vector<int>>("shape");
std::vector<int64_t> tmp; std::vector<int64_t> shape_int64(shape.size(), 0);
for (auto dim : shape) { std::transform(shape.begin(), shape.end(), shape_int64.begin(),
tmp.push_back(dim); [](int a) { return static_cast<int64_t>(a); });
} auto out_dims = framework::make_ddim(shape_int64);
auto out_dims = framework::make_ddim(tmp);
out->CopyFrom<T>(*in, ctx.GetPlace()); out->CopyFrom<T>(*in, ctx.GetPlace());
out->Resize(out_dims); out->Resize(out_dims);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册