test_cross_entropy_loss.py 71.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# 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.

from __future__ import print_function

import paddle
import paddle.fluid as fluid
import numpy as np
import unittest
21 22
from test_softmax_op import stable_softmax
from test_softmax_with_cross_entropy_op import cross_entropy
R
root 已提交
23
from paddle.fluid import Program, program_guard
24
from paddle.fluid.framework import _test_eager_guard
25 26


27
def log_softmax(x, axis=-1):
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    softmax_out = np.apply_along_axis(stable_softmax, axis, x)
    return np.log(softmax_out)


def cross_entropy_loss_1d(input,
                          label,
                          weight=None,
                          reduction='mean',
                          ignore_index=-100):
    log_softmax_out = log_softmax(input)
    input_shape = log_softmax_out.shape
    N = input_shape[0]
    C = input_shape[1]
    out = np.zeros_like(label).astype(np.float64)
    total_weight = 0
43 44
    ###1. compute softmax cross_entropy (with weight)
    ###   Note: only support hard labels.
45 46 47 48 49 50 51 52
    for i in range(N):
        cur_target = label[i]
        if cur_target == ignore_index:
            out[i] = 0
            continue
        cur_weight = weight[cur_target] if weight is not None else 1
        total_weight += cur_weight
        out[i] = -log_softmax_out[i][cur_target] * cur_weight
53

H
HydrogenSulfate 已提交
54
    ###2. deal with reduction
55 56 57
    if reduction == 'sum':
        return np.sum(out), np.array([total_weight]).astype('float64')
    elif reduction == 'mean':
58 59
        out = out.sum() / total_weight if total_weight != 0 else out.sum()
        return out, np.array([total_weight]).astype('float64')
60 61 62 63 64 65 66 67 68 69 70 71
    elif reduction == 'none':
        return out


def cross_entropy_loss_2d(input,
                          label,
                          weight=None,
                          reduction='mean',
                          ignore_index=-100):
    log_softmax_out = log_softmax(input)
    input_shape = log_softmax_out.shape
    N = input_shape[0]
72 73 74
    H = input_shape[1]
    W = input_shape[2]

75 76 77 78 79 80 81 82 83 84 85
    out = np.zeros_like(label).astype(np.float64)
    total_weight = 0
    for i in range(N):
        for h in range(H):
            for w in range(W):
                cur_target = label[i][h][w]
                if cur_target == ignore_index:
                    out[i][h][w] = 0
                    continue
                cur_weight = weight[cur_target] if weight is not None else 1
                total_weight += cur_weight
86 87
                out[i][h][
                    w] = -log_softmax_out[i][h][w][cur_target] * cur_weight
88 89 90
    if reduction == 'sum':
        return np.sum(out), np.array([total_weight]).astype('float64')
    elif reduction == 'mean':
91 92
        out = out.sum() / total_weight if total_weight != 0 else out.sum()
        return out, np.array([total_weight]).astype('float64')
93 94 95 96
    elif reduction == 'none':
        return out


97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
def cross_entropy_soft(softmax,
                       label,
                       axis,
                       N,
                       weight=None,
                       reduction='mean',
                       ignore_index=-100):
    #1.loss
    loss = cross_entropy(
        softmax,
        label,
        True,  #soft_label,
        axis,
        ignore_index)

    if weight is None and reduction == 'none':
        return loss

    #2.weight
    weighted_loss = loss
    total_weight = N  #for weight is None
    if weight is not None:
        weighted_loss = np.zeros_like(loss).astype(np.float64)
        total_weight = 0
        for i in range(N):
            cur_soft_label = label[i]
            cur_weight = np.dot(weight, cur_soft_label)
            total_weight += cur_weight
            weighted_loss[i] = loss[i] * cur_weight

    #3.reduce
    if reduction == 'none':
        return weighted_loss

    elif reduction == 'mean':
        weighted_loss_sum = np.sum(weighted_loss)
        weighted_loss_mean = weighted_loss_sum / total_weight
        return weighted_loss_mean

    else:
        weighted_loss_sum = np.sum(weighted_loss)
        return weighted_loss_sum


def cross_entropy_soft_2d(softmax,
                          label,
                          axis,
                          N,
                          H,
                          W,
                          weight=None,
                          reduction='mean',
                          ignore_index=-100):
    #1.loss
    loss = cross_entropy(
        softmax,
        label,
        True,  #soft_label,
        axis,
        ignore_index)

    if weight is None and reduction == 'none':
        return loss

    #2.weight
    weighted_loss = loss
    total_weight = N  #for weight is None
    if weight is not None:
        weighted_loss = np.zeros_like(loss).astype(np.float64)
        total_weight = 0
        for i in range(N):
            for h in range(H):
                for w in range(W):
                    cur_soft_label = label[i][h][w]
                    cur_weight = np.dot(weight, cur_soft_label)
                    total_weight += cur_weight
                    weighted_loss[i][h][w] = loss[i][h][w] * cur_weight

    #3.reduce
    if reduction == 'none':
        return weighted_loss

    elif reduction == 'mean':
        weighted_loss_sum = np.sum(weighted_loss)
        weighted_loss_mean = weighted_loss_sum / total_weight
        return weighted_loss_mean

    else:
        weighted_loss_sum = np.sum(weighted_loss)
        return weighted_loss_sum


