提交 652f182d 编写于 作者: Z zchen0211

deconv

上级 da399ae6
...@@ -12,97 +12,82 @@ ...@@ -12,97 +12,82 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. */ limitations under the License. */
#include "paddle/operators/gemm_conv2d_op.h" #include "paddle/operators/deconv2d_op.h"
#include "paddle/operators/conv2d_op.h"
namespace paddle { namespace paddle {
namespace operators { namespace operators {
class Deconv2DOp : public framework::OperatorWithKernel { void Deconv2DOp::InferShape(framework::InferShapeContext* ctx) const {
public: PADDLE_ENFORCE(ctx->HasInput("Input"),
using framework::OperatorWithKernel::OperatorWithKernel; "Input(Input) of Deconv2DOp should not be null.");
PADDLE_ENFORCE(ctx->HasInput("Filter"),
protected: "Input(Filter) of Deconv2DOp should not be null.");
void InferShape(framework::InferShapeContext* ctx) const override { PADDLE_ENFORCE(ctx->HasOutput("Output"),
PADDLE_ENFORCE(ctx->HasInput("Input"), "Output(Output) of Deconv2DOp should not be null.");
"Input(Input) of Deconv2DOp should not be null.");
PADDLE_ENFORCE(ctx->HasInput("Filter"), auto in_dims = ctx->GetInputDim("Input");
"Input(Filter) of Deconv2DOp should not be null."); auto filter_dims = ctx->GetInputDim("Filter");
PADDLE_ENFORCE(ctx->HasOutput("Output"), std::vector<int> strides = ctx->Attrs().Get<std::vector<int>>("strides");
"Output(Output) of Deconv2DOp should not be null."); std::vector<int> paddings = ctx->Attrs().Get<std::vector<int>>("paddings");
int groups = ctx->Attrs().Get<int>("groups");
auto in_dims = ctx->GetInputDim("Input"); int input_channels = in_dims[1];
auto filter_dims = ctx->GetInputDim("Filter"); int output_channels = filter_dims[0];
std::vector<int> strides = ctx->Attrs().Get<std::vector<int>>("strides");
std::vector<int> paddings = ctx->Attrs().Get<std::vector<int>>("paddings"); PADDLE_ENFORCE_EQ(in_dims.size(), 4, "Conv2DOp input should be 4-D.");
int groups = ctx->Attrs().Get<int>("groups"); PADDLE_ENFORCE_EQ(filter_dims.size(), 4, "Conv2DOp filter should be 4-D.");
int input_channels = in_dims[1]; PADDLE_ENFORCE_EQ(input_channels, filter_dims[1] * groups,
int output_channels = filter_dims[0]; "The number of input channels should be equal to filter "
"channels * groups.");
PADDLE_ENFORCE_EQ(in_dims.size(), 4, "Conv2DOp input should be 4-D."); PADDLE_ENFORCE_EQ(
PADDLE_ENFORCE_EQ(filter_dims.size(), 4, "Conv2DOp filter should be 4-D."); output_channels % groups, 0,
PADDLE_ENFORCE_EQ(input_channels, filter_dims[1] * groups, "The number of output channels should be divided by groups.");
"The number of input channels should be equal to filter "
"channels * groups."); auto output_height = (in_dims[2] - 1) * strides[0] + filter_dims[2];
PADDLE_ENFORCE_EQ( auto output_width = (in_dims[3] - 1) * strides[1] + filter_dims[3];
output_channels % groups, 0, ctx->SetOutputDim("Output",
"The number of output channels should be divided by groups."); {in_dims[0], filter_dims[0], output_height, output_width});
}
auto output_height = (in_dims[2] - 1) * strides[0] + filter_dims[2];
auto output_width = (in_dims[3] - 1) * strides[1] + filter_dims[3]; Deconv2DOpMaker::Deconv2DOpMaker(framework::OpProto* proto,
ctx->SetOutputDim( framework::OpAttrChecker* op_checker)
"Output", {in_dims[0], filter_dims[0], output_height, output_width}); : OpProtoAndCheckerMaker(proto, op_checker) {
} AddInput(
}; "Input",
"The input tensor of deconvolution operator. "
class Deconv2DOpMaker : public framework::OpProtoAndCheckerMaker { "The format of input tensor is NCHW. Where N is batch size, C is the "
public: "number of channels, H and W is the height and width of image.");
Deconv2DOpMaker(framework::OpProto* proto, AddInput("Filter",
framework::OpAttrChecker* op_checker) "The filter tensor of deconvolution operator."
: OpProtoAndCheckerMaker(proto, op_checker) { "The format of the filter tensor is MCHW, where M is the number of "
AddInput( "output image channels, C is the number of input image channels, "
"Input", "H and W is height and width of filter. "
"The input tensor of deconvolution operator. " "We enforce groups number == 1 and padding == 0 in our "
"The format of input tensor is NCHW. Where N is batch size, C is the " "deconvolution Scenario.");
"number of channels, H and W is the height and width of image."); AddOutput("Output",
AddInput( "The output tensor of deconvolution operator."
"Filter", "The format of output tensor is also NCHW.");
"The filter tensor of deconvolution operator." AddAttr<std::vector<int>>("strides", "strides of deconvolution operator.")
"The format of the filter tensor is MCHW, where M is the number of " .SetDefault({1, 1});
"output image channels, C is the number of input image channels, " AddAttr<std::vector<int>>("paddings", "paddings of deconvolution operator.")
"H and W is height and width of filter. " .SetDefault({0, 0});
"We enforce groups number == 1 and padding == 0 in our deconvolution AddComment(R"DOC(
Scenario.");
AddOutput("Output",
"The output tensor of deconvolution operator."
"The format of output tensor is also NCHW.");
AddAttr<std::vector<int>>("strides", "strides of deconvolution operator.")
.SetDefault({1, 1});
AddAttr<std::vector<int>>("paddings", "paddings of deconvolution operator.")
.SetDefault({0, 0});
AddComment(R"DOC(
The deconvolution operation calculates the output based on the input, filter The deconvolution operation calculates the output based on the input, filter
and strides, paddings, groups parameters. The size of each dimension of the and strides, paddings, groups parameters. The size of each dimension of the
parameters is checked in the infer-shape. parameters is checked in the infer-shape.
)DOC"); )DOC");
} }
};
class Deconv2DOpGrad : public framework::OperatorWithKernel { void Deconv2DOpGrad::InferShape(framework::InferShapeContext* ctx) const {
public: auto in_dims = ctx->GetInputDim("Input");
using framework::OperatorWithKernel::OperatorWithKernel; auto filter_dims = ctx->GetInputDim("Filter");
if (ctx->HasOutput(framework::GradVarName("Input"))) {
protected: ctx->SetOutputDim(framework::GradVarName("Input"), in_dims);
void InferShape(framework::InferShapeContext* ctx) const override { }
auto in_dims = ctx->GetInputDim("Input"); if (ctx->HasOutput(framework::GradVarName("Filter"))) {
auto filter_dims = ctx->GetInputDim("Filter"); ctx->SetOutputDim(framework::GradVarName("Filter"), filter_dims);
if (ctx->HasOutput(framework::GradVarName("Input"))) {
ctx->SetOutputDim(framework::GradVarName("Input"), in_dims);
}
if (ctx->HasOutput(framework::GradVarName("Filter"))) {
ctx->SetOutputDim(framework::GradVarName("Filter"), filter_dims);
}
} }
}; }
} // namespace operators } // namespace operators
} // namespace paddle } // namespace paddle
......
/* Copyright (c) 2016 PaddlePaddle Authors All Rights Reserve.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#include "paddle/operators/conv2d_op.h"
#include "paddle/operators/deconv2d_op.h"
namespace ops = paddle::operators;
REGISTER_OP_GPU_KERNEL(
deconv2d, ops::GemmConvGrad2DKernel<paddle::platform::GPUPlace, float>);
REGISTER_OP_GPU_KERNEL(
deconv2d_grad, ops::GemmConv2DKernel<paddle::platform::GPUPlace, float>);
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#pragma once
#include "paddle/framework/eigen.h"
#include "paddle/framework/op_registry.h"
#include "paddle/operators/math/im2col.h"
#include "paddle/operators/math/math_function.h"
namespace paddle {
namespace operators {
using Tensor = framework::Tensor;
// Define Op classes in .h file so that other deconv
// operator implementations can reuse the code.
class Deconv2DOpMaker : public framework::OpProtoAndCheckerMaker {
public:
Deconv2DOpMaker(framework::OpProto* proto,
framework::OpAttrChecker* op_checker);
};
class Deconv2DOp : public framework::OperatorWithKernel {
public:
using framework::OperatorWithKernel::OperatorWithKernel;
protected:
void InferShape(framework::InferShapeContext* ctx) const override;
};
class Deconv2DOpGrad : public framework::OperatorWithKernel {
public:
using framework::OperatorWithKernel::OperatorWithKernel;
protected:
void InferShape(framework::InferShapeContext* ctx) const override;
};
} // namespace operators
} // namespace paddle
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册