diff --git a/paddle/operators/cross_entropy_op.cu b/paddle/operators/cross_entropy_op.cu index 5f5d2692670b80de9af2a0e8c679f42e35a27426..d999bfce58c8a6db5c811aad677c07094b881841 100644 --- a/paddle/operators/cross_entropy_op.cu +++ b/paddle/operators/cross_entropy_op.cu @@ -21,19 +21,18 @@ namespace operators { using Tensor = framework::Tensor; template -struct clipping_log { - __host__ __device__ T operator()(const T x) { - PADDLE_ASSERT(std::is_floating_point::value); - const T kApproInf = 1e20; - if (x == INFINITY) { - return kApproInf; - } - if (x == -INFINITY) { - return -kApproInf; - } - return x; +__host__ __device__ T clipping_log(const T x) { + PADDLE_ASSERT(std::is_floating_point::value); + const T kApproInf = 1e20; + T v = log(x); + if (v == INFINITY) { + return kApproInf; } -}; + if (v == -INFINITY) { + return -kApproInf; + } + return v; +} template __global__ void CrossEntropyKernel(T* Y, const T* X, const int* label, @@ -43,7 +42,7 @@ __global__ void CrossEntropyKernel(T* Y, const T* X, const int* label, for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x) { PADDLE_ASSERT(label[i] >= 0 && label[i] < D); - Y[i] = -clipping_log()(X[i * D + label[i]]); + Y[i] = -clipping_log(X[i * D + label[i]]); } } diff --git a/paddle/operators/cross_entropy_op.h b/paddle/operators/cross_entropy_op.h index e95f5e11678e2bc5506c7bc52b9ad3dcbb6bba79..eb4d1348de1d940e2648c83c8ba94b289f10c5b2 100644 --- a/paddle/operators/cross_entropy_op.h +++ b/paddle/operators/cross_entropy_op.h @@ -21,7 +21,7 @@ namespace operators { using Tensor = framework::Tensor; template -T tolerable_value(const T x) { +inline T tolerable_value(const T x) { static_assert(std::is_floating_point::value, "tolerable_value works only on float, " "double and double double."); diff --git a/python/paddle/v2/framework/tests/op_test_util.py b/python/paddle/v2/framework/tests/op_test_util.py index ae23108dfa4461f3cb11f077277246716f51d6d7..3bc05a0feccbbd3d5e7852d85bd3dc8edaccfd07 100644 --- a/python/paddle/v2/framework/tests/op_test_util.py +++ b/python/paddle/v2/framework/tests/op_test_util.py @@ -65,7 +65,7 @@ class OpTestMeta(type): expect = self.outputs[out_name] self.assertTrue( numpy.allclose( - actual, expect, atol=1e-04), + actual, expect, atol=1e-05), "output name: " + out_name + "has diff") obj.test_all = test_all