189
class CrossEntropyLoss(unittest.TestCase):
190

R
ronnywang 已提交
191 192 193
    def setUp(self):
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
194 195 196 197 198

    ###test for deprecated softmax_with_cross_entropy
    def test_softmax_with_cross_entropy(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
199 200
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 4
        self.C = 3
        self.shape = [self.N, self.C]
        self.use_softmax = True
        self.reduction = 'none'
        self.weight = None
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        self.labels = np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype)
        self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)

217 218 219 220 221 222 223
        expected = cross_entropy_soft(softmax,
                                      self.labels,
                                      self.axis,
                                      self.N,
                                      weight=self.weight,
                                      reduction=self.reduction,
                                      ignore_index=self.ignore_index)
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

        paddle.set_device("cpu")

        paddle.disable_static()
        paddle_loss_swce = paddle.nn.functional.softmax_with_cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis)

        paddle_loss_ce = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=fluid.dygraph.to_variable(self.weight)
            if self.weight is not None else None,
            reduction=self.reduction)

243 244 245 246
        np.testing.assert_allclose(paddle_loss_swce.numpy(),
                                   expected,
                                   rtol=1e-05)
        np.testing.assert_allclose(paddle_loss_ce.numpy(), expected, rtol=1e-05)
247 248 249 250 251 252

    ###soft_label test start
    ###soft_label test 1
    def test_cross_entropy_loss_soft_1d(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
253 254
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 4
        self.C = 3
        self.shape = [self.N, self.C]
        self.use_softmax = True
        self.reduction = 'none'
        self.weight = None
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        self.labels = np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype)
        self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)

271 272 273 274 275 276 277
        expected = cross_entropy_soft(softmax,
                                      self.labels,
                                      self.axis,
                                      self.N,
                                      weight=self.weight,
                                      reduction=self.reduction,
                                      ignore_index=self.ignore_index)
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296

        paddle.set_device("cpu")

        #2. dygraph
        paddle.disable_static()
        paddle_loss_none_weight = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=fluid.dygraph.to_variable(self.weight)
            if self.weight is not None else None,
            reduction=self.reduction)
        dy_ret_value = paddle_loss_none_weight.numpy()

        #3. static
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
297 298
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
299
        with fluid.program_guard(prog, startup_prog):
300 301 302 303 304 305
            input = fluid.data(name='input',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
            label = fluid.data(name='label',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320

            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction=self.reduction, soft_label=True)
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': self.logits,
                                     'label': self.labels,
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        paddle.disable_static()

321 322
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
323 324 325 326 327

    ###soft_label test 2
    def test_cross_entropy_loss_soft_1d_weight(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
328 329
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 4
        self.C = 3
        self.shape = [self.N, self.C]
        self.use_softmax = True
        self.reduction = 'none'
        self.weight = np.random.uniform(0.1, 1.0, self.C).astype(self.dtype)
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        if self.soft_label:
            self.labels = np.random.uniform(0.1, 1.0,
                                            self.shape).astype(self.dtype)
            self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)
        else:
            axis_dim = self.shape[self.axis]
            self.shape[self.axis] = 1
350 351 352 353
            self.labels = np.random.randint(0,
                                            axis_dim,
                                            self.shape,
                                            dtype="int64")
354 355

        #1. numpy
356 357 358 359 360 361 362
        expected = cross_entropy_soft(softmax,
                                      self.labels,
                                      self.axis,
                                      self.N,
                                      weight=self.weight,
                                      reduction=self.reduction,
                                      ignore_index=self.ignore_index)
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380

        paddle.set_device("cpu")

        #2. dygraph
        paddle.disable_static()
        paddle_loss_none_weight = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=fluid.dygraph.to_variable(self.weight),
            reduction=self.reduction)
        dy_ret_value = paddle_loss_none_weight.numpy()

        # 3.static
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
381 382
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
383
        with fluid.program_guard(prog, startup_prog):
384 385 386 387 388 389
            input = fluid.data(name='input',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
            label = fluid.data(name='label',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
R
ronnywang 已提交
390
            weight = fluid.data(name='weight', shape=[self.C], dtype=self.dtype)
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406

            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction=self.reduction, soft_label=True)
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': self.logits,
                                     'label': self.labels,
                                     "weight": self.weight
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        paddle.disable_static()

407 408
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
409 410 411 412 413

    ###soft_label test 3
    def test_cross_entropy_loss_soft_1d_mean(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
414 415
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 4
        self.C = 3
        self.shape = [self.N, self.C]
        self.use_softmax = True
        self.reduction = 'mean'
        self.weight = None
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        self.labels = np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype)
        self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)

        #1. numpy
433 434 435 436 437 438 439
        expected = cross_entropy_soft(softmax,
                                      self.labels,
                                      self.axis,
                                      self.N,
                                      weight=self.weight,
                                      reduction=self.reduction,
                                      ignore_index=self.ignore_index)
440 441 442

        paddle.set_device("cpu")

H
HydrogenSulfate 已提交
443
        #2 dygraph
444 445 446 447 448 449 450 451 452 453 454 455 456 457
        paddle.disable_static()
        paddle_loss_mean = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=self.weight,
            reduction=self.reduction)
        dy_ret_value = paddle_loss_mean.numpy()

        #3. static
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
458 459
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
460
        with fluid.program_guard(prog, startup_prog):
