کد و فرمول فاصله جاکارد - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

کد و فرمول فاصله جاکارد

0 امتیاز

سلام دوستان

من کد فاصله جاکارد بدست آوردم

def soft_jaccard(outputs, targets):
    eps = 1e-15
    jaccard_target = (targets == 1).float()
    jaccard_output = F.sigmoid(outputs)

    intersection = (jaccard_output * jaccard_target).sum()
    union = jaccard_output.sum() + jaccard_target.sum()
    return intersection / (union - intersection + eps)


class LossBinary:
    """
    Loss defined as BCE - log(soft_jaccard)
    Vladimir Iglovikov, Sergey Mushinskiy, Vladimir Osin,
    Satellite Imagery Feature Detection using Deep Convolutional Neural Network: A Kaggle Competition
    arXiv:1706.06169
    """

    def __init__(self, jaccard_weight=0):
        self.nll_loss = nn.BCEWithLogitsLoss()
        self.jaccard_weight = jaccard_weight

    def __call__(self, outputs, targets):
        loss = (1 - self.jaccard_weight) * self.nll_loss(outputs, targets)

        if self.jaccard_weight:
            loss += self.jaccard_weight * (1 - soft_jaccard(outputs, targets))
        return loss

 

اما با این فرمول 5 که مال خود نویسنده کد هست به نظر فرق می کنه. اون n چی هست؟ تعداد پیکس هاست؟ چرا تقسیم بر n شد؟

من واقعا نمی تونم فرمول متوجه بشم اگه کسی می نونه یک راهنمایی بکنه ثواب داره!!

مگه در جاکارد میزان مشابهت بررسی نمیشه؟ پس باید بالا سیگما باشه پایین هم سیگما باشه! یعنی از سیگما فاکتور گرفت!

y لیبل هست و اون یکی هم پیش بینی شبکه. 

سوال شده آذر 2, 1399  بوسیله ی pilapila (امتیاز 232)   14 43 56

1 پاسخ

+2 امتیاز

از این فرمول استفاده کنید درکش راحت تره:

jaccob distance

پیاده سازی :

# Function to return the  
# intersection set of s1 and s2  
def intersection(s1, s2) : 
  
    # Find the intersection of the two sets  
    intersect = s1 & s2 ; 
  
    return intersect;  
  
  
# Function to return the Jaccard index of two sets  
def jaccard_index(s1, s2) : 
      
    # Sizes of both the sets  
    size_s1 = len(s1);  
    size_s2 = len(s2);  
  
    # Get the intersection set  
    intersect = intersection(s1, s2);  
  
    # Size of the intersection set  
    size_in = len(intersect);  
  
    # Calculate the Jaccard index  
    # using the formula  
    jaccard_in = size_in  / (size_s1 + size_s2 - size_in);  
  
    # Return the Jaccard index  
    return jaccard_in;  
  
  
# Function to return the Jaccard distance  
def jaccard_distance(jaccardIndex)  : 
  
    # Calculate the Jaccard distance  
    # using the formula  
    jaccard_dist = 1 - jaccardIndex;  
  
    # Return the Jaccard distance  
    return jaccard_dist;  
  
  
# Driver code  
if __name__ == "__main__" :  
  
    # Elements of the 1st set  
    s1 = set();  
    s1.add(1);  
    s1.add(2);  
    s1.add(3);  
    s1.add(4);  
    s1.add(5);  
  
    # Elements of the 2nd set  
    s2 = set();  
    s2.add(4);  
    s2.add(5);  
    s2.add(6);  
    s2.add(7);  
    s2.add(8);  
    s2.add(9);  
    s2.add(10);  
  
    jaccardIndex = jaccard_index(s1, s2);  
  
    # Print the Jaccard index and Jaccard distance  
    print("Jaccard index = ",jaccardIndex);  
    print("Jaccard distance = ",jaccard_distance(jaccardIndex));  
      
    # This code is contributed by AnkitRai01 

 

پاسخ داده شده آذر 2, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
خیلی ممنون
مجموعه من عکس هست.
دارم مقاله می نویسم و فرمولی که قرار دادید فرمول اولیه هست در مقاله هم استفاده کردم حالا می خوام بگم با توجه به عکس بودن و داشتن پیکسل فرمول به صورت عکسی که من قرار دادم شده اما به نظر میاد فرمول من اشتباه هست............از نظر کد جواب گرفتم ولی فرمولش با کدش هم خوانی نداره یعنی اشتباه هست البته این نظر من هست...........در kaggle و stackoverflow هم همین کد بالا هست......لطفا اگه مقاله ای برای این موضوع می شناسید معرفی کنید واقعا گیج شدم
اگر n تعداد کلاس باشه درست هست اما تو سه تا مقاله تاکید کرد پیکسل هست!!
...