0

我正在使用 keras 制作一个用于测量深度学习网络的图像相似度模型,

即使我看到验证成本<=1e-5,也一直看不到好的结果。

我使用的tripletloss层是:

class TripletLossLayer(layers.Layer):
def __init__(self, alpha, **kwargs):
    self.alpha = alpha
    super(TripletLossLayer, self).__init__(**kwargs)

def triplet_loss(self, inputs):
    anchor, positive, negative = inputs
    p_dist = B.sum(B.square(anchor-positive), axis=-1)  #Obj : To make p_dist to 0
    n_dist = B.sum(B.square(anchor-negative), axis=-1)  #Obj2: To make n_dist to 1
    return B.mean(B.maximum(p_dist + self.alpha- n_dist , 0), axis=0)

def call(self, inputs):
    loss = self.triplet_loss(inputs)
    self.add_loss(loss)
    return loss

我的培训正在使用以下代码完成。

in_img =  keras.Input((None,None,1))
in_img_p =  keras.Input((None,None,1))
in_img_n =  keras.Input((None,None,1))
out_map = shared_net(in_img)
out_map_p = shared_net(in_img_p)
out_map_n = shared_net(in_img_n)

opn_in = [in_img,in_img_p,in_img_n]
opn = [out_map,out_map_p,out_map_n]
tri_loss = TripletLossLayer(alpha = 1)(opn)
model = M.Model(inputs=opn_in,outputs = tri_loss)

完成训练后,我加载了这样的模型:

model_whole = M.load_model(route_model,custom_objects={'TripletLossLayer':ka.TripletLossLayer,'B':B})
layer_in = model_whole.layers[0]
layer_out = model_whole.get_layer('lambda')
model_part = M.Model(inputs =model_whole.input[0],outputs = layer_out.output)

我使用了 HPatches 数据集https://github.com/hpatches/hpatches-dataset

我将ground truth设置为0,所以我认为triplet loss的输出应该是0。

并且训练结果说三元组损失小于1e-5。

我猜不出我在哪里做错了,但测试结果让我无法匹配正确的图像补丁。

损失设置有什么问题吗?

4

1 回答 1

-1

您需要将 TripletLoss 函数实现为损失而不是层,并将损失设置为新的 TripletLoss 对象的模型进行编译。

首先尝试一些教程,以便您了解损失和训练循环。

于 2022-02-17T23:56:59.823 回答