def contro_loss(self):
'''
总结下来对比损失的特点:首先看标签,然后标签为1是正对,负对部分损失为0,最小化总损失就是最小化类内损失(within_loss)部分,
让s逼近margin的过程,是个增大的过程;标签为0是负对,正对部分损失为0,最小化总损失就是最小化between_loss,而且此时between_loss就是s,
所以这个过程也是最小化s的过程,也就使不相似的对更不相似了
'''
s = self.similarity
one = tf.constant(1.0)
margin = 1.0
y_true = tf.to_float(self.y_true)
# 类内损失:
max_part = tf.square(tf.maximum(margin-s,0)) # margin是一个正对该有的相似度临界值
within_loss = tf.multiply(y_true,max_part) #如果相似度s未达到临界值margin,则最小化这个类内损失使s逼近这个margin,增大s
# 类间损失:
between_loss = tf.multiply(one-y_true,s) #如果是负对,between_loss就等于s,这时候within_loss=0,最小化损失就是降低相似度s使之更不相似
# 总体损失(要最小化):
loss = 0.5*tf.reduce_mean(within_loss+between_loss)
return loss