6

मेरे पास एक नेटवर्क है जो 4 डी आउटपुट टेंसर उत्पन्न करता है जहां स्थानिक आयामों (~ पिक्सेल) में प्रत्येक स्थिति पर मान को उस स्थिति के लिए वर्ग संभावनाओं के रूप में व्याख्या किया जाना है। दूसरे शब्दों में, आउटपुट (num_batches, height, width, num_classes) है। मेरे पास एक ही आकार के लेबल हैं जहां वास्तविक वर्ग को एक गर्म के रूप में कोड किया गया है। मैं इसका उपयोग कर categorical-crossentropy हानि की गणना करना चाहता हूं।केरास में बिंदु-वार स्पष्ट क्रॉसेंट्रॉपी हानि कैसे करें?

समस्या # 1:K.softmax समारोह एक 2D टेन्सर उम्मीद (num_batches, num_classes)

समस्या # 2: मुझे यकीन है कि कैसे प्रत्येक स्थिति से नुकसान जोड़ा जाना चाहिए नहीं कर रहा हूँ। क्या यह reshape पर (num_batches * height * width, num_classes) पर टेंसर और फिर उस पर K.categorical_crossentropy पर कॉल करना सही है? या इसके बजाय, K.categorical_crossentropy(num_batches, num_classes) ऊंचाई * चौड़ाई के समय और परिणाम औसत औसत?

+0

आप किस बैकएंड का उपयोग करते हैं? –

+0

@ MarcinMożejko मैं टेंसरफ्लो का उपयोग करता हूं - या तो केरा बैकएंड एपीआई या टीएफ के अपने कार्यों का उपयोग कर सकता है, या तो ठीक है। धन्यवाद! –

+0

मैंने आपके प्रश्न का उत्तर दिया है :-) –

उत्तर

2

आउटपुट को आकार के 2 डी टेंसर (num_batches, height * width * num_classes) पर फ़्लैट करें। आप इसे Flatten परत के साथ कर सकते हैं। सुनिश्चित करें कि आपका y उसी तरह से चपटा हुआ है (आमतौर पर y = y.reshape((num_batches, height * width * num_classes)) को कॉल करना पर्याप्त है)।

अपने दूसरे प्रश्न के लिए, सभी width*height भविष्यवाणियों से अधिक स्पष्ट crossentropy का उपयोग कर अनिवार्य रूप से प्रत्येक width*height भविष्यवाणियों के लिए स्पष्ट crossentropy (स्पष्ट crossentropy की परिभाषा के द्वारा) औसत के समान है।

+0

धन्यवाद! मैं उलझन में हूं (num_batches, ऊंचाई * चौड़ाई * num_classes) हालांकि। क्या यह अनिवार्य रूप से क्रॉस-एन्ट्रॉपी की गणना नहीं कर रहा है, हालांकि ऊंचाई * चौड़ाई * num_classes कक्षाओं के साथ num_batches नमूने थे? मुझे पूरा यकीन है कि मैं प्रत्येक बिंदु को एक अलग नमूना के रूप में गिना जाना चाहता हूं, यह नहीं है कि reshaping (num_batches * ऊंचाई * चौड़ाई, num_classes) के समान है? कृपया मुझे बताएं कि क्या दोनों गणित के बराबर हैं। –

+0

क्षमा करें, अकेले स्पष्ट क्रॉसेंट्रॉपी अनिवार्य रूप से वही गणित-वार होगा। लेकिन सॉफ्टमैक्स के साथ इसे एक साथ उपयोग करना उतना ही गणित नहीं होगा क्योंकि आउटपुट सामान्य है, जो मेरे उत्तर में एक मिस है। मुझे नहीं लगता कि मॉडल में इनपुट मिडपॉइंट के बैच-आकार को बदलना संभव है। सबसे अच्छा तरीका शायद काम करने के लिए और अपने स्वयं के सॉफ्टमैक्स सक्रियण फ़ंक्शन को कार्यान्वित करना है जो प्रत्येक 'ऊंचाई * चौड़ाई' कोशिकाओं के आउटपुट को सामान्य करता है। – oscfri

+0

धन्यवाद! मैं अभी भी इस बात पर उलझन में हूं कि इसे कोडिंग कोड में कैसे अनुवादित किया जाए, क्या आप उस पर एक शॉट कर सकते हैं? मैंने एक बक्षीस शुरू किया :) –

2

मेरे अंतर्ज्ञान की पुष्टि के लिए this issue मिला।

संक्षेप में: सॉफ्टमैक्स 2 डी या 3 डी इनपुट लेगा। यदि वे 3 डी कैमरे इस तरह के आकार (नमूने, समयबद्धता, numclasses) मान लेंगे और अंतिम पर softmax लागू करें। कुछ अजीब कारणों से, यह 4 डी टेंसर के लिए ऐसा नहीं करता है।

समाधान: पिक्सल के एक दृश्य के लिए अपने उत्पादन नयी आकृति प्रदान

reshaped_output = Reshape((height*width, num_classes))(output_tensor) 

तब लागू अपने softmax

new_output = Activation('softmax')(reshaped_output) 

और फिर या तो आप 2 डी करने के लिए अपने लक्ष्य tensors नयी आकृति प्रदान या यदि आप बस में है कि पिछले परत नयी आकृति प्रदान (चौड़ाई, ऊंचाई, num_classes)।

अन्यथा, अगर मैं अपने फोन पर नहीं था तो मैं कोशिश करता हूं कि अभी एक टाइमडिस्ट्रिब्यूटेड (सक्रियण ('सॉफ्टमैक्स') का उपयोग करना है। लेकिन कोई पता नहीं है कि अगर काम करेगा ... कोशिश करेंगे बाद में

मुझे आशा है कि इस मदद करता है :-)

2

तुम भी नहीं reshape कुछ भी और softmax और loss अपने दम पर दोनों को परिभाषित कर सकते हैं। यहाँ softmax जो (tf बैकएंड में) की तरह पिछले इनपुट आयाम को लागू किया जाता है:

def image_softmax(input): 
    label_dim = -1 
    d = K.exp(input - K.max(input, axis=label_dim, keepdims=True)) 
    return d/K.sum(d, axis=label_dim, keepdims=True) 

और यहाँ आप loss (कुछ भी नयी आकृति प्रदान करने की आवश्यकता नहीं है):

__EPS = 1e-5 
def image_categorical_crossentropy(y_true, y_pred): 
    y_pred = K.clip(y_pred, __EPS, 1 - __EPS) 
    return -K.mean(y_true * K.log(y_pred) + (1 - y_true) * K.log(1 - y_pred)) 

आगे कोई नया स्वरूप दे जरुरत।

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