Как получить доступ к вложениям для потери триплетов

Я пытаюсь создать сиамскую сеть с тройной потерей, и я использую пример github, чтобы помочь мне. Я новичок в этом, и мне сложно понять, как извлечь вложения из модели. Ниже представлена ​​архитектура:

введите описание изображения здесь

Код для извлечения вложений, который я нашел на нескольких страницах, следующий:

def triplet_loss(y_true, y_pred):
anchor, positive, negative = y_pred[:,:emb_size], y_pred[:,emb_size:2*emb_size], y_pred[:,2*emb_size:]
positive_dist = tf.reduce_mean(tf.square(anchor - positive), axis=1)
negative_dist = tf.reduce_mean(tf.square(anchor - negative), axis=1)
return tf.maximum(positive_dist - negative_dist + alpha, 0.)

Что меня смутило Мне трудно визуализировать матрицу, и я не понимаю, почему привязка y [:,: emb_size], положительная - y_pred [:, emb_size: 2 emb_size] и отрицательная y_pred [: , 2 emb_size:].

Полный код, если необходим дополнительный контекст: https://github.com/pranjalg2308/siamese_triplet_loss/blob/master/Siamese_With_Triplet_Loss.ipynb


person simon    schedule 16.03.2021    source источник


Ответы (1)


Во фрагменте полного кода

in_anc = Input(shape=(105,105,1))
in_pos = Input(shape=(105,105,1))
in_neg = Input(shape=(105,105,1))

em_anc = embedding_model(in_anc)
em_pos = embedding_model(in_pos)
em_neg = embedding_model(in_neg)

out = concatenate([em_anc, em_pos, em_neg], axis=1)

siamese_net = Model(
    [in_anc, in_pos, in_neg],
    out
)

Якорь, pos и neg объединяются с выходным тензором, поэтому привязка y_pred [:,: emb_size] ...

И embedding_model.predict(np.expand_dims(anchor_image[3], axis=0)) даст ваши вложения.

person FancyXun    schedule 17.03.2021
comment
Да, но почему для привязки используется не y_pred [0], а не y_pred [:,: emb_size] - person simon; 17.03.2021
comment
@simon y_pred - двумерный тензор. первый - batch_size, размер второго - emb_size * 3. - person FancyXun; 18.03.2021
comment
спасибо, теперь я понимаю - person simon; 18.03.2021