From fa7ace7cf2859f927c26f1970bbc2f5551532df1 Mon Sep 17 00:00:00 2001 From: Guo Sheng Date: Fri, 10 Jan 2020 18:41:41 +0800 Subject: [PATCH] Cherry pick from #21862 (#22194) * Fix default label dim of label_smooth_op. test=develop (#21862) * Fix unit tests of label_smooth_op's data size. --- paddle/fluid/operators/label_smooth_op.cc | 2 +- paddle/fluid/operators/label_smooth_op.cu | 4 ++-- paddle/fluid/operators/label_smooth_op.h | 4 ++-- .../tests/unittests/test_label_smooth_op.py | 20 ++++++++++++++++++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/paddle/fluid/operators/label_smooth_op.cc b/paddle/fluid/operators/label_smooth_op.cc index 6d0af573184..588582266c4 100644 --- a/paddle/fluid/operators/label_smooth_op.cc +++ b/paddle/fluid/operators/label_smooth_op.cc @@ -37,7 +37,7 @@ class LabelSmoothOp : public framework::OperatorWithKernel { auto noise_dims = ctx->GetInputDim("PriorDist"); auto noise_numel = paddle::framework::product(noise_dims); PADDLE_ENFORCE( - in_dims[1] == noise_numel, + in_dims[in_dims.size() - 1] == noise_numel, "The number of elements in Input(PriorDist) must be equal to the " "dimension of each label."); } diff --git a/paddle/fluid/operators/label_smooth_op.cu b/paddle/fluid/operators/label_smooth_op.cu index 89f1d28e998..33ae35a81f8 100644 --- a/paddle/fluid/operators/label_smooth_op.cu +++ b/paddle/fluid/operators/label_smooth_op.cu @@ -34,7 +34,7 @@ __global__ void LabelSmoothRunDistKernel(const int N, const float epsilon, const T* dist_data, T* dst) { int idx = blockDim.x * blockIdx.x + threadIdx.x; for (; idx < N; idx += blockDim.x * gridDim.x) { - int dist_idx = idx - (idx / dist_numel) * dist_numel; + int dist_idx = idx % dist_numel; dst[idx] = static_cast(1 - epsilon) * src[idx] + static_cast(epsilon) * dist_data[dist_idx]; } @@ -56,7 +56,7 @@ class LabelSmoothGPUKernel : public framework::OpKernel { auto* out_t = ctx.Output("Out"); auto* in_t = ctx.Input("X"); auto* dist_t = ctx.Input("PriorDist"); - auto label_dim = in_t->dims()[1]; + auto label_dim = in_t->dims()[in_t->dims().size() - 1]; auto epsilon = ctx.Attr("epsilon"); auto& dev = *ctx.template device_context().eigen_device(); auto size_prob = in_t->numel(); diff --git a/paddle/fluid/operators/label_smooth_op.h b/paddle/fluid/operators/label_smooth_op.h index f3da17de011..760d542505e 100644 --- a/paddle/fluid/operators/label_smooth_op.h +++ b/paddle/fluid/operators/label_smooth_op.h @@ -27,7 +27,7 @@ class LabelSmoothKernel : public framework::OpKernel { auto* out_t = ctx.Output("Out"); auto* in_t = ctx.Input("X"); auto* dist_t = ctx.Input("PriorDist"); - auto label_dim = in_t->dims()[1]; + auto label_dim = in_t->dims()[in_t->dims().size() - 1]; out_t->mutable_data(ctx.GetPlace()); auto epsilon = ctx.Attr("epsilon"); @@ -39,7 +39,7 @@ class LabelSmoothKernel : public framework::OpKernel { out.device(dev) = static_cast(1 - epsilon) * in + static_cast(epsilon) * - dist.broadcast(Eigen::DSizes(in_t->numel())); + dist.broadcast(Eigen::DSizes(in_t->numel() / label_dim)); } else { out.device(dev) = static_cast(1 - epsilon) * in + static_cast(epsilon / label_dim); diff --git a/python/paddle/fluid/tests/unittests/test_label_smooth_op.py b/python/paddle/fluid/tests/unittests/test_label_smooth_op.py index 62d385bc52c..222e1321fec 100644 --- a/python/paddle/fluid/tests/unittests/test_label_smooth_op.py +++ b/python/paddle/fluid/tests/unittests/test_label_smooth_op.py @@ -23,7 +23,7 @@ class TestLabelSmoothOp(OpTest): def config(self): self.op_type = "label_smooth" self.epsilon = 0.1 - batch_size, self.label_dim = 5, 10 + batch_size, self.label_dim = 10, 12 self.label = np.zeros((batch_size, self.label_dim)).astype("float64") nonzero_index = np.random.randint(self.label_dim, size=(batch_size)) self.label[np.arange(batch_size), nonzero_index] = 1 @@ -53,5 +53,23 @@ class TestLabelSmoothOpWithPriorDist(TestLabelSmoothOp): self.outputs = {'Out': smoothed_label} +class TestLabelSmoothOp3D(TestLabelSmoothOp): + def setUp(self): + super(TestLabelSmoothOp3D, self).setUp() + self.inputs['X'] = self.inputs['X'].reshape( + [2, -1, self.inputs['X'].shape[-1]]) + self.outputs['Out'] = self.outputs['Out'].reshape(self.inputs['X'] + .shape) + + +class TestLabelSmoothOpWithPriorDist3D(TestLabelSmoothOpWithPriorDist): + def setUp(self): + super(TestLabelSmoothOpWithPriorDist3D, self).setUp() + self.inputs['X'] = self.inputs['X'].reshape( + [2, -1, self.inputs['X'].shape[-1]]) + self.outputs['Out'] = self.outputs['Out'].reshape(self.inputs['X'] + .shape) + + if __name__ == '__main__': unittest.main() -- GitLab