Skip to content

Commit c284237

Browse files
authored
Merge pull request #13837 from velconia/add_pyramid_dnn_support
Add margin_rank_loss_op to python
2 parents 2c9839c + 4a22979 commit c284237

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

paddle/fluid/API.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ paddle.fluid.layers.relu ArgSpec(args=['x', 'name'], varargs=None, keywords=None
127127
paddle.fluid.layers.log ArgSpec(args=['x', 'name'], varargs=None, keywords=None, defaults=(None,))
128128
paddle.fluid.layers.crop ArgSpec(args=['x', 'shape', 'offsets', 'name'], varargs=None, keywords=None, defaults=(None, None, None))
129129
paddle.fluid.layers.rank_loss ArgSpec(args=['label', 'left', 'right', 'name'], varargs=None, keywords=None, defaults=(None,))
130+
paddle.fluid.layers.margin_rank_loss ArgSpec(args=['label', 'left', 'right', 'margin', 'name'], varargs=None, keywords=None, defaults=(0.1, None))
130131
paddle.fluid.layers.elu ArgSpec(args=['x', 'alpha', 'name'], varargs=None, keywords=None, defaults=(1.0, None))
131132
paddle.fluid.layers.relu6 ArgSpec(args=['x', 'threshold', 'name'], varargs=None, keywords=None, defaults=(6.0, None))
132133
paddle.fluid.layers.pow ArgSpec(args=['x', 'factor', 'name'], varargs=None, keywords=None, defaults=(1.0, None))

python/paddle/fluid/layers/nn.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
'log',
108108
'crop',
109109
'rank_loss',
110+
'margin_rank_loss',
110111
'elu',
111112
'relu6',
112113
'pow',
@@ -5827,6 +5828,54 @@ def rank_loss(label, left, right, name=None):
58275828
return out
58285829

58295830

5831+
def margin_rank_loss(label, left, right, margin=0.1, name=None):
5832+
"""
5833+
Margin Ranking Loss Layer for ranking problem,
5834+
which compares left score and right score passed in.
5835+
The ranking loss can be defined as following equation:
5836+
5837+
.. math::
5838+
5839+
rank\_loss &= max(0, -label * (left - right) + margin)
5840+
5841+
Args:
5842+
label (Variable): Indicates whether the left is ranked higher than the right or not.
5843+
left (Variable): Ranking score for left.
5844+
right (Variable): Ranking score for right.
5845+
margin (float): Indicates the given margin.
5846+
name (str|None): A name for this layer (optional). If set None, the layer
5847+
will be named automatically.
5848+
Returns:
5849+
Variable: The ranking loss.
5850+
Raises:
5851+
ValueError: Any of label, left, and right is not a Variable.
5852+
Examples:
5853+
.. code-block:: python
5854+
label = fluid.layers.data(name="label", shape=[4, 1], dtype="float32")
5855+
left = fluid.layers.data(name="left", shape=[4, 1], dtype="float32")
5856+
right = fluid.layers.data(name="right", shape=[4, 1], dtype="float32")
5857+
out = fluid.layers.margin_rank_loss(label, left, right)
5858+
"""
5859+
helper = LayerHelper('margin_rank_loss', **locals())
5860+
if not isinstance(label, Variable):
5861+
raise ValueError("The label should be a Variable.")
5862+
if not isinstance(left, Variable):
5863+
raise ValueError("The left should be a Variable.")
5864+
if not isinstance(right, Variable):
5865+
raise ValueError("The right should be a Variable.")
5866+
out = helper.create_tmp_variable(left.dtype)
5867+
act = helper.create_tmp_variable(left.dtype)
5868+
helper.append_op(
5869+
type='margin_rank_loss',
5870+
inputs={"Label": label,
5871+
"X1": left,
5872+
"X2": right},
5873+
outputs={'Out': out,
5874+
'Activated': act},
5875+
attrs={'margin': margin})
5876+
return out
5877+
5878+
58305879
def pad2d(input,
58315880
paddings=[0, 0, 0, 0],
58325881
mode='constant',
@@ -6290,6 +6339,7 @@ def sequence_enumerate(input, win_size, pad_value=0, name=None):
62906339
outputs={'Out': out},
62916340
attrs={'win_size': win_size,
62926341
'pad_value': pad_value})
6342+
return out
62936343

62946344

62956345
def sequence_mask(x, maxlen=None, dtype='int64', name=None):

0 commit comments

Comments
 (0)