461 462 463 464 465 466
            input = fluid.data(name='input',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
            label = fluid.data(name='label',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
467 468 469 470 471 472

            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction=self.reduction, soft_label=True)
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
473 474 475 476 477 478
            static_ret = exe.run(prog,
                                 feed={
                                     'input': self.logits,
                                     'label': self.labels
                                 },
                                 fetch_list=[ret])
479 480 481
            self.assertIsNotNone(static_ret)
        paddle.disable_static()

482 483
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
484 485 486 487 488

    ###soft_label test 4
    def test_cross_entropy_loss_soft_1d_weight_mean(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
489 490
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 4
        self.C = 3
        self.shape = [self.N, self.C]
        self.use_softmax = True
        self.reduction = 'mean'
        self.weight = np.random.uniform(0.1, 1.0, self.C).astype(self.dtype)
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        self.labels = np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype)
        self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)

        #1. numpy
508 509 510 511 512 513 514
        expected = cross_entropy_soft(softmax,
                                      self.labels,
                                      self.axis,
                                      self.N,
                                      weight=self.weight,
                                      reduction=self.reduction,
                                      ignore_index=self.ignore_index)
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532

        paddle.set_device("cpu")
        paddle.disable_static()

        #2. dygraph
        paddle_loss_none_weight = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=fluid.dygraph.to_variable(self.weight),
            reduction=self.reduction)
        dy_ret_value = paddle_loss_none_weight.numpy()

        #3. static
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
533 534
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
535
        with fluid.program_guard(prog, startup_prog):
536 537 538 539 540 541
            input = fluid.data(name='input',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
            label = fluid.data(name='label',
                               shape=[self.N, self.C],
                               dtype=self.dtype)
R
ronnywang 已提交
542
            weight = fluid.data(name='weight', shape=[self.C], dtype=self.dtype)
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557

            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction=self.reduction, soft_label=True)
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': self.logits,
                                     'label': self.labels,
                                     "weight": self.weight
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        paddle.disable_static()

558 559
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
560 561 562 563

    ###soft_label test 5
    def test_cross_entropy_loss_soft_2d(self):

H
hong 已提交
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
        def inner_cross_entropy_loss_soft_2d(soft_label):
            self.numeric_stable_mode = False
            self.soft_label = soft_label
            self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
            ) else 'float64'
            self.axis = -1
            self.ignore_index = -100  #should not be changed
            self.N = 3
            self.H = 2
            self.W = 2
            self.C = 5
            self.shape = [self.N, self.H, self.W, self.C]
            self.use_softmax = True
            self.reduction = 'none'
            self.weight = None
            self.logits = getattr(
                self, "logits",
                np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
            softmax = np.apply_along_axis(stable_softmax, self.axis,
                                          self.logits)
584

H
hong 已提交
585 586 587
            self.labels = np.random.uniform(0.1, 1.0,
                                            self.shape).astype(self.dtype)
            self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)
588

H
hong 已提交
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
            #1. numpy
            expected = cross_entropy_soft_2d(softmax,
                                             self.labels,
                                             self.axis,
                                             self.N,
                                             self.H,
                                             self.W,
                                             weight=self.weight,
                                             reduction=self.reduction,
                                             ignore_index=self.ignore_index)

            paddle.set_device("cpu")
            paddle.disable_static()

            #2. dygraph
            paddle_loss_none_weight = paddle.nn.functional.cross_entropy(
                fluid.dygraph.to_variable(self.logits),
                fluid.dygraph.to_variable(self.labels),
                soft_label=True,
                axis=self.axis,
                weight=fluid.dygraph.to_variable(self.weight)
                if self.weight is not None else None,
                reduction=self.reduction)
            dy_ret_value = paddle_loss_none_weight.numpy()

            #3. static
            paddle.enable_static()
            prog = fluid.Program()
            startup_prog = fluid.Program()
            place = fluid.CUDAPlace(
                0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
            with fluid.program_guard(prog, startup_prog):
                input = fluid.data(name='input',
                                   shape=[self.N, self.H, self.W, self.C],
                                   dtype=self.dtype)
                label = fluid.data(name='label',
                                   shape=[self.N, self.H, self.W, self.C],
                                   dtype=self.dtype)

                cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                    reduction=self.reduction, soft_label=True)
                ret = cross_entropy_loss(input, label)
                exe = fluid.Executor(place)
                static_ret = exe.run(prog,
                                     feed={
                                         'input': self.logits,
                                         'label': self.labels,
                                     },
                                     fetch_list=[ret])
                self.assertIsNotNone(static_ret)
            paddle.disable_static()

            np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
            np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
            np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)

        inner_cross_entropy_loss_soft_2d(True)
        inner_cross_entropy_loss_soft_2d(False)
647 648 649 650 651

    ###soft_label test 6
    def test_cross_entropy_loss_soft_2d_weight_mean(self):
        self.numeric_stable_mode = False
        self.soft_label = True
R
ronnywang 已提交
652 653
        self.dtype = 'float32' if fluid.core.is_compiled_with_rocm(
        ) else 'float64'
