我正在使用 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。
我猜不出我在哪里做错了,但测试结果让我无法匹配正确的图像补丁。
损失设置有什么问题吗?