我是NN的新手。
我使用三重态损失法构建了一个用于图像理解的神经网络。
我认为我缺少有关如何使用此方法预测图像标签的一些基本知识。
建立模型后,应该如何预测样本图像? 因为我的模型输入是一个三元组-应该从哪个三元组构建?
关于理论,我认为我应该以某种方式获取测试图像的嵌入矩阵,然后使用k = 1的knn来获取最近的嵌入。但是我对如何在实践中做到这一点一无所知
我的代码正在运行并生成模型:
func extractField(s []HasF) {
for _, v := range s {
fmt.Printf(v.GetF())
}
}
func main() {
extractField([]HasF{Foo{},Bar{},Baz{}})
}
答案 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,
)