654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
        self.axis = -1
        self.ignore_index = -100  #should not be changed
        self.N = 3
        self.H = 2
        self.W = 2
        self.C = 5
        self.shape = [self.N, self.H, self.W, self.C]
        self.use_softmax = True
        self.reduction = 'mean'
        self.weight = np.random.uniform(0.1, 1.0, self.C).astype(self.dtype)
        self.logits = getattr(
            self, "logits",
            np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype))
        softmax = np.apply_along_axis(stable_softmax, self.axis, self.logits)

        self.labels = np.random.uniform(0.1, 1.0, self.shape).astype(self.dtype)
        self.labels /= np.sum(self.labels, axis=self.axis, keepdims=True)

        #1. numpy
673 674 675 676 677 678 679 680 681
        expected = cross_entropy_soft_2d(softmax,
                                         self.labels,
                                         self.axis,
                                         self.N,
                                         self.H,
                                         self.W,
                                         weight=self.weight,
                                         reduction=self.reduction,
                                         ignore_index=self.ignore_index)
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699

        paddle.set_device("cpu")
        paddle.disable_static()

        #2. dygraph
        paddle_loss_none_weight = paddle.nn.functional.cross_entropy(
            fluid.dygraph.to_variable(self.logits),
            fluid.dygraph.to_variable(self.labels),
            soft_label=True,
            axis=self.axis,
            weight=fluid.dygraph.to_variable(self.weight),
            reduction=self.reduction)
        dy_ret_value = paddle_loss_none_weight.numpy()

        #3. static
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
700 701
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
702
        with fluid.program_guard(prog, startup_prog):
703 704 705 706 707 708
            input = fluid.data(name='input',
                               shape=[self.N, self.H, self.W, self.C],
                               dtype=self.dtype)
            label = fluid.data(name='label',
                               shape=[self.N, self.H, self.W, self.C],
                               dtype=self.dtype)
R
ronnywang 已提交
709
            weight = fluid.data(name='weight', shape=[self.C], dtype=self.dtype)
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724

            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction=self.reduction, soft_label=True)
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': self.logits,
                                     'label': self.labels,
                                     "weight": self.weight
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        paddle.disable_static()

725 726 727
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
728 729 730

    ###soft_label test end

731
    def test_cross_entropy_loss_1d_with_mean_ignore(self):
R
ronnywang 已提交
732
        input_np = np.random.random([2, 4]).astype(self.dtype)
733 734 735 736
        label_np = np.random.randint(0, 4, size=(2)).astype(np.int64)
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
737 738
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
739
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
740
            input = fluid.data(name='input', shape=[2, 4], dtype=self.dtype)
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
            label = fluid.data(name='label', shape=[2], dtype='int64')
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(ignore_index=0)
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        expected = cross_entropy_loss_1d(input_np, label_np)[0]

        with fluid.dygraph.guard():
756 757 758 759
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(axis=1,
                                                                 ignore_index=0)
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
760 761 762
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_1d(input_np, label_np, ignore_index=0)[0]
763 764 765
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
766

767 768 769 770 771 772 773 774
    def test_cross_entropy_loss_1d_with_mean_ignore_negative(self):
        N = 100
        C = 200
        input_np = np.random.random([N, C]).astype(self.dtype)
        label_np = -np.ones((N)).astype(np.int64)
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
775 776
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
        with fluid.program_guard(prog, startup_prog):
            input = fluid.data(name='input', shape=[N, C], dtype=self.dtype)
            label = fluid.data(name='label', shape=[N], dtype='int64')
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                ignore_index=-1)
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)

        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                axis=1, ignore_index=-1)
795 796
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
797 798 799 800
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_1d(input_np, label_np, ignore_index=-1)[0]

801 802 803
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
804

805
    def test_cross_entropy_loss_1d_with_weight_mean_ignore(self):
806 807
        N = 100
        C = 200
R
ronnywang 已提交
808
        input_np = np.random.random([N, C]).astype(self.dtype)
809
        label_np = np.random.randint(0, C, size=(N)).astype(np.int64)
R
ronnywang 已提交
810
        weight_np = np.random.random([C]).astype(self.dtype)
811 812 813
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
814 815
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
816
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
817
            input = fluid.data(name='input', shape=[N, C], dtype=self.dtype)
818
            label = fluid.data(name='label', shape=[N], dtype='int64')
819 820 821 822
            weight = fluid.data(name='weight', shape=[C],
                                dtype=self.dtype)  #weight for each class
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(weight=weight,
                                                                 ignore_index=0)
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)

        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np),
                axis=1,
                ignore_index=0)
840 841
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
842 843
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
844 845 846 847
        expected = cross_entropy_loss_1d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         ignore_index=0)[0]
848

849 850 851
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
852

H
HydrogenSulfate 已提交
853 854 855 856 857 858 859 860 861 862
    def test_cross_entropy_loss_1d_with_weight_mean_ignore_exceedlabel(self):
        N = 100
        C = 200
        input_np = np.random.random([N, C]).astype(self.dtype)
        label_np = np.random.randint(0, C, size=(N)).astype(np.int64)
        label_np[0] = 255
        weight_np = np.random.random([C]).astype(self.dtype)

        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
863
                weight=fluid.dygraph.to_variable(weight_np), ignore_index=255)
864 865
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
H
HydrogenSulfate 已提交
866 867
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
868 869 870 871
        expected = cross_entropy_loss_1d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         ignore_index=255)[0]
