0

我正在尝试创建一个带有三重损失的连体网络,并且我正在使用 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

4

1 回答 1

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))会给你的嵌入。

于 2021-03-17T10:18:38.380 回答