Warning: This project is deprecated. TensorFlow Addons has stopped development, The project will only be providing minimal maintenance releases until May 2024. See the full announcement here or on github.


Computes the npairs loss between multilabel data y_true and y_pred.

Npairs loss expects paired data where a pair is composed of samples from the same labels and each pairs in the minibatch have different labels. The loss takes each row of the pair-wise similarity matrix, y_pred, as logits and the remapped multi-class labels, y_true, as labels.

To deal with multilabel inputs, the count of label intersection is computed as follows:

L_{i,j} = | set_of_labels_for(i) \cap set_of_labels_for(j) |

Each row of the count based label matrix is further normalized so that each row sums to one.

y_true should be a binary indicator for classes. That is, if y_true[i, j] = 1, then ith sample is in jth class; if y_true[i, j] = 0, then ith sample is not in jth class.

The similarity matrix y_pred between two embedding matrices a and b with shape [batch_size, hidden_size] can be computed as follows:

a = tf.constant([[1, 2],
                [3, 4],
                [5, 6]], dtype=tf.float16)
b = tf.constant([[5, 9],
                [3, 6],
                [1, 8]], dtype=tf.float16)
y_pred = tf.matmul(a, b, transpose_a=False, transpose_b=True)
<tf.Tensor: shape=(3, 3), dtype=float16, numpy=
array([[23., 15., 17.],
   [51., 33., 35.],
   [79., 51., 53.]], dtype=float16)>

<... Note: constants a & b have been used purely for example purposes and have no significant value ...>

See: http://www.nec-labs.com/uploads/images/Department-Images/MediaAnalytics/papers/nips16_npairmetriclearning.pdf

y_true Either 2-D integer Tensor with shape [batch_size, num_classes], or SparseTensor with dense shape [batch_size, num_classes]. If y_true is a SparseTensor, then it will be converted to Tensor via tf.sparse.to_dense first.
y_pred 2-D float Tensor with shape [batch_size, batch_size] of similarity matrix between embedding matrices.

npairs_multilabel_loss float scalar.