H
HydrogenSulfate 已提交
872

873
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
H
HydrogenSulfate 已提交
874

875
    def test_cross_entropy_loss_1d_with_weight_mean(self):
R
ronnywang 已提交
876
        input_np = np.random.random([2, 4]).astype(self.dtype)
877
        label_np = np.random.randint(0, 4, size=(2)).astype(np.int64)
R
ronnywang 已提交
878
        weight_np = np.random.random([4]).astype(self.dtype)  #shape:C
879
        paddle.enable_static()
880 881
        prog = fluid.Program()
        startup_prog = fluid.Program()
882 883
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
884
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
885
            input = fluid.data(name='input', shape=[2, 4], dtype=self.dtype)
886
            label = fluid.data(name='label', shape=[2], dtype='int64')
887 888
            weight = fluid.data(name='weight', shape=[4],
                                dtype=self.dtype)  #weight for each class
889 890 891 892 893 894 895 896 897 898 899 900
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(weight=weight)
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
901 902
        expected = cross_entropy_loss_1d(input_np, label_np,
                                         weight=weight_np)[0]
903

904 905
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
906
                weight=fluid.dygraph.to_variable(weight_np), axis=1)
907 908
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
909 910
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
911 912
        expected = cross_entropy_loss_1d(input_np, label_np,
                                         weight=weight_np)[0]
913 914 915
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
916

917
    def test_cross_entropy_loss_1d_with_weight_sum(self):
R
ronnywang 已提交
918
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
919
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N,1
R
ronnywang 已提交
920
        weight_np = np.random.random([200]).astype(self.dtype)  #C
921
        paddle.enable_static()
922 923
        prog = fluid.Program()
        startup_prog = fluid.Program()
924 925
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
926
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
927
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
928
            label = fluid.data(name='label', shape=[100], dtype='int64')
R
ronnywang 已提交
929
            weight = fluid.data(name='weight', shape=[200], dtype=self.dtype)
930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='sum')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np), reduction='sum')
946 947
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
948 949
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
950 951 952 953
        expected = cross_entropy_loss_1d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='sum')[0]
954 955 956
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
957

958
    def test_cross_entropy_loss_1d_with_weight_none(self):
R
ronnywang 已提交
959
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
960
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N,1
R
ronnywang 已提交
961
        weight_np = np.random.random([200]).astype(self.dtype)  #C
962

963
        paddle.enable_static()
964 965
        prog = fluid.Program()
        startup_prog = fluid.Program()
966 967
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
968
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
969
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
970
            label = fluid.data(name='label', shape=[100], dtype='int64')
R
ronnywang 已提交
971
            weight = fluid.data(name='weight', shape=[200], dtype=self.dtype)
972

973 974 975 976 977 978 979 980 981 982 983 984
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='none')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
985
            static_ret = np.squeeze(static_ret)
986 987 988 989
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np), reduction='none')
990 991
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
992
            dy_ret_value = dy_ret.numpy()
993
            dy_ret_value = np.squeeze(dy_ret_value)
994
            self.assertIsNotNone(dy_ret_value)
995 996 997 998
        expected = cross_entropy_loss_1d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='none')
999 1000 1001
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1002 1003

    def test_cross_entropy_loss_1d_with_weight_none_func(self):
R
ronnywang 已提交
1004
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
1005
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N
R
ronnywang 已提交
1006
        weight_np = np.random.random([200]).astype(self.dtype)  #C
1007 1008 1009
        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
1010 1011
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1012
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
1013
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
1014
            label = fluid.data(name='label', shape=[100], dtype='int64')
R
ronnywang 已提交
1015
            weight = fluid.data(name='weight', shape=[200], dtype=self.dtype)
1016 1017 1018 1019
            ret = paddle.nn.functional.cross_entropy(input,
                                                     label,
                                                     weight=weight,
                                                     reduction='none')
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            static_ret = np.squeeze(static_ret)
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            dy_ret = paddle.nn.functional.cross_entropy(
                fluid.dygraph.to_variable(input_np),
                fluid.dygraph.to_variable(label_np),
                weight=fluid.dygraph.to_variable(weight_np),
                reduction='none')
            dy_ret_value = dy_ret.numpy()
            dy_ret_value = np.squeeze(dy_ret_value)
            self.assertIsNotNone(dy_ret_value)
1040 1041 1042 1043
        expected = cross_entropy_loss_1d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='none')
1044 1045 1046
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1047 1048

    def test_cross_entropy_loss_1d_mean(self):
R
ronnywang 已提交
1049
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
1050 1051
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N,1
        paddle.enable_static()
1052 1053
        prog = fluid.Program()
        startup_prog = fluid.Program()
1054 1055
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1056
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
1057
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
1058 1059 1060 1061 1062
            label = fluid.data(name='label', shape=[100], dtype='int64')
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss()
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
1063 1064 1065 1066
                                 feed={
                                     'input': input_np,
                                     'label': label_np
                                 },
1067 1068 1069 1070
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss()
1071 1072
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1073 1074 1075
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_1d(input_np, label_np)[0]
1076 1077 1078
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1079 1080

    def test_cross_entropy_loss_1d_sum(self):
R
ronnywang 已提交
1081
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
1082 1083
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N,1
        paddle.enable_static()
1084 1085
        prog = fluid.Program()
        startup_prog = fluid.Program()
