1# Copyright 2020 Huawei Technologies Co., Ltd 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# ============================================================================ 15 16import numpy as np 17import pytest 18 19import mindspore.context as context 20import mindspore.nn as nn 21from mindspore import Tensor 22from mindspore.ops import composite as C 23from mindspore.ops import operations as P 24 25context.set_context(mode=context.GRAPH_MODE, device_target="GPU") 26 27 28class Net(nn.Cell): 29 def __init__(self, reduction="none"): 30 super(Net, self).__init__() 31 self.KLDivLoss = P.KLDivLoss("none") 32 33 def construct(self, x, y): 34 return self.KLDivLoss(x, y) 35 36 37@pytest.mark.level0 38@pytest.mark.platform_x86_gpu_training 39@pytest.mark.env_onecard 40def test_binary_cross_entropy_loss(): 41 np.random.seed(42) 42 prediction = np.random.rand(20).astype(np.float32) 43 target = np.random.rand(20).astype(np.float32) 44 net = Net() 45 loss = net(Tensor(prediction), Tensor(target)) 46 expect = [-0.5297444, -0.40738472, -0.5733339, -0.58720195, -0.42922008, -0.31237593, 47 -0.3332863, -0.78742254, -0.6662671, -0.17546377, -0.31526336, -0.46702948, 48 -0.23191005, -0.2512708, -0.20934652, -0.32021108, -0.45477402, -0.278453, 49 -0.5551879, -0.48938933] 50 assert np.allclose(loss.asnumpy(), expect) 51 52 53class Grad(nn.Cell): 54 def __init__(self, network): 55 super(Grad, self).__init__() 56 self.grad = C.GradOperation(get_all=True, sens_param=True) 57 self.network = network 58 59 def construct(self, x1, x2, sens): 60 gout = self.grad(self.network)(x1, x2, sens) 61 return gout 62 63 64@pytest.mark.level0 65@pytest.mark.platform_x86_gpu_training 66@pytest.mark.env_onecard 67def test_binary_cross_entropy_loss_grad(): 68 np.random.seed(42) 69 prediction = np.random.rand(20).astype(np.float32) 70 target = np.random.rand(20).astype(np.float32) 71 sens = np.random.rand(20).astype(np.float32) 72 grad = Grad(Net()) 73 dx = grad(Tensor(prediction), Tensor(target), Tensor(sens)) 74 75 dx1_expect = [-0.07466945, -0.06907414, -0.01004642, -0.3331403, -0.11802178, -0.52019656, 76 -0.06224053, -0.2674369, -0.32387912, -0.00858657, -0.58906615, -0.13217884, 77 -0.06111591, -0.8490888, -0.57735133, -0.7452407, -0.02695603, -0.01914206, 78 -0.03094601, -0.14319494] 79 80 dx2_expect = [0.0163771, -0.950962, -0.03309895, -0.5481312, 0.01523498, 0.39894313, 81 -0.20858267, -0.27628726, -0.06815486, -0.5134226, 0.46645382, -1.3477919, 82 -2.409831, 0.65787154, 0.4682768, 0.55671424, -0.04362264, -0.36274382, 83 0.00852979, -0.03639247] 84 85 assert np.allclose(dx[0].asnumpy(), dx1_expect) 86 assert np.allclose(dx[1].asnumpy(), dx2_expect) 87