2016-07-31 6 views
7

पर निर्भर करेगा मैं बहु-लेबल वर्गीकरण पर काम कर रहा हूं। मेरे पास कई आउटपुट लेबल हैं [1, 0, 0, 1 ...] जहां 1 इंगित करता है कि इनपुट उस लेबल से संबंधित है और 0 अन्यथा इसका मतलब है।केरास के नुकसान समारोह को इस तरह से अनुकूलित करें कि y_true y_pred

मेरे मामले में जो हानि कार्य मैं उपयोग करता हूं वह एमएसई पर आधारित है। मैं हानि फ़ंक्शन को इस तरह से बदलना चाहता हूं कि आउटपुट लेबल -1 से अधिक होने पर इस लेबल की अनुमानित संभावना में बदल जाएगा।

चेक संलग्न छवियों सबसे अच्छा समझने के लिए मैं क्या मतलब है: परिदृश्य है - जब उत्पादन लेबल है -1 मैं एमएसई शून्य के बराबर होना चाहते हैं: enter image description here

:

यह परिदृश्य है

और इस तरह के मामले में मैं इसे करने के लिए बदलना चाहते हैं:

enter image description here

ऐसे मामले में दूसरा लेबल की एमएसई (मध्य उत्पादन) होगा शून्य हो (यह एक विशेष मामला है जहां मैं क्लासिफायर को इस लेबल के बारे में नहीं जानना चाहता)।

ऐसा लगता है कि यह एक आवश्यक तरीका है और मुझे सच में विश्वास नहीं है कि मैं इसके बारे में सोचने वाला पहला व्यक्ति हूं इसलिए सबसे पहले मैं जानना चाहता था कि न्यूरल नेट के प्रशिक्षण के लिए कोई नाम है या दूसरा मैं चाहता हूं मुझे यह जानना पसंद है कि मैं इसे कैसे कर सकता हूं।

मैं समझता हूं कि मुझे हानि समारोह में कुछ चीजें बदलने की ज़रूरत है, लेकिन मैं वास्तव में थेनो के लिए नौसिखिया हूं और इस बारे में निश्चित नहीं हूं कि एक विशिष्ट मूल्य के लिए कैसे दिखें और टेंसर की सामग्री को कैसे बदला जाए।

+0

मुझे लगता है कि आप स्विच या IfElse के साथ ऐसा कर सकते हैं: http://deeplearning.net/software/theano/cifarSC2011/advanced_theano.html –

+0

आप थेनो में कुछ भी करने की जरूरत नहीं है। नमूना_वेट तर्क का प्रयोग करें, 0 और 1 (0 'अनदेखा' तत्वों के लिए 0) – Alleo

+0

लेकिन मैं वैध लेबल के रूप में 1 और 0 का उपयोग करना चाहता हूं और लेबल -1 के दौरान अनदेखा करना चाहता हूं, यह सुनिश्चित नहीं है कि यह मेरे लिए नौकरी करेगा –

उत्तर

6

मुझे विश्वास है कि यह वही है जो आप खोज रहे हैं।

import theano 
from keras import backend as K 
from keras.layers import Dense 
from keras.models import Sequential 

def customized_loss(y_true, y_pred): 
    loss = K.switch(K.equal(y_true, -1), 0, K.square(y_true-y_pred)) 
    return K.sum(loss) 

if __name__ == '__main__': 
    model = Sequential([ Dense(3, input_shape=(4,)) ]) 
    model.compile(loss=customized_loss, optimizer='sgd') 

    import numpy as np 
    x = np.random.random((1, 4)) 
    y = np.array([[1,-1,0]]) 

    output = model.predict(x) 
    print output 
    # [[ 0.47242549 -0.45106074 0.13912249]] 
    print model.evaluate(x, y) # keras's loss 
    # 0.297689884901 
    print (output[0, 0]-1)**2 + 0 +(output[0, 2]-0)**2 # double-check 
    # 0.297689929093 
+0

tensorflow का उपयोग करते समय 'स्विच' फ़ंक्शन का उपयोग करके बैकएंड त्रुटि बढ़ाता है। कोई 'tf.where' फ़ंक्शन का उपयोग कर इसे दूर कर सकता है। – mkocabas

+0

क्या आप कैमरे और tensorflow संस्करण का उपयोग कर रहे हैं? यह मेरा (2.0.8 और 1.3.0) पर काम करता है। – Van

संबंधित मुद्दे