cosine_embedding_loss

paddle.nn.functional. cosine_embedding_loss ( input1: Tensor, input2: Tensor, label: Tensor, margin: float = 0, reduction: _ReduceMode = 'mean', name: str | None = None ) Tensor [source]

Compute the cosine embedding loss of Tensor input1, input2 and label as follows.

If label = 1, then the loss value can be calculated as follow:

\[Out = 1 - cos(input1, input2)\]

If label = -1, then the loss value can be calculated as follow:

\[Out = max(0, cos(input1, input2)) - margin\]
The operator cos can be described as follow:
\[cos(x1, x2) = \frac{x1 \cdot{} x2}{\Vert x1 \Vert_2 * \Vert x2 \Vert_2}\]
Parameters
  • input1 (Tensor) – tensor with shape: [N, M] or [M], ‘N’ means batch size, which can be 0, ‘M’ means the length of input array. Available dtypes are float32, float64.

  • input2 (Tensor) – tensor with shape: [N, M] or [M], ‘N’ means batch size, which can be 0, ‘M’ means the length of input array. Available dtypes are float32, float64.

  • label (Tensor) – tensor with shape: [N] or [1], ‘N’ means the length of input array. The target labels values should be -1 or 1. Available dtypes are int32, int64, float32, float64.

  • margin (float, optional) – Should be a number from \(-1\) to \(1\), \(0\) to \(0.5\) is suggested. If margin is missing, the default value is \(0\).

  • reduction (string, optional) – Specifies the reduction to apply to the output: 'none' | 'mean' | 'sum'. 'none': no reduction will be applied, 'mean': the sum of the output will be divided by the number of elements in the output 'sum': the output will be summed.

  • name (str, optional) – Name for the operation (optional, default is None). For more information, please refer to api_guide_Name.

Returns

Tensor, the cosine embedding Loss of Tensor input1 input2 and label.

If reduction is 'none', the shape of output loss is [N], the same as input . If reduction is 'mean' or 'sum', the shape of output loss is [].

Examples

>>> import paddle

>>> input1 = paddle.to_tensor([[1.6, 1.2, -0.5], [3.2, 2.6, -5.8]], 'float32')
>>> input2 = paddle.to_tensor([[0.5, 0.5, -1.8], [2.3, -1.4, 1.1]], 'float32')
>>> label = paddle.to_tensor([1, -1], 'int64')

>>> output = paddle.nn.functional.cosine_embedding_loss(input1, input2, label, margin=0.5, reduction='mean')
>>> print(output)  # 0.21155193
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
       0.21155193)
>>> output = paddle.nn.functional.cosine_embedding_loss(input1, input2, label, margin=0.5, reduction='sum')
>>> print(output)  # 0.42310387
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
       0.42310387)
>>> output = paddle.nn.functional.cosine_embedding_loss(input1, input2, label, margin=0.5, reduction='none')
>>> print(output)  # [0.42310387, 0.        ]
Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
       [0.42310387, 0.        ])