code: def contrastive_loss(
      left, right, y, margin, extra=False, scope="constrastive_loss"
  ):
      r"""Loss for Siamese networks as described in the paper:
      `Learning a Similarity Metric Discriminatively, with Application to Face
      Verification <http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf>`_ by Chopra et al.
  
      .. math::
          \frac{1}{2} [y \cdot d^2 + (1-y) \cdot \max(0, m - d)^2], d = \Vert l - r \Vert_2
  
      Args:
          left (tf.Tensor): left feature vectors of shape [Batch, N].
          right (tf.Tensor): right feature vectors of shape [Batch, N].
          y (tf.Tensor): binary labels of shape [Batch]. 1: similar, 0: not similar.
          margin (float): horizon for negative examples (y==0).
          extra (bool): also return distances for pos and neg.
  
      Returns:
          tf.Tensor: constrastive_loss (averaged over the batch), (and optionally average_pos_dist, average_neg_dist)
      """
      with tf.name_scope(scope):
          y = tf.cast(y, tf.float32)
  
          delta = tf.reduce_sum(tf.square(left - right), 1)
          delta_sqrt = tf.sqrt(delta + 1e-10)
  
          match_loss = delta
          missmatch_loss = tf.square(tf.nn.relu(margin - delta_sqrt))
  
          loss = tf.reduce_mean(
              0.5 * (y * match_loss + (1 - y) * missmatch_loss)
          )
  
          if extra:
              num_pos = tf.count_nonzero(y)
              num_neg = tf.count_nonzero(1 - y)
              pos_dist = tf.where(
                  tf.equal(num_pos, 0),
                  0.0,
                  tf.reduce_sum(y * delta_sqrt)
                  / tf.cast(num_pos, tf.float32),
                  name="pos-dist",
              )
              neg_dist = tf.where(
                  tf.equal(num_neg, 0),
                  0.0,
                  tf.reduce_sum((1 - y) * delta_sqrt)
                  / tf.cast(num_neg, tf.float32),
                  name="neg-dist",
              )
              return loss, pos_dist, neg_dist
          else:
              return loss
  
imports: import argparse
  import numpy
  import tensorflow
  import tensorflow.contrib.slim
  from tensorpack import *
  from tensorpack.tfutils.summary import add_moving_summary
  from tensorpack.utils.gpu import change_gpu
  from embedding_data import MnistPairs, MnistTriplets, get_test_data
label_desc: Use image node_id 1 for calling a global function with example usage: contrastive_loss(left, right, y, margin, extra, scope) and returns: loss,  pos_dist,  neg_dist, loss