2017-01-23 18 views
5

पर अंडरसमूल करें या बैच उत्पन्न करने के लिए ImageDataGenerator.flow_from_directory विधि का उपयोग करके मैं केरास के साथ एक बाइनरी वर्गीकरण समस्या करने का प्रयास कर रहा हूं। हालांकि, मेरी कक्षाएं बहुत असंतुलित हैं, जैसे कि एक वर्ग में लगभग 8x या 9x अधिक की तुलना में, मॉडल को हर उदाहरण के लिए एक ही आउटपुट क्लास की भविष्यवाणी करने में फंसना पड़ता है। क्या flow_from_directory को मेरे छोटे वर्ग से ओवरलैंप करने या प्रत्येक युग के दौरान मेरी बड़ी कक्षा से अंडरसमूल करने का कोई तरीका है? अभी के लिए, मैंने अपनी छोटी कक्षा में प्रत्येक छवि की कई प्रतियां बनाई हैं, लेकिन मैं थोड़ा अधिक लचीलापन चाहता हूं।keras flow_from_directory एक वर्ग

उत्तर

6

केरास के वर्तमान संस्करण के साथ - केवल केरास अंतर्निहित तरीकों का उपयोग करके अपने डेटासेट को संतुलित करना संभव नहीं है। flow_from_directory बस सभी फ़ाइलों और उनकी कक्षाओं की एक सूची बना रहा है, इसे घुमाकर (यदि आवश्यक हो) और फिर यह इसके ऊपर फिर से चल रहा है।

लेकिन आप एक अलग चाल कर सकता है - अपने स्वयं के जनरेटर writting द्वारा जो python अंदर संतुलन बनाना होगा:

def balanced_flow_from_directory(flow_from_directory, options): 
    for x, y in flow_from_directory: 
     yield custom_balance(x, y, options) 

यहाँ custom_balance एक समारोह है कि एक बैच (x, y) दी जानी चाहिए यह संतुलन और एक लौटा रहा है संतुलित बैच (x', y')। अधिकांश अनुप्रयोगों के लिए बैच के आकार को समान होने की आवश्यकता नहीं है - लेकिन कुछ अजीब उपयोग के मामले हैं (जैसे stateful आरएनएन) - जहां बैच आकारों का निश्चित आकार होना चाहिए)।

+0

धन्यवाद इस मैं क्या जरूरत – George

+1

किसी को एक पूरी तरह से काम कर रहे इस के आधार पर स्क्रिप्ट, विस्तृत करने के बना सकते हैं लगभग प्रतीत हो रहा है सामान्य कर सकते हैं? मुझे कस्टम_बुलेंस आदि का एक और ठोस उदाहरण चाहिए। – mikal94305

0

तुम भी प्रत्येक वर्ग में फ़ाइलों की संख्या की गणना और class_weights

files_per_class = [] 
for folder in os.listdir(input_foldr): 
    if not os.path.isfile(folder): 
      files_per_class.append(len(os.listdir(input_foldr + '/' + folder))) 
total_files = sum(files_per_class) 
class_weights = {} 
for i in xrange(len(files_per_class)): 
    class_weights[i] = 1 - (float(files_per_class[i])/total_files) 
print (class_weights) 
... 
... 
... 
model.fit_generator(... ,class_weight=class_weights) 
+0

कृपया नमूना कोड और अधिक स्पष्टीकरण जोड़ें –

+0

कृपया अपना उत्तर संपादित करें और इस कोड को जोड़ें –

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