2017-07-28 14 views
5

मैं एक केरास सीएनएन का उपयोग कर एक बाइनरी वर्गीकरण बनाना चाहता हूं। मैं इनपुट डेटा के 6000 के बारे में पंक्तियों जो इस तरह दिखता है:बाइनरी केरास सीएनएन हमेशा 1 की भविष्यवाणी क्यों करता है?

>> print(X_train[0]) 
[[[-1.06405307 -1.06685851 -1.05989663 -1.06273152] 
    [-1.06295958 -1.06655996 -1.05969803 -1.06382503] 
    [-1.06415248 -1.06735609 -1.05999593 -1.06302975] 
    [-1.06295958 -1.06755513 -1.05949944 -1.06362621] 
    [-1.06355603 -1.06636092 -1.05959873 -1.06173742] 
    [-1.0619655 -1.06655996 -1.06039312 -1.06412326] 
    [-1.06415248 -1.06725658 -1.05940014 -1.06322857] 
    [-1.06345662 -1.06377347 -1.05890365 -1.06034568] 
    [-1.06027557 -1.06019084 -1.05592469 -1.05537518] 
    [-1.05550398 -1.06038988 -1.05225064 -1.05676692]]] 
>>> print(y_train[0]) 
[1] 

और फिर मैं इस तरह से एक सीएनएन का निर्माण कर दिया है:

model = Sequential() 
model.add(Convolution1D(input_shape = (10, 4), 
         nb_filter=16, 
         filter_length=4, 
         border_mode='same')) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dropout(0.2)) 

model.add(Convolution1D(nb_filter=8, 
         filter_length=4, 
         border_mode='same')) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dropout(0.2)) 

model.add(Flatten()) 

model.add(Dense(64)) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 

model.add(Dense(1)) 
model.add(Activation('softmax')) 

reduce_lr = ReduceLROnPlateau(monitor='val_acc', factor=0.9, patience=30, min_lr=0.000001, verbose=0) 

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

history = model.fit(X_train, y_train, 
      nb_epoch = 100, 
      batch_size = 128, 
      verbose=0, 
      validation_data=(X_test, y_test), 
      callbacks=[reduce_lr], 
      shuffle=True) 

y_pred = model.predict(X_test) 

लेकिन यह निम्न रिटर्न:

>> print(confusion_matrix(y_test, y_pred)) 
[[ 0 362] 
[ 0 608]] 

सभी भविष्यवाणियां क्यों हैं? सीएनएन इतना बुरा क्यों करता है? enter image description here

+1

यह समय के लगभग 2/3 सही है; और मैं इनपुट डेटा देखता हूं जो निरंतर -1.06 होने के करीब है। यदि यह सभी डेटा के लिए रखता है, तो हो सकता है कि यह इनपुट स्पेस को विभाजित नहीं कर सके और अनुकूलित करता है कि कौन सी कक्षा सबसे अधिक होती है, क्योंकि यह सबसे अच्छी शर्त है (हालांकि मुझे लगता है कि आपका सामान्यीकरण कॉल इसे हल कर सकता है)। मैं एक कामकाजी उदाहरण के बिना सत्यापित नहीं कर सकता। <- यह कहा जा रहा है कि, इस व्यवहार के लिए एक बहुत ही आम कारण सीखने की दर में एक समस्या है, क्या आप सीखने की दर को मजबूती से बढ़ाने की कोशिश कर सकते हैं? – Uvar

+0

चीयर्स! मैंने सीखने की दर 0.001 से 0.1 में बदलने की कोशिश की, लेकिन मुझे एक ही आउटपुट मिलता है। :(कोई और विचार? – harrison4

उत्तर

7

यह हमेशा आपके नेटवर्क में उत्पादन की वजह से एक भविष्यवाणी: यहाँ हानि और एसीसी चार्ट कर रहे हैं। सॉफ़्टमैक्स सक्रियण के साथ आपके पास एक न्यूरॉन के साथ एक घने परत होती है। सॉफ़्टमैक्स प्रत्येक आउटपुट के घातीय योग के योग से सामान्यीकृत होता है। चूंकि एक आउटपुट है, केवल एक ही संभावित आउटपुट 1.0 है।

एक बाइनरी क्लासिफायरफायर के लिए आप या तो "बाइनरी_crossentropy" हानि के साथ एक सिग्मोइड सक्रियण का उपयोग कर सकते हैं, या अंतिम परत पर दो आउटपुट इकाइयों को रख सकते हैं, सॉफ्टमैक्स का उपयोग करते रहें और नुकसान को categorical_crossentropy में बदलें।

+0

धन्यवाद! एक आकर्षण की तरह काम करता है! :) क्या सिग्मोइड + बाइनरी और सॉफ्टमैक्स + स्पष्ट के बीच कोई अंतर है? – harrison4

+1

@ हैरिसन 4 सिद्धांत में वे वही हैं लेकिन अभ्यास में मतभेद हैं, कम से कम कुछ परीक्षण मैंने दिखाया है कि सॉफ्टमैक्स बेहतर है। बस रिकॉर्ड के लिए –

+0

, अपने परीक्षण में, एक से थोड़ा गहरा वास्तुकला के साथ, मेरे पास है: अवग्रह + binary_crossentropy: 'val_acc = 0.9422' ' val_loss = 0.16' 'val_rmse = 0.0909' softmax + sparse_categorical_crossentropy: ' val_acc = 0.9409' 'val_loss = 0.1725' ' val_rmse = 0.68' लगता है कि सिग्मोइड थोड़ा (आरएमएसई में इतना छोटा नहीं) बेहतर प्रदर्शन करता है। – bio

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