मैं प्रतिगमन के लिए एक सरल दृढ़ तंत्रिका नेटवर्क का प्रशिक्षण दे रहा हूं, जहां कार्य एक छवि में एक बॉक्स के (x, y) स्थान की भविष्यवाणी करना है:
नेटवर्क के आउटपुट में दो नोड्स हैं, एक एक्स के लिए, और एक वाई के लिए। बाकी नेटवर्क एक मानक कनवसनल न्यूरल नेटवर्क है। नुकसान बॉक्स की अनुमानित स्थिति और जमीनी सच्चाई की स्थिति के बीच एक मानक मतलब चुकता त्रुटि है। मैं इनमें से 10000 चित्रों पर प्रशिक्षण ले रहा हूं, और 2000 को मान्य कर रहा हूं।
मुझे जो समस्या हो रही है, वह यह है कि महत्वपूर्ण प्रशिक्षण के बाद भी, नुकसान वास्तव में कम नहीं होता है। नेटवर्क के आउटपुट को देखने के बाद, मैंने देखा कि नेटवर्क दोनों आउटपुट नोड्स के लिए शून्य के करीब आउटपुट वैल्यू पर जाता है। जैसे, बॉक्स के स्थान की भविष्यवाणी हमेशा छवि का केंद्र होती है। भविष्यवाणियों में कुछ विचलन है, लेकिन हमेशा शून्य के आसपास। नीचे नुकसान दर्शाता है:
मैंने इसे इस ग्राफ में दिखाए गए की तुलना में कई अधिक युगों के लिए चलाया है, और नुकसान अभी भी कम नहीं हुआ है। दिलचस्प बात यह है कि नुकसान वास्तव में एक बिंदु पर बढ़ जाता है।
इसलिए, ऐसा लगता है कि नेटवर्क केवल एक अच्छा प्रशिक्षण सीखने के बजाय प्रशिक्षण डेटा के औसत की भविष्यवाणी कर रहा है। यह क्यों हो सकता है पर कोई विचार? मैं एडम का उपयोग 0.01 के प्रारंभिक सीखने की दर के साथ अनुकूलक के रूप में कर रहा हूं, और सक्रियण के रूप में रिलेस कर रहा हूं
यदि आप मेरे कुछ कोड (Keras) में रुचि रखते हैं, तो यह नीचे है:
# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)