sigmoid_cross_entropy_with_logits

paddle.fluid.layers.sigmoid_cross_entropy_with_logits(x, label, ignore_index=-100, name=None, normalize=False)[source]

SigmoidCrossEntropyWithLogits Operator.

This measures the element-wise probability error in classification tasks in which each class is independent. This can be thought of as predicting labels for a data-point, where labels are not mutually exclusive. For example, a news article can be about politics, technology or sports at the same time or none of these.

The logistic loss is given as follows:

$$loss = -Labels * log(sigma(X)) - (1 - Labels) * log(1 - sigma(X))$$

We know that $$sigma(X) = \frac{1}{1 + exp(-X)}$$. By substituting this we get:

$$loss = X - X * Labels + log(1 + exp(-X))$$

For stability and to prevent overflow of $$exp(-X)$$ when X < 0, we reformulate the loss as follows:

$$loss = max(X, 0) - X * Labels + log(1 + exp(-|X|))$$

Both the input X and Labels can carry the LoD (Level of Details) information. However the output only shares the LoD with input X.

Parameters
  • x (Variable) – (Tensor, default Tensor<float>), a 2-D tensor with shape N x D, where N is the batch size and D is the number of classes. This input is a tensor of logits computed by the previous operator. Logits are unscaled log probabilities given as log(p/(1-p))

  • label (Variable) – (Tensor, default Tensor<float>), a 2-D tensor of the same type and shape as X. This input is a tensor of probabalistic labels for each logit

  • ignore_index (int) – (int, default kIgnoreIndex), Specifies a target value that is ignored anddoes not contribute to the input gradient

  • name (str|None) – The default value is None. Normally there is no need for user to set this property. For more information, please refer to Name

  • normalize (bool) – If true, divide the output by the number of targets != ignore_index.

Returns

(Tensor, default Tensor<float>), a 2-D tensor with shape N x D of elementwise logistic losses

Return type

out(Variable)

Examples

import paddle.fluid as fluid
input = fluid.data(
    name='data', shape=[10], dtype='float32')
label = fluid.data(
    name='data', shape=[10], dtype='float32')
loss = fluid.layers.sigmoid_cross_entropy_with_logits(
    x=input,
    label=label,
    ignore_index=-1,
    normalize=True) # or False
# loss = fluid.layers.reduce_sum(loss) # summation of loss