Add the loss of MarginRankingLoss for the paddle api2.0 (#26078)
add the api and doc for the margin_ranking_loss and MarginRankingLossrevert-24895-update_cub
parent
50a5bcfc9d
commit
682035663a
@ -0,0 +1,178 @@
|
||||
# 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 unittest
|
||||
import numpy as np
|
||||
import paddle
|
||||
import paddle.fluid as fluid
|
||||
import paddle.fluid.core as core
|
||||
from paddle.static import Program, program_guard
|
||||
|
||||
|
||||
def calc_margin_rank_loss(x, y, label, margin=0.0, reduction='none'):
|
||||
result = (-1 * label) * (x - y) + margin
|
||||
result = np.maximum(result, 0)
|
||||
if reduction == 'none':
|
||||
return result
|
||||
elif reduction == 'sum':
|
||||
return np.sum(result)
|
||||
elif reduction == 'mean':
|
||||
return np.mean(result)
|
||||
|
||||
|
||||
def create_test_case(margin, reduction):
|
||||
class MarginRankingLossCls(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.x_data = np.random.rand(10, 10).astype("float64")
|
||||
self.y_data = np.random.rand(10, 10).astype("float64")
|
||||
self.label_data = np.random.choice(
|
||||
[-1, 1], size=[10, 10]).astype("float64")
|
||||
self.places = []
|
||||
self.places.append(fluid.CPUPlace())
|
||||
if core.is_compiled_with_cuda():
|
||||
self.places.append(paddle.CUDAPlace(0))
|
||||
|
||||
def run_static_functional_api(self, place):
|
||||
paddle.enable_static()
|
||||
expected = calc_margin_rank_loss(
|
||||
self.x_data,
|
||||
self.y_data,
|
||||
self.label_data,
|
||||
margin=margin,
|
||||
reduction=reduction)
|
||||
with program_guard(Program(), Program()):
|
||||
x = paddle.nn.data(name="x", shape=[10, 10], dtype="float64")
|
||||
y = paddle.nn.data(name="y", shape=[10, 10], dtype="float64")
|
||||
label = paddle.nn.data(
|
||||
name="label", shape=[10, 10], dtype="float64")
|
||||
result = paddle.nn.functional.margin_ranking_loss(
|
||||
x, y, label, margin, reduction)
|
||||
exe = paddle.static.Executor(place)
|
||||
result_numpy, = exe.run(feed={
|
||||
"x": self.x_data,
|
||||
"y": self.y_data,
|
||||
"label": self.label_data
|
||||
},
|
||||
fetch_list=[result])
|
||||
self.assertTrue(np.allclose(result_numpy, expected))
|
||||
|
||||
def run_static_api(self, place):
|
||||
paddle.enable_static()
|
||||
expected = calc_margin_rank_loss(
|
||||
self.x_data,
|
||||
self.y_data,
|
||||
self.label_data,
|
||||
margin=margin,
|
||||
reduction=reduction)
|
||||
with program_guard(Program(), Program()):
|
||||
x = paddle.nn.data(name="x", shape=[10, 10], dtype="float64")
|
||||
y = paddle.nn.data(name="y", shape=[10, 10], dtype="float64")
|
||||
label = paddle.nn.data(
|
||||
name="label", shape=[10, 10], dtype="float64")
|
||||
margin_rank_loss = paddle.nn.loss.MarginRankingLoss(
|
||||
margin=margin, reduction=reduction)
|
||||
result = margin_rank_loss(x, y, label)
|
||||
exe = paddle.static.Executor(place)
|
||||
result_numpy, = exe.run(feed={
|
||||
"x": self.x_data,
|
||||
"y": self.y_data,
|
||||
"label": self.label_data
|
||||
},
|
||||
fetch_list=[result])
|
||||
self.assertTrue(np.allclose(result_numpy, expected))
|
||||
self.assertTrue('loss' in result.name)
|
||||
|
||||
def run_dynamic_functional_api(self, place):
|
||||
paddle.disable_static(place)
|
||||
x = paddle.to_variable(self.x_data)
|
||||
y = paddle.to_variable(self.y_data)
|
||||
label = paddle.to_variable(self.label_data)
|
||||
|
||||
result = paddle.nn.functional.margin_ranking_loss(x, y, label,
|
||||
margin, reduction)
|
||||
expected = calc_margin_rank_loss(
|
||||
self.x_data,
|
||||
self.y_data,
|
||||
self.label_data,
|
||||
margin=margin,
|
||||
reduction=reduction)
|
||||
self.assertTrue(np.allclose(result.numpy(), expected))
|
||||
|
||||
def run_dynamic_api(self, place):
|
||||
paddle.disable_static(place)
|
||||
x = paddle.to_variable(self.x_data)
|
||||
y = paddle.to_variable(self.y_data)
|
||||
label = paddle.to_variable(self.label_data)
|
||||
margin_rank_loss = paddle.nn.loss.MarginRankingLoss(
|
||||
margin=margin, reduction=reduction)
|
||||
result = margin_rank_loss(x, y, label)
|
||||
expected = calc_margin_rank_loss(
|
||||
self.x_data,
|
||||
self.y_data,
|
||||
self.label_data,
|
||||
margin=margin,
|
||||
reduction=reduction)
|
||||
self.assertTrue(np.allclose(result.numpy(), expected))
|
||||
|
||||
def run_dynamic_broadcast_api(self, place):
|
||||
paddle.disable_static(place)
|
||||
label_data = np.random.choice([-1, 1], size=[10]).astype("float64")
|
||||
x = paddle.to_variable(self.x_data)
|
||||
y = paddle.to_variable(self.y_data)
|
||||
label = paddle.to_variable(label_data)
|
||||
margin_rank_loss = paddle.nn.loss.MarginRankingLoss(
|
||||
margin=margin, reduction=reduction)
|
||||
result = margin_rank_loss(x, y, label)
|
||||
expected = calc_margin_rank_loss(
|
||||
self.x_data,
|
||||
self.y_data,
|
||||
label_data,
|
||||
margin=margin,
|
||||
reduction=reduction)
|
||||
self.assertTrue(np.allclose(result.numpy(), expected))
|
||||
|
||||
def test_case(self):
|
||||
for place in self.places:
|
||||
self.run_static_api(place)
|
||||
self.run_static_functional_api(place)
|
||||
self.run_dynamic_api(place)
|
||||
self.run_dynamic_functional_api(place)
|
||||
self.run_dynamic_broadcast_api(place)
|
||||
|
||||
cls_name = "TestMarginRankLossCase_{}_{}".format(margin, reduction)
|
||||
MarginRankingLossCls.__name__ = cls_name
|
||||
globals()[cls_name] = MarginRankingLossCls
|
||||
|
||||
|
||||
for margin in [0.0, 0.2]:
|
||||
for reduction in ['none', 'mean', 'sum']:
|
||||
create_test_case(margin, reduction)
|
||||
|
||||
|
||||
# test case the raise message
|
||||
class MarginRakingLossError(unittest.TestCase):
|
||||
paddle.enable_static()
|
||||
|
||||
def test_errors(self):
|
||||
def test_margin_value_error():
|
||||
margin_rank_loss = paddle.nn.loss.MarginRankingLoss(
|
||||
margin=0.1, reduction="reduce_mean")
|
||||
|
||||
self.assertRaises(ValueError, test_margin_value_error)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
Loading…
Reference in new issue