未验证 提交 9437ce36 编写于 作者: J Jack Zhou 提交者: GitHub

Error description optimize for math dir

Error description optimize for math dir
上级 5c1bafbb
...@@ -128,9 +128,23 @@ struct RowwiseAdd<platform::CPUDeviceContext, T> { ...@@ -128,9 +128,23 @@ struct RowwiseAdd<platform::CPUDeviceContext, T> {
const framework::Tensor& input, const framework::Tensor& input,
const framework::Tensor& vector, framework::Tensor* output) { const framework::Tensor& vector, framework::Tensor* output) {
auto in_dims = input.dims(); auto in_dims = input.dims();
auto out_dims = output->dims();
auto size = input.numel() / in_dims[0]; auto size = input.numel() / in_dims[0];
PADDLE_ENFORCE_EQ(vector.numel(), size); PADDLE_ENFORCE_EQ(
PADDLE_ENFORCE_EQ(output->dims(), in_dims); vector.numel(), size,
platform::errors::InvalidArgument(
"The input vector size"
" should be equal to the size of each row of input tensor."
" Expected vector size=%d, but received %d",
size, vector.numel()));
const char* in_dims_cstr = in_dims.to_str().c_str();
const char* out_dims_cstr = out_dims.to_str().c_str();
PADDLE_ENFORCE_EQ(out_dims, in_dims,
platform::errors::InvalidArgument(
"The output tensor shape should be same as the input"
" tensor shape. Expected output tensor shape: %s,"
" but received %s",
in_dims_cstr, out_dims_cstr));
auto in = framework::EigenMatrix<T>::From(input); auto in = framework::EigenMatrix<T>::From(input);
auto vec = framework::EigenVector<T>::Flatten(vector); auto vec = framework::EigenVector<T>::Flatten(vector);
......
...@@ -88,9 +88,24 @@ struct RowwiseAdd<platform::CUDADeviceContext, T> { ...@@ -88,9 +88,24 @@ struct RowwiseAdd<platform::CUDADeviceContext, T> {
const framework::Tensor& input, const framework::Tensor& input,
const framework::Tensor& vector, framework::Tensor* output) { const framework::Tensor& vector, framework::Tensor* output) {
auto in_dims = input.dims(); auto in_dims = input.dims();
auto out_dims = output->dims();
auto size = input.numel() / in_dims[0]; auto size = input.numel() / in_dims[0];
PADDLE_ENFORCE_EQ(vector.numel(), size); PADDLE_ENFORCE_EQ(
PADDLE_ENFORCE_EQ(output->dims(), in_dims); vector.numel(), size,
platform::errors::InvalidArgument(
"The input vector size"
" should be equal to the size of each row of input tensor."
" Expected vector size=%d, but received %d",
size, vector.numel()));
const char* in_dims_cstr = in_dims.to_str().c_str();
const char* out_dims_cstr = out_dims.to_str().c_str();
PADDLE_ENFORCE_EQ(
out_dims, in_dims,
platform::errors::InvalidArgument(
"The output tensor shape should be same as the input tensor"
" shape. Expected output tensor shape: %s,"
" but received %s",
in_dims_cstr, out_dims_cstr));
int blocks = 512; int blocks = 512;
int grids = (input.numel() + blocks - 1) / blocks; int grids = (input.numel() + blocks - 1) / blocks;
RowwiseAddKernel<T><<<grids, blocks, 0, context.stream()>>>( RowwiseAddKernel<T><<<grids, blocks, 0, context.stream()>>>(
...@@ -113,7 +128,12 @@ void ColwiseSum<platform::CUDADeviceContext, double>::operator()( ...@@ -113,7 +128,12 @@ void ColwiseSum<platform::CUDADeviceContext, double>::operator()(
framework::Tensor* vector) { framework::Tensor* vector) {
auto in_dims = input.dims(); auto in_dims = input.dims();
auto size = input.numel() / in_dims[0]; auto size = input.numel() / in_dims[0];
PADDLE_ENFORCE_EQ(vector->numel(), size); PADDLE_ENFORCE_EQ(vector->numel(), size,
platform::errors::InvalidArgument(
"The size of input vector"
" should be equal to the size of input tensor column"
" dimension. Expected vector size=%d, but received %d",
size, vector->numel()));
framework::Tensor one; framework::Tensor one;
one.mutable_data<double>({in_dims[0]}, context.GetPlace()); one.mutable_data<double>({in_dims[0]}, context.GetPlace());
SetConstant<platform::CUDADeviceContext, double> set; SetConstant<platform::CUDADeviceContext, double> set;
...@@ -134,7 +154,12 @@ void RowwiseSum<platform::CUDADeviceContext, double>::operator()( ...@@ -134,7 +154,12 @@ void RowwiseSum<platform::CUDADeviceContext, double>::operator()(
framework::Tensor* vector) { framework::Tensor* vector) {
auto in_dims = input.dims(); auto in_dims = input.dims();
auto size = input.numel() / in_dims[0]; auto size = input.numel() / in_dims[0];
PADDLE_ENFORCE_EQ(vector->numel(), in_dims[0]); PADDLE_ENFORCE_EQ(vector->numel(), in_dims[0],
platform::errors::InvalidArgument(
"The size of input vector"
" should be equal to the size of input tensor row"
" dimension. Expected vector size=%d, but received %d",
in_dims[0], vector->numel()));
framework::Tensor one; framework::Tensor one;
one.mutable_data<double>({size}, context.GetPlace()); one.mutable_data<double>({size}, context.GetPlace());
SetConstant<platform::CUDADeviceContext, double> set; SetConstant<platform::CUDADeviceContext, double> set;
......
...@@ -59,7 +59,12 @@ void ColwiseSum<DeviceContext, T>::operator()(const DeviceContext& context, ...@@ -59,7 +59,12 @@ void ColwiseSum<DeviceContext, T>::operator()(const DeviceContext& context,
framework::Tensor* out) { framework::Tensor* out) {
auto in_dims = input.dims(); auto in_dims = input.dims();
auto size = input.numel() / in_dims[0]; auto size = input.numel() / in_dims[0];
PADDLE_ENFORCE_EQ(out->numel(), size); PADDLE_ENFORCE_EQ(out->numel(), size,
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor column"
" dimension. Expected output size=%d, but received %d",
size, out->numel()));
auto in = framework::EigenMatrix<T>::From(input); auto in = framework::EigenMatrix<T>::From(input);
auto vec = framework::EigenVector<T>::Flatten(*out); auto vec = framework::EigenVector<T>::Flatten(*out);
...@@ -78,7 +83,13 @@ class ColwiseSum<platform::CPUDeviceContext, T> { ...@@ -78,7 +83,13 @@ class ColwiseSum<platform::CPUDeviceContext, T> {
auto& in_dims = input.dims(); auto& in_dims = input.dims();
auto height = in_dims[0]; auto height = in_dims[0];
auto size = in_dims[1]; auto size = in_dims[1];
PADDLE_ENFORCE_EQ(out->numel(), size); PADDLE_ENFORCE_EQ(
out->numel(), size,
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor column"
" dimension. Expected output size=%d, but received %d",
size, out->numel()));
T* out_buf = out->mutable_data<T>(out->place()); T* out_buf = out->mutable_data<T>(out->place());
const T* in_buf = input.data<T>(); const T* in_buf = input.data<T>();
...@@ -100,8 +111,16 @@ void RowwiseMean<DeviceContext, T>::operator()(const DeviceContext& context, ...@@ -100,8 +111,16 @@ void RowwiseMean<DeviceContext, T>::operator()(const DeviceContext& context,
const framework::Tensor& input, const framework::Tensor& input,
framework::Tensor* out) { framework::Tensor* out) {
auto in_dims = input.dims(); auto in_dims = input.dims();
PADDLE_ENFORCE_EQ(in_dims.size(), 2U); PADDLE_ENFORCE_EQ(in_dims.size(), 2U, platform::errors::InvalidArgument(
PADDLE_ENFORCE_EQ(out->numel(), in_dims[0]); "The rank of input tensor "
"should be 2, but received %d",
in_dims.size()));
PADDLE_ENFORCE_EQ(out->numel(), in_dims[0],
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor row"
" dimension. Expected output size=%d, but received %d",
in_dims[0], out->numel()));
auto in = framework::EigenMatrix<T>::From(input); auto in = framework::EigenMatrix<T>::From(input);
auto vec = framework::EigenVector<T>::Flatten(*out); auto vec = framework::EigenVector<T>::Flatten(*out);
...@@ -118,10 +137,19 @@ class RowwiseMean<platform::CPUDeviceContext, T> { ...@@ -118,10 +137,19 @@ class RowwiseMean<platform::CPUDeviceContext, T> {
void operator()(const platform::CPUDeviceContext& context, void operator()(const platform::CPUDeviceContext& context,
const framework::Tensor& input, framework::Tensor* out) { const framework::Tensor& input, framework::Tensor* out) {
auto& in_dims = input.dims(); auto& in_dims = input.dims();
PADDLE_ENFORCE_EQ(in_dims.size(), 2U); PADDLE_ENFORCE_EQ(in_dims.size(), 2U, platform::errors::InvalidArgument(
"The rank of input tensor "
"should be 2, but received %d",
in_dims.size()));
auto height = in_dims[0]; auto height = in_dims[0];
auto size = in_dims[1]; auto size = in_dims[1];
PADDLE_ENFORCE_EQ(out->numel(), height); PADDLE_ENFORCE_EQ(
out->numel(), height,
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor row"
" dimension. Expected output size=%d, but received %d",
height, out->numel()));
auto inv_size = 1.0 / size; auto inv_size = 1.0 / size;
T* out_buf = out->mutable_data<T>(out->place()); T* out_buf = out->mutable_data<T>(out->place());
const T* in_buf = input.data<T>(); const T* in_buf = input.data<T>();
...@@ -141,8 +169,16 @@ void RowwiseSum<DeviceContext, T>::operator()(const DeviceContext& context, ...@@ -141,8 +169,16 @@ void RowwiseSum<DeviceContext, T>::operator()(const DeviceContext& context,
const framework::Tensor& input, const framework::Tensor& input,
framework::Tensor* out) { framework::Tensor* out) {
auto in_dims = input.dims(); auto in_dims = input.dims();
PADDLE_ENFORCE_EQ(in_dims.size(), 2U); PADDLE_ENFORCE_EQ(in_dims.size(), 2U, platform::errors::InvalidArgument(
PADDLE_ENFORCE_EQ(out->numel(), in_dims[0]); "The rank of input tensor "
"should be 2, but received %d",
in_dims.size()));
PADDLE_ENFORCE_EQ(out->numel(), in_dims[0],
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor row"
" dimension. Expected output size=%d, but received %d",
in_dims[0], out->numel()));
auto in = framework::EigenMatrix<T>::From(input); auto in = framework::EigenMatrix<T>::From(input);
auto vec = framework::EigenVector<T>::Flatten(*out); auto vec = framework::EigenVector<T>::Flatten(*out);
...@@ -159,10 +195,19 @@ class RowwiseSum<platform::CPUDeviceContext, T> { ...@@ -159,10 +195,19 @@ class RowwiseSum<platform::CPUDeviceContext, T> {
void operator()(const platform::CPUDeviceContext& context, void operator()(const platform::CPUDeviceContext& context,
const framework::Tensor& input, framework::Tensor* out) { const framework::Tensor& input, framework::Tensor* out) {
auto& in_dims = input.dims(); auto& in_dims = input.dims();
PADDLE_ENFORCE_EQ(in_dims.size(), 2U); PADDLE_ENFORCE_EQ(in_dims.size(), 2U, platform::errors::InvalidArgument(
"The rank of input tensor "
"should be 2, but received %d",
in_dims.size()));
auto height = in_dims[0]; auto height = in_dims[0];
auto size = in_dims[1]; auto size = in_dims[1];
PADDLE_ENFORCE_EQ(out->numel(), height); PADDLE_ENFORCE_EQ(
out->numel(), height,
platform::errors::InvalidArgument(
"The size of output tensor "
"should be equal to the size of input tensor row"
" dimension. Expected output size=%d, but received %d",
height, out->numel()));
T* out_buf = out->mutable_data<T>(out->place()); T* out_buf = out->mutable_data<T>(out->place());
const T* in_buf = input.data<T>(); const T* in_buf = input.data<T>();
......
...@@ -224,7 +224,11 @@ TEST(math_funciton, set_constant) { ...@@ -224,7 +224,11 @@ TEST(math_funciton, set_constant) {
auto* ctx = new paddle::platform::CPUDeviceContext(); auto* ctx = new paddle::platform::CPUDeviceContext();
paddle::operators::math::set_constant(*ctx, &t, 10); paddle::operators::math::set_constant(*ctx, &t, 10);
for (int64_t i = 0; i < t.numel(); ++i) { for (int64_t i = 0; i < t.numel(); ++i) {
PADDLE_ENFORCE_EQ(10, t.data<int>()[i]); PADDLE_ENFORCE_EQ(10, t.data<int>()[i],
paddle::platform::errors::InvalidArgument(
"Each value of input"
"tensor should be 10, but received %d.",
t.data<int>()[i]));
} }
delete ctx; delete ctx;
} }
......
...@@ -18,7 +18,12 @@ ...@@ -18,7 +18,12 @@
void fill_fp16_data(paddle::platform::float16* in_ptr, size_t size, void fill_fp16_data(paddle::platform::float16* in_ptr, size_t size,
const std::vector<float>& data) { const std::vector<float>& data) {
PADDLE_ENFORCE_EQ(size, data.size()); PADDLE_ENFORCE_EQ(
size, data.size(),
paddle::platform::errors::InvalidArgument(
"The size of argument data should"
" be equal to the argument size. Expected %d, but received %d.",
size, data.size()));
for (size_t i = 0; i < data.size(); ++i) { for (size_t i = 0; i < data.size(); ++i) {
in_ptr[i] = paddle::platform::float16(data[i]); in_ptr[i] = paddle::platform::float16(data[i]);
} }
......
...@@ -85,8 +85,9 @@ void PaddingFunctor(int rank, const framework::ExecutionContext& context, ...@@ -85,8 +85,9 @@ void PaddingFunctor(int rank, const framework::ExecutionContext& context,
PadFunction<DeviceContext, T, 6>(context, pads, src, pad_value, out); PadFunction<DeviceContext, T, 6>(context, pads, src, pad_value, out);
break; break;
default: default:
PADDLE_THROW( PADDLE_THROW(platform::errors::Unimplemented(
"PadOp only support tensors with no more than 6 dimensions."); "PadOp only support tensors with no more"
" than 6 dimensions currently."));
} }
} }
...@@ -114,8 +115,9 @@ void PaddingGradFunctor(int rank, const framework::ExecutionContext& context, ...@@ -114,8 +115,9 @@ void PaddingGradFunctor(int rank, const framework::ExecutionContext& context,
PadGradFunction<DeviceContext, T, 6>(context, pads, src, out); PadGradFunction<DeviceContext, T, 6>(context, pads, src, out);
break; break;
default: default:
PADDLE_THROW( PADDLE_THROW(platform::errors::Unimplemented(
"PadOp only support tensors with no more than 6 dimensions."); "PadOp only support tensors with no more"
" than 6 dimensions currently."));
} }
} }
......
...@@ -19,6 +19,8 @@ limitations under the License. */ ...@@ -19,6 +19,8 @@ limitations under the License. */
#include <random> #include <random>
#include <vector> #include <vector>
#include "paddle/fluid/platform/enforce.h"
namespace paddle { namespace paddle {
namespace operators { namespace operators {
namespace math { namespace math {
...@@ -31,7 +33,10 @@ namespace math { ...@@ -31,7 +33,10 @@ namespace math {
class Sampler { class Sampler {
public: public:
explicit Sampler(int64_t range, unsigned int seed = 0UL) : range_(range) { explicit Sampler(int64_t range, unsigned int seed = 0UL) : range_(range) {
// PADDLE_ENFORCE_GT(range, 0, "Range should be greater than 0."); PADDLE_ENFORCE_GT(range, 0, platform::errors::InvalidArgument(
"Range should be"
" greater than 0, but recevied %d.",
range));
if (seed == 0) { if (seed == 0) {
std::random_device r; std::random_device r;
seed_ = r(); seed_ = r();
......
...@@ -34,10 +34,16 @@ class Vol2ColFunctor<platform::CPUDeviceContext, T> { ...@@ -34,10 +34,16 @@ class Vol2ColFunctor<platform::CPUDeviceContext, T> {
const std::vector<int>& strides, const std::vector<int>& strides,
const std::vector<int>& paddings, framework::Tensor* col, const std::vector<int>& paddings, framework::Tensor* col,
const DataLayout data_layout) const { const DataLayout data_layout) const {
PADDLE_ENFORCE_EQ(vol.dims().size(), 4, PADDLE_ENFORCE_EQ(
"The dimension of vol should be 4."); vol.dims().size(), 4,
PADDLE_ENFORCE_EQ(col->dims().size(), 7, platform::errors::InvalidArgument("The dimension of"
"The dimension of col should be 7."); " vol should be 4, but received %d.",
vol.dims().size()));
PADDLE_ENFORCE_EQ(
col->dims().size(), 7,
platform::errors::InvalidArgument("The dimension of"
"col should be 7, but received %d.",
col->dims().size()));
int input_channels = int input_channels =
(data_layout != DataLayout::kNHWC ? vol.dims()[0] : vol.dims()[3]); (data_layout != DataLayout::kNHWC ? vol.dims()[0] : vol.dims()[3]);
...@@ -65,27 +71,33 @@ class Vol2ColFunctor<platform::CPUDeviceContext, T> { ...@@ -65,27 +71,33 @@ class Vol2ColFunctor<platform::CPUDeviceContext, T> {
int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2]; int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2];
int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2]; int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2];
PADDLE_ENFORCE_EQ((input_depth + pad_d_forth + pad_d_back - auto input_depth_tmp = (input_depth + pad_d_forth + pad_d_back -
((dilations[0] * (filter_depth - 1) + 1))) / ((dilations[0] * (filter_depth - 1) + 1))) /
strides[0] + strides[0] +
1, 1;
output_depth, PADDLE_ENFORCE_EQ(
"input_depth and output_depth are " input_depth_tmp, output_depth,
"mismatching."); platform::errors::InvalidArgument(
PADDLE_ENFORCE_EQ((input_height + pad_h_up + pad_h_down - "input_depth(%d) and output_depth(%d) are mismatching.",
((dilations[1] * (filter_height - 1) + 1))) / input_depth_tmp, output_depth));
strides[1] + auto input_height_tmp = (input_height + pad_h_up + pad_h_down -
1, ((dilations[1] * (filter_height - 1) + 1))) /
output_height, strides[1] +
"input_height and output_height are " 1;
"mismatching."); PADDLE_ENFORCE_EQ(
PADDLE_ENFORCE_EQ((input_width + pad_w_left + pad_w_right - input_height_tmp, output_height,
((dilations[2] * (filter_width - 1) + 1))) / platform::errors::InvalidArgument(
strides[2] + "input_height(%d) and output_height(%d) are mismatching.",
1, input_height_tmp, output_height));
output_width, auto input_width_tmp = (input_width + pad_w_left + pad_w_right -
"input_width and output_width are " ((dilations[2] * (filter_width - 1) + 1))) /
"mismatching."); strides[2] +
1;
PADDLE_ENFORCE_EQ(
input_width_tmp, output_width,
platform::errors::InvalidArgument(
"input_width(%d) and output_width(%d) are mismatching.",
input_width_tmp, output_width));
const T* vol_data = vol.data<T>(); const T* vol_data = vol.data<T>();
T* col_data = col->data<T>(); T* col_data = col->data<T>();
...@@ -140,10 +152,16 @@ class Col2VolFunctor<platform::CPUDeviceContext, T> { ...@@ -140,10 +152,16 @@ class Col2VolFunctor<platform::CPUDeviceContext, T> {
const std::vector<int>& strides, const std::vector<int>& strides,
const std::vector<int>& paddings, framework::Tensor* vol, const std::vector<int>& paddings, framework::Tensor* vol,
const DataLayout data_layout) const { const DataLayout data_layout) const {
PADDLE_ENFORCE_EQ(vol->dims().size(), 4, PADDLE_ENFORCE_EQ(
"The dimension of vol should be 4."); vol->dims().size(), 4,
PADDLE_ENFORCE_EQ(col.dims().size(), 7, platform::errors::InvalidArgument("The dimension of vol"
"The dimension of col should be 7."); " should be 4, but received %d.",
vol->dims().size()));
PADDLE_ENFORCE_EQ(
col.dims().size(), 7,
platform::errors::InvalidArgument("The dimension of col"
" should be 7, but received %d.",
col.dims().size()));
int input_channels = int input_channels =
(data_layout != DataLayout::kNHWC ? vol->dims()[0] : vol->dims()[3]); (data_layout != DataLayout::kNHWC ? vol->dims()[0] : vol->dims()[3]);
...@@ -170,27 +188,33 @@ class Col2VolFunctor<platform::CPUDeviceContext, T> { ...@@ -170,27 +188,33 @@ class Col2VolFunctor<platform::CPUDeviceContext, T> {
int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2]; int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2];
int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2]; int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2];
PADDLE_ENFORCE_EQ((input_depth + pad_d_forth + pad_d_back - auto input_depth_tmp = (input_depth + pad_d_forth + pad_d_back -
((dilations[0] * (filter_depth - 1) + 1))) / ((dilations[0] * (filter_depth - 1) + 1))) /
strides[0] + strides[0] +
1, 1;
output_depth, PADDLE_ENFORCE_EQ(input_depth_tmp, output_depth,
"input_depth and output_depth are " platform::errors::InvalidArgument(
"mismatching."); "input_depth(%d)"
PADDLE_ENFORCE_EQ((input_height + pad_h_up + pad_h_down - " and output_depth(%d) are mismatching.",
((dilations[1] * (filter_height - 1) + 1))) / input_depth_tmp, output_depth));
strides[1] + auto input_height_tmp = (input_height + pad_h_up + pad_h_down -
1, ((dilations[1] * (filter_height - 1) + 1))) /
output_height, strides[1] +
"input_height and output_height are " 1;
"mismatching."); PADDLE_ENFORCE_EQ(input_height_tmp, output_height,
PADDLE_ENFORCE_EQ((input_width + pad_w_left + pad_w_right - platform::errors::InvalidArgument(
((dilations[2] * (filter_width - 1) + 1))) / "input_height(%d)"
strides[2] + " and output_height(%d) are mismatching.",
1, input_height_tmp, output_height));
output_width, auto input_width_tmp = (input_width + pad_w_left + pad_w_right -
"input_width and output_width are " ((dilations[2] * (filter_width - 1) + 1))) /
"mismatching."); strides[2] +
1;
PADDLE_ENFORCE_EQ(input_width_tmp, output_width,
platform::errors::InvalidArgument(
"input_width(%d)"
" and output_width(%d) are mismatching.",
input_width_tmp, output_width));
T* vol_data = vol->data<T>(); T* vol_data = vol->data<T>();
const T* col_data = col.data<T>(); const T* col_data = col.data<T>();
......
...@@ -90,10 +90,16 @@ class Vol2ColFunctor<platform::CUDADeviceContext, T> { ...@@ -90,10 +90,16 @@ class Vol2ColFunctor<platform::CUDADeviceContext, T> {
const std::vector<int>& strides, const std::vector<int>& strides,
const std::vector<int>& paddings, framework::Tensor* col, const std::vector<int>& paddings, framework::Tensor* col,
const DataLayout data_layout) const { const DataLayout data_layout) const {
PADDLE_ENFORCE_EQ(vol.dims().size(), 4, PADDLE_ENFORCE_EQ(
"The dimension of vol should be 4."); vol.dims().size(), 4,
PADDLE_ENFORCE_EQ(col->dims().size(), 7, platform::errors::InvalidArgument("The dimension of"
"The dimension of col should be 7."); " vol should be 4, but received %d.",
vol.dims().size()));
PADDLE_ENFORCE_EQ(
col->dims().size(), 7,
platform::errors::InvalidArgument("The dimension of"
"col should be 7, but received %d.",
col->dims().size()));
int input_channels = int input_channels =
(data_layout != DataLayout::kNHWC ? vol.dims()[0] : vol.dims()[3]); (data_layout != DataLayout::kNHWC ? vol.dims()[0] : vol.dims()[3]);
...@@ -117,27 +123,33 @@ class Vol2ColFunctor<platform::CUDADeviceContext, T> { ...@@ -117,27 +123,33 @@ class Vol2ColFunctor<platform::CUDADeviceContext, T> {
int pad_h_down = paddings_size_is_6 ? paddings[3] : paddings[1]; int pad_h_down = paddings_size_is_6 ? paddings[3] : paddings[1];
int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2]; int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2];
int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2]; int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2];
PADDLE_ENFORCE_EQ((input_depth + pad_d_forth + pad_d_back - auto input_depth_tmp = (input_depth + pad_d_forth + pad_d_back -
((dilations[0] * (filter_depth - 1) + 1))) / ((dilations[0] * (filter_depth - 1) + 1))) /
strides[0] + strides[0] +
1, 1;
output_depth, PADDLE_ENFORCE_EQ(
"input_depth and output_depth are " input_depth_tmp, output_depth,
"mismatching."); platform::errors::InvalidArgument(
PADDLE_ENFORCE_EQ((input_height + pad_h_up + pad_h_down - "input_depth(%d) and output_depth(%d) are mismatching.",
((dilations[1] * (filter_height - 1) + 1))) / input_depth_tmp, output_depth));
strides[1] + auto input_height_tmp = (input_height + pad_h_up + pad_h_down -
1, ((dilations[1] * (filter_height - 1) + 1))) /
output_height, strides[1] +
"input_height and output_height are " 1;
"mismatching."); PADDLE_ENFORCE_EQ(
PADDLE_ENFORCE_EQ((input_width + pad_w_left + pad_w_right - input_height_tmp, output_height,
((dilations[2] * (filter_width - 1) + 1))) / platform::errors::InvalidArgument(
strides[2] + "input_height(%d) and output_height(%d) are mismatching.",
1, input_height_tmp, output_height));
output_width, auto input_width_tmp = (input_width + pad_w_left + pad_w_right -
"input_width and output_width are " ((dilations[2] * (filter_width - 1) + 1))) /
"mismatching."); strides[2] +
1;
PADDLE_ENFORCE_EQ(
input_width_tmp, output_width,
platform::errors::InvalidArgument(
"input_width(%d) and output_width(%d) are mismatching.",
input_width_tmp, output_width));
int num_outputs = int num_outputs =
input_channels * output_depth * output_height * output_width; input_channels * output_depth * output_height * output_width;
...@@ -241,10 +253,16 @@ class Col2VolFunctor<platform::CUDADeviceContext, T> { ...@@ -241,10 +253,16 @@ class Col2VolFunctor<platform::CUDADeviceContext, T> {
const std::vector<int>& strides, const std::vector<int>& strides,
const std::vector<int>& paddings, framework::Tensor* vol, const std::vector<int>& paddings, framework::Tensor* vol,
const DataLayout data_layout) const { const DataLayout data_layout) const {
PADDLE_ENFORCE_EQ(vol->dims().size(), 4, PADDLE_ENFORCE_EQ(
"The dimension of vol should be 4."); vol->dims().size(), 4,
PADDLE_ENFORCE_EQ(col.dims().size(), 7, platform::errors::InvalidArgument("The dimension of vol"
"The dimension of col should be 7."); " should be 4, but received %d.",
vol->dims().size()));
PADDLE_ENFORCE_EQ(
col.dims().size(), 7,
platform::errors::InvalidArgument("The dimension of col"
" should be 7, but received %d.",
col.dims().size()));
int input_channels = int input_channels =
(data_layout != DataLayout::kNHWC ? vol->dims()[0] : vol->dims()[3]); (data_layout != DataLayout::kNHWC ? vol->dims()[0] : vol->dims()[3]);
...@@ -269,27 +287,33 @@ class Col2VolFunctor<platform::CUDADeviceContext, T> { ...@@ -269,27 +287,33 @@ class Col2VolFunctor<platform::CUDADeviceContext, T> {
int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2]; int pad_w_left = paddings_size_is_6 ? paddings[4] : paddings[2];
int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2]; int pad_w_right = paddings_size_is_6 ? paddings[5] : paddings[2];
PADDLE_ENFORCE_EQ((input_depth + pad_d_forth + pad_d_back - auto input_depth_tmp = (input_depth + pad_d_forth + pad_d_back -
((dilations[0] * (filter_depth - 1) + 1))) / ((dilations[0] * (filter_depth - 1) + 1))) /
strides[0] + strides[0] +
1, 1;
output_depth, PADDLE_ENFORCE_EQ(input_depth_tmp, output_depth,
"input_depth and output_depth are " platform::errors::InvalidArgument(
"mismatching."); "input_depth(%d)"
PADDLE_ENFORCE_EQ((input_height + pad_h_up + pad_h_down - " and output_depth(%d) are mismatching.",
((dilations[1] * (filter_height - 1) + 1))) / input_depth_tmp, output_depth));
strides[1] + auto input_height_tmp = (input_height + pad_h_up + pad_h_down -
1, ((dilations[1] * (filter_height - 1) + 1))) /
output_height, strides[1] +
"input_height and output_height are " 1;
"mismatching."); PADDLE_ENFORCE_EQ(input_height_tmp, output_height,
PADDLE_ENFORCE_EQ((input_width + pad_w_left + pad_w_right - platform::errors::InvalidArgument(
((dilations[2] * (filter_width - 1) + 1))) / "input_height(%d)"
strides[2] + " and output_height(%d) are mismatching.",
1, input_height_tmp, output_height));
output_width, auto input_width_tmp = (input_width + pad_w_left + pad_w_right -
"input_width and output_width are " ((dilations[2] * (filter_width - 1) + 1))) /
"mismatching."); strides[2] +
1;
PADDLE_ENFORCE_EQ(input_width_tmp, output_width,
platform::errors::InvalidArgument(
"input_width(%d)"
" and output_width(%d) are mismatching.",
input_width_tmp, output_width));
int num_kernels = input_channels * input_depth * input_height * input_width; int num_kernels = input_channels * input_depth * input_height * input_width;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册