1086 1087
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1088
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
1089
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
1090 1091 1092 1093 1094 1095
            label = fluid.data(name='label', shape=[100], dtype='int64')
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='sum')
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
1096 1097 1098 1099
                                 feed={
                                     'input': input_np,
                                     'label': label_np
                                 },
1100 1101 1102 1103 1104
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='sum')
1105 1106
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1107 1108 1109
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_1d(input_np, label_np, reduction='sum')[0]
1110 1111 1112
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1113 1114

    def test_cross_entropy_loss_1d_none(self):
R
ronnywang 已提交
1115
        input_np = np.random.random([100, 200]).astype(self.dtype)  #N,C
1116 1117
        label_np = np.random.randint(0, 100, size=(100)).astype(np.int64)  #N,1
        paddle.enable_static()
1118 1119
        prog = fluid.Program()
        startup_prog = fluid.Program()
1120 1121
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1122
        with fluid.program_guard(prog, startup_prog):
R
ronnywang 已提交
1123
            input = fluid.data(name='input', shape=[100, 200], dtype=self.dtype)
1124 1125 1126 1127 1128 1129
            label = fluid.data(name='label', shape=[100], dtype='int64')
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='none')
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
1130 1131 1132 1133
                                 feed={
                                     'input': input_np,
                                     'label': label_np
                                 },
1134
                                 fetch_list=[ret])
1135
            static_ret = np.squeeze(static_ret)
1136 1137 1138 1139
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='none')
1140 1141
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1142
            dy_ret_value = dy_ret.numpy()
1143
            dy_ret_value = np.squeeze(dy_ret_value)
1144 1145
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_1d(input_np, label_np, reduction='none')
1146 1147 1148
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1149 1150

    def test_cross_entropy_loss_2d_with_weight_none(self):
R
ronnywang 已提交
1151
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1152 1153
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW1
R
ronnywang 已提交
1154
        weight_np = np.random.random(size=(3, )).astype(self.dtype)  #C
1155 1156

        paddle.enable_static()
1157 1158
        prog = fluid.Program()
        startup_prog = fluid.Program()
1159 1160
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1161
        with fluid.program_guard(prog, startup_prog):
1162 1163 1164
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1165
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
R
ronnywang 已提交
1166
            weight = fluid.data(name='weight', shape=[3], dtype=self.dtype)
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='none')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
1179
            static_ret = np.squeeze(static_ret)
1180 1181 1182 1183
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np), reduction='none')
1184 1185
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1186
            dy_ret_value = dy_ret.numpy()
1187
            dy_ret_value = np.squeeze(dy_ret_value)
1188
            self.assertIsNotNone(dy_ret_value)
1189 1190 1191 1192
        expected = cross_entropy_loss_2d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='none')
1193 1194 1195
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1196 1197 1198

    def test_cross_entropy_loss_2d_with_weight_axis_change_mean(self):
        input_np = np.random.random(size=(2, 3, 2, 2)).astype(self.dtype)  #NCHW
1199 1200
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
1201 1202 1203 1204 1205
        weight_np = np.random.random(size=(3, )).astype(self.dtype)  #C

        paddle.enable_static()
        prog = fluid.Program()
        startup_prog = fluid.Program()
1206 1207
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1208
        with fluid.program_guard(prog, startup_prog):
1209 1210 1211
            input = fluid.data(name='input',
                               shape=[2, 3, 2, 2],
                               dtype=self.dtype)
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
            weight = fluid.data(name='weight', shape=[3], dtype=self.dtype)
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='mean', axis=1)
            # specify the class channels to axis 1
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])

            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
1231 1232 1233
                weight=fluid.dygraph.to_variable(weight_np),
                reduction='mean',
                axis=1)
1234 1235
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1236 1237
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
1238 1239 1240 1241
        expected = cross_entropy_loss_2d(np.transpose(input_np, [0, 2, 3, 1]),
                                         label_np,
                                         weight=weight_np,
                                         reduction='mean')[0]
1242 1243 1244
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1245

H
HydrogenSulfate 已提交
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
    def test_cross_entropy_loss_2d_with_weight_mean_ignore_exceedlabel(self):
        N = 4
        C = 3
        H = 512
        W = 512
        input_np = np.random.random([N, H, W, C]).astype(self.dtype)
        label_np = np.random.randint(0, C, size=(N, H, W)).astype(np.int64)
        label_np[0, 0, 0] = 255
        weight_np = np.random.random([C]).astype(self.dtype)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
1257
                weight=fluid.dygraph.to_variable(weight_np), ignore_index=255)
1258 1259
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
H
HydrogenSulfate 已提交
1260 1261
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
1262 1263 1264 1265
        expected = cross_entropy_loss_2d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         ignore_index=255)[0]
1266
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
H
HydrogenSulfate 已提交
1267

1268
    def test_cross_entropy_loss_2d_with_weight_mean(self):
R
ronnywang 已提交
1269
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1270 1271
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
R
ronnywang 已提交
1272
        weight_np = np.random.random(size=(3, )).astype(self.dtype)  #C
1273
        paddle.enable_static()
1274 1275
        prog = fluid.Program()
        startup_prog = fluid.Program()
1276 1277
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1278
        with fluid.program_guard(prog, startup_prog):
