From 628ff34b6c6070bd40f0240566c900483f160f4d Mon Sep 17 00:00:00 2001 From: whs Date: Sun, 26 Sep 2021 13:41:03 +0800 Subject: [PATCH] Fix FPE of label smooth op (#35861) --- paddle/fluid/operators/label_smooth_op.h | 43 +++++++++++++----------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/paddle/fluid/operators/label_smooth_op.h b/paddle/fluid/operators/label_smooth_op.h index 760d542505e..6b509eb64cc 100644 --- a/paddle/fluid/operators/label_smooth_op.h +++ b/paddle/fluid/operators/label_smooth_op.h @@ -29,20 +29,21 @@ class LabelSmoothKernel : public framework::OpKernel { auto* dist_t = ctx.Input("PriorDist"); auto label_dim = in_t->dims()[in_t->dims().size() - 1]; out_t->mutable_data(ctx.GetPlace()); - - auto epsilon = ctx.Attr("epsilon"); - auto out = framework::EigenVector::Flatten(*out_t); - auto in = framework::EigenVector::Flatten(*in_t); - auto& dev = *ctx.template device_context().eigen_device(); - if (dist_t) { - auto dist = framework::EigenVector::Flatten(*dist_t); - out.device(dev) = - static_cast(1 - epsilon) * in + - static_cast(epsilon) * - dist.broadcast(Eigen::DSizes(in_t->numel() / label_dim)); - } else { - out.device(dev) = static_cast(1 - epsilon) * in + - static_cast(epsilon / label_dim); + if (label_dim != 0) { + auto epsilon = ctx.Attr("epsilon"); + auto out = framework::EigenVector::Flatten(*out_t); + auto in = framework::EigenVector::Flatten(*in_t); + auto& dev = *ctx.template device_context().eigen_device(); + if (dist_t) { + auto dist = framework::EigenVector::Flatten(*dist_t); + out.device(dev) = static_cast(1 - epsilon) * in + + static_cast(epsilon) * + dist.broadcast(Eigen::DSizes( + in_t->numel() / label_dim)); + } else { + out.device(dev) = static_cast(1 - epsilon) * in + + static_cast(epsilon / label_dim); + } } } }; @@ -54,13 +55,15 @@ class LabelSmoothGradKernel : public framework::OpKernel { auto* d_out_t = ctx.Input(framework::GradVarName("Out")); auto* d_in_t = ctx.Output(framework::GradVarName("X")); d_in_t->mutable_data(ctx.GetPlace()); + auto d_out_dim = d_out_t->dims()[d_out_t->dims().size() - 1]; + if (d_out_dim != 0) { + auto d_out = framework::EigenVector::Flatten(*d_out_t); + auto d_in = framework::EigenVector::Flatten(*d_in_t); - auto d_out = framework::EigenVector::Flatten(*d_out_t); - auto d_in = framework::EigenVector::Flatten(*d_in_t); - - auto epsilon = ctx.Attr("epsilon"); - auto& dev = *ctx.template device_context().eigen_device(); - d_in.device(dev) = static_cast(1 - epsilon) * d_out; + auto epsilon = ctx.Attr("epsilon"); + auto& dev = *ctx.template device_context().eigen_device(); + d_in.device(dev) = static_cast(1 - epsilon) * d_out; + } } }; } // namespace operators -- GitLab