1. 程式人生 > >關於對比損失(contrasive loss)的理解(相似度越大越相似的情況):

關於對比損失(contrasive loss)的理解(相似度越大越相似的情況):

    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