2016-09-09 6 views
8

थानो पर भारित बाइनरी क्रॉसएन्त्रॉपी को कैसे कार्यान्वित करें?थानो पर भारित बाइनरी क्रॉसएन्त्रॉपी को कैसे कार्यान्वित करें?

मेरा कनवॉल्यूशनल तंत्रिका नेटवर्क केवल 0 ~~ 1 (सिग्मोइड) की भविष्यवाणी करता है।

मैं इस तरह से मेरी भविष्यवाणियों को दंडित करना चाहते हैं:

Cost-Table

असल में, मैं और अधिक दंडित करने का जब मॉडल भविष्यवाणी 0 चाहते हैं, लेकिन सच्चाई था 1.

प्रश्न: मैं इस वेटेड बाइनरी क्रॉसएन्त्रॉपी फ़ैरानो और लासगेन का उपयोग करके फ़ंक्शन कैसे बना सकता हूं?

मैं

prediction = lasagne.layers.get_output(model) 


import theano.tensor as T 
def weighted_crossentropy(predictions, targets): 

    # Copy the tensor 
    tgt = targets.copy("tgt") 

    # Make it a vector 
    # tgt = tgt.flatten() 
    # tgt = tgt.reshape(3000) 
    # tgt = tgt.dimshuffle(1,0) 

    newshape = (T.shape(tgt)[0]) 
    tgt = T.reshape(tgt, newshape) 

    #Process it so [index] < 0.5 = 0 , and [index] >= 0.5 = 1 


    # Make it an integer. 
    tgt = T.cast(tgt, 'int32') 


    weights_per_label = theano.shared(lasagne.utils.floatX([0.2, 0.4])) 

    weights = weights_per_label[tgt] # returns a targets-shaped weight matrix 
    loss = lasagne.objectives.aggregate(T.nnet.binary_crossentropy(predictions, tgt), weights=weights) 

    return loss 

loss_or_grads = weighted_crossentropy(prediction, self.target_var) 

नीचे इस की कोशिश की लेकिन मैं नीचे इस त्रुटि मिलती है:

लेखन त्रुटि: आकृति बदलें में नई आकार एक वेक्टर या अदिश की एक सूची/टपल होना चाहिए। एक वेक्टर में रूपांतरण के बाद Subtensor {int64} .0 मिला।


संदर्भ: https://github.com/fchollet/keras/issues/2115

संदर्भ: https://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8

+2

चूंकि आप 'binary_crossentropy (..) 'का उपयोग कर रहे हैं, इसलिए हर गलत भविष्यवाणी के लिए जुर्माना होगा। असंतुलित डेटासेट से निपटने के तरीके को देखने के लिए आपको वास्तव में क्या चाहिए, यह [लिंक] (http://www.svds.com/learning-imbalanced-classes/) उपयोगी हो सकता है। – uyaseen

+0

कौन सी लाइन – Julius

उत्तर

2

लैसगने समूह पर डेवलपर्स के लिए धन्यवाद, मैंने इसे अपना खुद का नुकसान समारोह बनाकर तय किया।

loss_or_grads = -(customized_rate * target_var * tensor.log(prediction) + (1.0 - target_var) * tensor.log(1.0 - prediction)) 

loss_or_grads = loss_or_grads.mean() 
0

अपने सिंटैक्स त्रुटि के समाधान के लिए:

बदलें

newshape = (T.shape(tgt)[0]) 
tgt = T.reshape(tgt, newshape) 

को

newshape = (T.shape(tgt)[0],) 
tgt = T.reshape(tgt, newshape) 

T.reshape धुरी के एक ट्यूपल की अपेक्षा करता है, तो आपने यह प्रदान नहीं किया, इसलिए त्रुटि।

झूठी-नकारात्मक (भविष्यवाणी 0, सत्य 1) ​​को दंडित करने से पहले यह सुनिश्चित करें कि यह पूर्वानुमान त्रुटि आपके प्रशिक्षण डेटा के आंकड़ों पर आधारित नहीं है, @uyaseen suggested के रूप में।

+0

से आने वाली त्रुटि है लेकिन मैं अधिक निश्चित लक्ष्यों/भविष्यवाणियों को दंडित कैसे कर सकता हूं? टेबल/छवि पर पोस्ट की तरह मैंने पोस्ट किया? – KenobiShan

+0

आप कक्षा के वजन का उपयोग उस वर्ग के नुकसान को बढ़ावा देने के लिए कर सकते हैं जिसकी आप सबसे अधिक देखभाल करते हैं। इसका ज्यादातर प्रशिक्षण डेटा को संतुलित करने के लिए उपयोग किया जाता है लेकिन यह आमतौर पर एक विशेष वर्ग से त्रुटियों को बढ़ावा देने का एक तरीका है। – nemo

+0

हाँ, लेकिन मैं कैसे Lasagne पर लागू करते हैं? – KenobiShan

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