1279 1280 1281
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1282
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
R
ronnywang 已提交
1283
            weight = fluid.data(name='weight', shape=[3], dtype=self.dtype)
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='mean')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np), reduction='mean')
1300 1301
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1302 1303
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
1304 1305 1306 1307
        expected = cross_entropy_loss_2d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='mean')[0]
1308 1309 1310
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1311 1312

    def test_cross_entropy_loss_2d_with_weight_sum(self):
R
ronnywang 已提交
1313
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1314 1315
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
R
ronnywang 已提交
1316
        weight_np = np.random.random(size=(3, )).astype(self.dtype)  #C
1317 1318
        paddle.enable_static()

1319 1320
        prog = fluid.Program()
        startup_prog = fluid.Program()
1321 1322
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1323
        with fluid.program_guard(prog, startup_prog):
1324 1325 1326
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1327
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
R
ronnywang 已提交
1328
            weight = fluid.data(name='weight', shape=[3], dtype=self.dtype)
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=weight, reduction='sum')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                     "weight": weight_np
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                weight=fluid.dygraph.to_variable(weight_np), reduction='sum')
1345 1346
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1347 1348
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
1349 1350 1351 1352
        expected = cross_entropy_loss_2d(input_np,
                                         label_np,
                                         weight=weight_np,
                                         reduction='sum')[0]
1353 1354 1355
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1356 1357

    def test_cross_entropy_loss_2d_none(self):
R
ronnywang 已提交
1358
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1359 1360
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
1361
        paddle.enable_static()
1362 1363
        prog = fluid.Program()
        startup_prog = fluid.Program()
1364 1365
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1366
        with fluid.program_guard(prog, startup_prog):
1367 1368 1369
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1370
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='none')
            ret = cross_entropy_loss(input, label)
            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                 },
                                 fetch_list=[ret])
1381
            static_ret = np.squeeze(static_ret)
1382 1383 1384 1385
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='none')
1386 1387
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1388
            dy_ret_value = dy_ret.numpy()
1389
            dy_ret_value = np.squeeze(dy_ret_value)
1390 1391
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_2d(input_np, label_np, reduction='none')
1392 1393 1394
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1395 1396

    def test_cross_entropy_loss_2d_mean(self):
R
ronnywang 已提交
1397
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1398 1399
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
1400
        paddle.enable_static()
1401 1402
        prog = fluid.Program()
        startup_prog = fluid.Program()
1403 1404
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1405
        with fluid.program_guard(prog, startup_prog):
1406 1407 1408
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1409
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='mean')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='mean')
1425 1426
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1427 1428
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
1429 1430
        expected = cross_entropy_loss_2d(input_np, label_np,
                                         reduction='mean')[0]
1431 1432 1433
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1434 1435

    def test_cross_entropy_loss_2d_sum(self):
R
ronnywang 已提交
1436
        input_np = np.random.random(size=(2, 2, 2, 3)).astype(self.dtype)  #NHWC
1437 1438
        label_np = np.random.randint(0, 3,
                                     size=(2, 2, 2)).astype(np.int64)  #NHW
1439
        paddle.enable_static()
1440 1441
        prog = fluid.Program()
        startup_prog = fluid.Program()
1442 1443
        place = fluid.CUDAPlace(
            0) if fluid.core.is_compiled_with_cuda() else fluid.CPUPlace()
1444
        with fluid.program_guard(prog, startup_prog):
1445 1446 1447
            input = fluid.data(name='input',
                               shape=[2, 2, 2, 3],
                               dtype=self.dtype)
1448
            label = fluid.data(name='label', shape=[2, 2, 2], dtype='int64')
1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='sum')
            ret = cross_entropy_loss(input, label)

            exe = fluid.Executor(place)
            static_ret = exe.run(prog,
                                 feed={
                                     'input': input_np,
                                     'label': label_np,
                                 },
                                 fetch_list=[ret])
            self.assertIsNotNone(static_ret)
        with fluid.dygraph.guard():
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                reduction='sum')
1464 1465
            dy_ret = cross_entropy_loss(fluid.dygraph.to_variable(input_np),
                                        fluid.dygraph.to_variable(label_np))
1466 1467 1468
            dy_ret_value = dy_ret.numpy()
            self.assertIsNotNone(dy_ret_value)
        expected = cross_entropy_loss_2d(input_np, label_np, reduction='sum')[0]
1469 1470 1471
        np.testing.assert_allclose(static_ret[0], dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret[0], expected, rtol=1e-05)
        np.testing.assert_allclose(dy_ret_value, expected, rtol=1e-05)
1472

