मेरे पास खुली और बंद आंखों वाली छवियों का एक संग्रह है।
इस तरह से केरस का उपयोग करके वर्तमान निर्देशिका से डेटा एकत्र किया जाता है:

batch_size = 64
N_images = 84898 #total number of images
datagen = ImageDataGenerator(
    rescale=1./255)
data_iterator = datagen.flow_from_directory(
    './Eyes',
    shuffle = 'False',
    color_mode='grayscale',
    target_size=(h, w),
    batch_size=batch_size,
    class_mode = 'binary')

मेरे पास प्रत्येक आंख की स्थिति के साथ एक .csv फ़ाइल है।

मैंने यह अनुक्रमिक मॉडल बनाया है:

num_filters = 8
filter_size = 3
pool_size = 2

model = Sequential([
  Conv2D(num_filters, filter_size, input_shape=(90, 90, 1)),
  MaxPooling2D(pool_size=pool_size),
  Flatten(),
  Dense(16, activation='relu'),
  Dense(2, activation='sigmoid'), # Two classes. one for "open" and another one for "closed"
])

मॉडल संकलन।

model.compile(
    'adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

अंत में मैं निम्नलिखित के साथ सभी डेटा फिट करता हूं:

model.fit(
  train_images,
  to_categorical(train_labels),
  epochs=3,
  validation_data=(test_images, to_categorical(test_labels)),
)

परिणाम में लगभग ५०% का उतार-चढ़ाव होता है और मुझे समझ में नहीं आता कि क्यों।

-1
OldDew 18 जून 2020, 18:53

1 उत्तर

सबसे बढ़िया उत्तर

आपके वर्तमान मॉडल में अनिवार्य रूप से एक दृढ़ परत है। अर्थात्, num_filters कनवल्शनल फिल्टर (जो इस मामले में 3 x 3 सरणियाँ हैं) को परिभाषित और फिट किया जाता है, ताकि जब उन्हें छवि के साथ जोड़ा जाता है, तो वे ऐसी सुविधाएँ उत्पन्न करते हैं जो कक्षाओं के बीच यथासंभव भेदभावपूर्ण होती हैं। फिर आप 2 सघन परतों को पास करने से पहले आउटपुट CNN सुविधाओं के आयाम को थोड़ा कम करने के लिए मैक्सपूलिंग करते हैं।

मैं यह कहकर शुरू करूंगा कि एक दृढ़ परत लगभग निश्चित रूप से अपर्याप्त है, खासकर 3x3 फिल्टर के साथ। मूल रूप से, एक एकल संकेंद्रित परत के साथ, सबसे सार्थक जानकारी जो आप प्राप्त कर सकते हैं, वे हैं किनारे या रेखाएँ। कच्चे पिक्सेल तीव्रता मानों की तुलना में ये सुविधाएं फ़ंक्शन अनुमानित (यानी आपकी पूरी तरह से जुड़ी परतें) के लिए केवल मामूली रूप से अधिक उपयोगी होती हैं क्योंकि उनमें अभी भी कक्षा के भीतर और कक्षाओं के बीच अत्यधिक उच्च स्तर की परिवर्तनशीलता होती है। विचार करें कि एक आंख की छवि को 2 पिक्सेल बाईं ओर स्थानांतरित करने से आपके 1-लेयर CNN से पूरी तरह से भिन्न मान आउटपुट प्राप्त होंगे। आप चाहते हैं कि आपके सीएनएन के आउटपुट स्केल, रोटेशन, रोशनी आदि के लिए अपरिवर्तनीय हों।

व्यावहारिक रूप से, इसका मतलब है कि आपको और अधिक दृढ़ परतों की आवश्यकता होगी। अपेक्षाकृत सरल वीजीजी नेट में कम से कम १४ कनवल्शनल परतें होती हैं, और आधुनिक अवशिष्ट-परत आधारित नेटवर्क में अक्सर १०० से अधिक कनवल्शनल परतें होती हैं। क्रमिक रूप से अधिक जटिल नेटवर्क को परिभाषित करने के लिए एक रूटीन लिखने का प्रयास करें जब तक कि आप प्रदर्शन लाभ देखना शुरू न करें।

एक माध्यमिक बिंदु के रूप में, आमतौर पर आप प्रशिक्षण के दौरान अपने अंतिम परत आउटपुट पर एक sigmoid() सक्रियण फ़ंक्शन का उपयोग नहीं करना चाहते हैं। यह ग्रेडिएंट्स को समतल करता है और आपके नुकसान को वापस प्रचारित करने के लिए इसे बहुत धीमा बनाता है। आप वास्तव में परवाह नहीं करते हैं कि आउटपुट मान 0 और 1 के बीच आते हैं, आप केवल उनके सापेक्ष परिमाण की परवाह करते हैं। सामान्य अभ्यास क्रॉस एन्ट्रापी हानि का उपयोग करना है जो एक लॉग सॉफ्टमैक्स फ़ंक्शन (ग्रेडिएंट सामान्य सॉफ्टमैक्स से अधिक स्थिर) और नकारात्मक लॉग संभावना हानि को जोड़ती है, जैसा कि आप पहले ही कर चुके हैं। इस प्रकार, चूंकि लॉग सॉफ्टमैक्स भाग आउटपुट मानों को वांछित सीमा में बदल देता है, इसलिए सिग्मॉइड सक्रियण फ़ंक्शन का उपयोग करने की कोई आवश्यकता नहीं है।

1
DerekG 18 जून 2020, 17:45