Triplet loss tensorflow,其中预先定义了锚阳性对
Triplet loss tensorflow where anchor-positive pairs are defined upfront
我正在尝试在 Tensorflow 中实现三元组损失,其中三元组是通过在线挖掘方式获得的。在我的特定问题中,我已经有了 anchor(image) - positive(text)
对。我想要实现的是在批处理中有 anchor(image) - positive(text) - negative(text)
和 anchor(text) - positive(image) - negative(image)
对 image-text
对。
如果您需要任何进一步的信息,请告诉我,期待您的答复!
我发现这是我需要的解决方案:
def compute_loss(images: tf.Tensor, texts: tf.Tensor, margin: float) -> tf.Tensor:
with tf.variable_scope(name_or_scope="loss"):
scores = tf.matmul(images, texts, transpose_b=True)
diagonal = tf.diag_part(scores)
# Compare every diagonal score to scores in its column i.e
# All contrastive images for each sentence
cost_s = tf.maximum(0.0, margin - tf.reshape(diagonal, [-1, 1]) + scores)
# Compare every diagonal score to scores in its row i.e
# All contrastive sentences for each image
cost_im = tf.maximum(0.0, margin - diagonal + scores)
# Clear diagonals
cost_s = tf.linalg.set_diag(cost_s, tf.zeros(tf.shape(cost_s)[0]))
cost_im = tf.linalg.set_diag(cost_im, tf.zeros(tf.shape(cost_im)[0]))
# For each positive pair (i,s) sum over the negative images
cost_s = tf.reduce_sum(cost_s, axis=1)
# For each positive pair (i,s) sum over the negative texts
cost_im = tf.reduce_sum(cost_im, axis=0)
triplet_loss = tf.reduce_mean(cost_s) + tf.reduce_mean(cost_im)
return triplet_loss
我正在尝试在 Tensorflow 中实现三元组损失,其中三元组是通过在线挖掘方式获得的。在我的特定问题中,我已经有了 anchor(image) - positive(text)
对。我想要实现的是在批处理中有 anchor(image) - positive(text) - negative(text)
和 anchor(text) - positive(image) - negative(image)
对 image-text
对。
如果您需要任何进一步的信息,请告诉我,期待您的答复!
我发现这是我需要的解决方案:
def compute_loss(images: tf.Tensor, texts: tf.Tensor, margin: float) -> tf.Tensor:
with tf.variable_scope(name_or_scope="loss"):
scores = tf.matmul(images, texts, transpose_b=True)
diagonal = tf.diag_part(scores)
# Compare every diagonal score to scores in its column i.e
# All contrastive images for each sentence
cost_s = tf.maximum(0.0, margin - tf.reshape(diagonal, [-1, 1]) + scores)
# Compare every diagonal score to scores in its row i.e
# All contrastive sentences for each image
cost_im = tf.maximum(0.0, margin - diagonal + scores)
# Clear diagonals
cost_s = tf.linalg.set_diag(cost_s, tf.zeros(tf.shape(cost_s)[0]))
cost_im = tf.linalg.set_diag(cost_im, tf.zeros(tf.shape(cost_im)[0]))
# For each positive pair (i,s) sum over the negative images
cost_s = tf.reduce_sum(cost_s, axis=1)
# For each positive pair (i,s) sum over the negative texts
cost_im = tf.reduce_sum(cost_im, axis=0)
triplet_loss = tf.reduce_mean(cost_s) + tf.reduce_mean(cost_im)
return triplet_loss