1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
    def test_soft_1d_dygraph_final_state_api(self):
        with _test_eager_guard():
            self.test_cross_entropy_loss_soft_1d()
            self.test_cross_entropy_loss_soft_1d_weight()
            self.test_cross_entropy_loss_soft_1d_mean()
            self.test_cross_entropy_loss_soft_1d_weight_mean()

    # put all testcases in one test will be failed
    def test_soft_2d_dygraph_final_state_api(self):
        with _test_eager_guard():
            self.test_cross_entropy_loss_soft_2d()
            self.test_cross_entropy_loss_soft_2d_weight_mean()

    def test_other_dygraph_final_state_api(self):
        with _test_eager_guard():
            self.test_cross_entropy_loss_1d_with_mean_ignore()
            self.test_cross_entropy_loss_1d_with_mean_ignore_negative()
            self.test_cross_entropy_loss_1d_with_weight_mean_ignore()
            self.test_cross_entropy_loss_1d_with_weight_mean_ignore_exceedlabel(
            )
            self.test_cross_entropy_loss_1d_with_weight_mean()
            self.test_cross_entropy_loss_1d_with_weight_sum()
            self.test_cross_entropy_loss_1d_with_weight_none()
            self.test_cross_entropy_loss_1d_with_weight_none_func()
            self.test_cross_entropy_loss_1d_mean()
            self.test_cross_entropy_loss_1d_sum()
            self.test_cross_entropy_loss_1d_none()
            self.test_cross_entropy_loss_2d_with_weight_none()
            self.test_cross_entropy_loss_2d_with_weight_axis_change_mean()
            self.test_cross_entropy_loss_2d_with_weight_mean_ignore_exceedlabel(
            )
            self.test_cross_entropy_loss_2d_with_weight_mean()
            self.test_cross_entropy_loss_2d_with_weight_sum()
            self.test_cross_entropy_loss_2d_none()
            self.test_cross_entropy_loss_2d_mean()
            self.test_cross_entropy_loss_2d_sum()

1510

1511
class TestCrossEntropyFAPIError(unittest.TestCase):
1512

1513 1514 1515
    def test_errors(self):
        with program_guard(Program(), Program()):

H
HydrogenSulfate 已提交
1516
            def test_WeightLength_NotEqual():
1517
                input_data = paddle.rand(shape=[20, 100])
1518 1519 1520 1521
                label_data = paddle.randint(0,
                                            100,
                                            shape=[20, 1],
                                            dtype="int64")
H
HydrogenSulfate 已提交
1522
                weight_data = paddle.rand([100 + 1])
1523 1524 1525 1526
                paddle.nn.functional.cross_entropy(input=input_data,
                                                   label=label_data,
                                                   weight=weight_data,
                                                   ignore_index=-100)
H
HydrogenSulfate 已提交
1527

H
HydrogenSulfate 已提交
1528
            self.assertRaises(ValueError, test_WeightLength_NotEqual)
H
HydrogenSulfate 已提交
1529

H
HydrogenSulfate 已提交
1530 1531
            def test_LabelValue_ExceedMax():
                input_data = paddle.rand(shape=[20, 100])
1532 1533 1534 1535
                label_data = paddle.randint(0,
                                            100,
                                            shape=[20, 1],
                                            dtype="int64")
H
HydrogenSulfate 已提交
1536 1537
                label_data[0] = 100
                weight_data = paddle.rand([100])
1538 1539 1540 1541
                paddle.nn.functional.cross_entropy(input=input_data,
                                                   label=label_data,
                                                   weight=weight_data,
                                                   ignore_index=-100)
H
HydrogenSulfate 已提交
1542 1543 1544 1545 1546

            self.assertRaises(ValueError, test_LabelValue_ExceedMax)

            def test_LabelValue_ExceedMin():
                input_data = paddle.rand(shape=[20, 100])
1547 1548 1549 1550
                label_data = paddle.randint(0,
                                            100,
                                            shape=[20, 1],
                                            dtype="int64")
H
HydrogenSulfate 已提交
1551 1552
                label_data[0] = -1
                weight_data = paddle.rand([100])
1553 1554 1555 1556
                paddle.nn.functional.cross_entropy(input=input_data,
                                                   label=label_data,
                                                   weight=weight_data,
                                                   ignore_index=-100)
H
HydrogenSulfate 已提交
1557 1558 1559

            self.assertRaises(ValueError, test_LabelValue_ExceedMin)

H
HydrogenSulfate 已提交
1560
            def static_test_WeightLength_NotEqual():
1561
                input_np = np.random.random([2, 4]).astype('float32')
H
HydrogenSulfate 已提交
1562
                label_np = np.random.randint(0, 4, size=(2)).astype(np.int64)
1563
                weight_np = np.random.random([3]).astype('float32')
H
HydrogenSulfate 已提交
1564 1565 1566 1567 1568 1569
                paddle.enable_static()
                prog = fluid.Program()
                startup_prog = fluid.Program()
                place = fluid.CUDAPlace(0) if fluid.core.is_compiled_with_cuda(
                ) else fluid.CPUPlace()
                with fluid.program_guard(prog, startup_prog):
1570 1571 1572
                    input = fluid.data(name='input',
                                       shape=[2, 4],
                                       dtype='float32')
H
HydrogenSulfate 已提交
1573
                    label = fluid.data(name='label', shape=[2], dtype='int64')
1574 1575 1576
                    weight = fluid.data(name='weight',
                                        shape=[3],
                                        dtype='float32')  #weight for each class
H
HydrogenSulfate 已提交
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
                    cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
                        weight=weight)
                    ret = cross_entropy_loss(input, label)

                    exe = fluid.Executor(place)
                    static_ret = exe.run(prog,
                                         feed={
                                             'input': input_np,
                                             'label': label_np,
                                             "weight": weight_np
                                         },
                                         fetch_list=[ret])
                    self.assertIsNotNone(static_ret)

            self.assertRaises(ValueError, static_test_WeightLength_NotEqual)

1593

1594 1595
if __name__ == "__main__":
    unittest.main()