使用三重态损失预测图像

时间:2018-12-02 01:02:33

标签: python tensorflow keras neural-network

我是NN的新手。

我使用三重态损失法构建了一个用于图像理解的神经网络。

我认为我缺少有关如何使用此方法预测图像标签的一些基本知识。

建立模型后,应该如何预测样本图像? 因为我的模型输入是一个三元组-应该从哪个三元组构建?

关于理论,我认为我应该以某种方式获取测试图像的嵌入矩阵,然后使用k = 1的knn来获取最近的嵌入。但是我对如何在实践中做到这一点一无所知

我的代码正在运行并生成模型:

func extractField(s []HasF) {
    for _, v := range s {
        fmt.Printf(v.GetF())
    }
}

func main() {
    extractField([]HasF{Foo{},Bar{},Baz{}})
}

2 个答案:

答案 0 :(得分:1)

如果您已经正确地训练过embedding_network,那么现在就不再需要使用三胞胎了。
基本上,三重态损失概念的整个 point 是要学习与预定义指标(例如,通常仅是欧几里得距离)兼容的嵌入,然后将此嵌入用于简单的{您刚才提到的{1}}分类。
因此,请获取标记的数据,并将所有点都通过KNN
现在,您在(低维?)空间中具有一组点,其中“闭合点”属于同一类。同样,这取决于数据,培训的成功程度等。
然后自然要做的是使测试点通过相同的embedding_network,然后将其与嵌入空间中标记点的距离进行比较。
因此,KNN是一种可行的分类解决方案,但真正的要点是,您的数据已非常非线性地转换为“舒适”空间,在该空间中,许多经典和简单的方法将更容易工作;聚类,分类,就叫它。
希望能有所帮助,祝你好运!

答案 1 :(得分:0)

如果使用name=标记模型的“正常”部分,则可以提取所需的层。为此,我们使用以下代码:

def triplet2normal(model, keep_str='pos', out='score'):
    """ take a triplet model, keep half of the model """
    new_out_layer_name = next(model.name for model in model.layers if keep_str in model.name and out in model.name)
    model_half = Model(inputs=[i for i in model.input if keep_str in i.name],
                   outputs=model.get_layer(new_out_layer_name).output
                  )
    return model_half

其中的模型是任何三元组模型-以下示例仅供参考,例如电影镜头设置:

# Input placeholders
positive_item_input = Input((1,), name='pos_item_input')
negative_item_input = Input((1,), name='neg_item_input')
user_input = Input((1,), name='pos_neg_user_input')

# Embedding layers for the  items and for users
item_embedding_layer = Embedding(num_items, latent_dim, name='pos_neg_item_embedding', input_length=1)
user_embedding_layer = Embedding(num_users, latent_dim, name='pos_neg_user_embedding', input_length=1)

# Flatten the embedding layers
positive_item_embedding = Flatten(name='pos_item_embedded')(item_embedding_layer(positive_item_input))
negative_item_embedding = Flatten(name='neg_item_embedded')(item_embedding_layer(negative_item_input))
user_embedding = Flatten(name='pos_neg_user_embedded')(user_embedding_layer(user_input))

# Dot product - Matrix factorization
positive_scores = Dot(axes=1, name='positive_scores')([user_embedding, positive_item_embedding])
negative_scores = Dot(axes=1, name='negative_scores')([user_embedding, negative_item_embedding])

# Compare scores
delta_scores_1 = Subtract(name='delta_scores')([negative_scores, positive_scores])
loss = Activation('sigmoid')(delta_scores_1)

# Define model
model = Model(
    inputs=[user_input, positive_item_input, negative_item_input],
    outputs=loss,
)