Как я могу разорвать встраивание сети, чтобы определить собственную потерю триплета в TensorFlow? - PullRequest
0 голосов
/ 02 ноября 2019

Я новичок в TensorFlow, извините, если я задаю фиктивный вопрос. Мне было интересно, если кто-то может ответить на вопрос, как я могу определить пользовательские потери триплета в TensorFlow? Например, я наткнулся на эту тему ссылку ! Автор ответа указал, что мы можем определить Тройную Потерю следующим образом:

anchor_output = ...  # shape [None, 128]
positive_output = ...  # shape [None, 128]
negative_output = ...  # shape [None, 128]

d_pos = tf.reduce_sum(tf.square(anchor_output - positive_output), 1)
d_neg = tf.reduce_sum(tf.square(anchor_output - negative_output), 1)

loss = tf.maximum(0., margin + d_pos - d_neg)
loss = tf.reduce_mean(loss)

Тем не менее, мне понятно, как мы могли бы иметь вложения anchor_output, positive_output, негативный_output отдельно. Например, когда мы используем Keras, мы можем использовать следующую функцию для этого:

def triplet_loss(y_true, y_pred, alpha = 0.4):
    """
    Implementation of the triplet loss function
    Arguments:
    y_true -- true labels, required when you define a loss in Keras, you don't need it in this function.
    y_pred -- python list containing three objects:
            anchor -- the encodings for the anchor data
            positive -- the encodings for the positive data (similar to anchor)
            negative -- the encodings for the negative data (different from anchor)
    Returns:
    loss -- real number, value of the loss
    """
    print('y_pred.shape = ',y_pred)

    total_lenght = y_pred.shape.as_list()[-1]
#     print('total_lenght=',  total_lenght)
#     total_lenght =12

    anchor = y_pred[:,0:int(total_lenght*1/3)]
    positive = y_pred[:,int(total_lenght*1/3):int(total_lenght*2/3)]
    negative = y_pred[:,int(total_lenght*2/3):int(total_lenght*3/3)]

    # distance between the anchor and the positive
    pos_dist = K.sum(K.square(anchor-positive),axis=1)

    # distance between the anchor and the negative
    neg_dist = K.sum(K.square(anchor-negative),axis=1)

    # compute loss
    basic_loss = pos_dist-neg_dist+alpha
    loss = K.maximum(basic_loss,0.0)

    return loss

Но как мне с этим справиться, когда дело доходит до TensorFlow?

...