एक गहरी सीखने के मॉडल में एक नई श्रेणी कैसे जोड़ें?


15

मान लें कि मैंने 10 वस्तुओं को पहचानने के लिए एक पूर्व-प्रशिक्षित नेटवर्क पर स्थानांतरण शिक्षण किया है। 11 वीं आइटम को कैसे जोड़ते हैं जो नेटवर्क को उन सभी 10 श्रेणियों को खोए बिना वर्गीकृत कर सकता है जिन्हें मैंने पहले से प्रशिक्षित किया है और न ही मूल पूर्व-प्रशिक्षित मॉडल से जानकारी? एक मित्र ने मुझे बताया कि इस क्षेत्र में सक्रिय अनुसंधान चल रहा है, लेकिन मुझे कोई प्रासंगिक कागजात या कोई ऐसा नाम नहीं मिल रहा है जिसके लिए खोज की जाए?

धन्यवाद।


यदि आप बहुत अधिक वर्ग के साथ प्रशिक्षित करते हैं तो वहाँ है? क्या यह मदद कर सकता है? उदाहरण के लिए, मान लें कि आप जानते हैं कि 1000 से अधिक वर्ग नहीं होंगे। आप अपने क्लासिफायर की शुरुआत से ही अपने पास मौजूद 10 क्लास पर 1000 क्लास के साथ ट्रेन करते हैं, और जब आपके पास अधिक क्लास होते हैं, तो बस ट्रेन को उन पर रखें ... क्या यह एक अच्छा समाधान हो सकता है? क्या इस दृष्टिकोण के बारे में कागज है?
माइकल

जवाबों:


13

यदि यह सिर्फ एक बार का मामला है, तो आप केवल तंत्रिका नेटवर्क को फिर से प्रशिक्षित कर सकते हैं। यदि आपको अक्सर नई कक्षाओं को जोड़ना पड़ता है, तो यह एक बुरा विचार है। आप ऐसे मामलों में क्या करना चाहते हैं, इसे सामग्री-आधारित छवि पुनर्प्राप्ति (CBIR), या बस छवि पुनर्प्राप्ति या दृश्य खोज कहा जाता है। मैं नीचे अपने उत्तर में दोनों मामलों की व्याख्या करूंगा।

एक बार का मामला

यदि यह सिर्फ एक बार होता है - आप 11 वीं कक्षा को भूल गए हैं, या आपके ग्राहक ने अपना मन बदल दिया है - लेकिन यह फिर से नहीं होगा , तो आप बस अंतिम परत पर 11 वीं आउटपुट नोड कर सकते हैं। इस नोड को वज़न को बेतरतीब ढंग से प्रारंभ करें, लेकिन दूसरे आउटपुट के लिए आपके पास पहले से मौजूद वज़न का उपयोग करें। फिर, हमेशा की तरह इसे प्रशिक्षित करें। यह कुछ वजन को ठीक करने में मददगार हो सकता है, अर्थात इन्हें प्रशिक्षित न करें।

एक चरम मामला केवल नई वज़न को प्रशिक्षित करने और बाकी सभी को तय करने का होगा। लेकिन मुझे यकीन नहीं है कि क्या यह अच्छी तरह से काम करेगा - एक कोशिश के लायक हो सकता है।

सामग्री-आधारित छवि पुनर्प्राप्ति

निम्नलिखित उदाहरण पर विचार करें: आप एक सीडी स्टोर के लिए काम कर रहे हैं, जो चाहते हैं कि उनके ग्राहक एल्बम कवर की तस्वीर लेने में सक्षम हों, और आवेदन उन्हें सीडी दिखाता है जिसे उन्होंने अपने ऑनलाइन स्टोर में स्कैन किया था। उस स्थिति में, आपको स्टोर में मौजूद प्रत्येक नई सीडी के लिए नेटवर्क को फिर से प्रशिक्षित करना होगा। वह प्रत्येक दिन 5 नई सीडी हो सकती है, इसलिए जिस तरह से उपयुक्त नहीं है उस नेटवर्क को फिर से प्रशिक्षित करें।

समाधान एक नेटवर्क को प्रशिक्षित करना है, जो छवि को एक सुविधा स्थान में मैप करता है। प्रत्येक छवि को एक डिस्क्रिप्टर द्वारा दर्शाया जाएगा, जो कि एक 256-आयामी वेक्टर है। आप इस डिस्क्रिप्टर की गणना करके एक छवि को "वर्गीकृत" कर सकते हैं, और इसे अपने डिस्क्रिप्टर के डेटाबेस (यानी आपके स्टोर में मौजूद सभी सीडी के डिस्क्रिप्टर) से तुलना कर सकते हैं। डेटाबेस में निकटतम डिस्क्रिप्टर जीतता है।

आप इस तरह के डिस्क्रिप्टर वेक्टर को जानने के लिए एक तंत्रिका नेटवर्क को कैसे प्रशिक्षित करते हैं? यह अनुसंधान का एक सक्रिय क्षेत्र है। आप "इमेज रिट्रीवल" या "मेट्रिक लर्निंग" जैसे कीवर्ड खोजकर हालिया काम पा सकते हैं।

अभी, लोग आमतौर पर पूर्व-प्रशिक्षित नेटवर्क लेते हैं, जैसे वीजीजी -16, एफसी परतों को काटते हैं, और आपके डिस्क्रिप्टर वेक्टर के रूप में अंतिम दृढ़ का उपयोग करते हैं। आप इस नेटवर्क को उदाहरण के लिए ट्रिपल नुकसान के साथ एक सियामी नेटवर्क का उपयोग करके प्रशिक्षित कर सकते हैं।


मैं एक-शॉट सीखने में लग गया हूं। क्या आपको लगता है कि इससे मुझे मदद मिल सकती है?
nnrales

मैं वास्तव में एक-शॉट सीखने के बारे में नहीं जानता। लेकिन मुझे जो एक-शॉट डीप लर्निंग पेपर मिला, वह
सीबीआईआर के

2

आपका नेटवर्क टोपोलॉजी अलग दिख सकता है, लेकिन अंत में, आपके पूर्व-प्रशिक्षित नेटवर्क में एक परत होती है, जो 10 मूल वर्गों की मान्यता को संभालती है। 11 वीं, 12 वीं .. nth क्लास की शुरुआत करने के लिए सबसे आसान (और काम करने वाली) ट्रिक है, अंतिम रूप से पहले सभी लेयर्स का इस्तेमाल करना है और एक अतिरिक्त लेयर जोड़ना है (एक नए मॉडल में, या एक समानांतर एक के रूप में) जो भी बैठेगी सभी ऊपरी लेकिन अंतिम परतों के ऊपर, 10class लेयर के साथ एक जैसे दिखेंगे (जो कि संभवतः घनी परत की matmul है और [len(dense layer), 10]वैकल्पिक पूर्वाग्रह के साथ आकार का एक मैट्रिक्स )।

आपकी नई परत आकार के साथ एक मैटमुल परत होगी [len(dense layer), len(new classes)]

मूल प्रशिक्षण डेटा तक पहुंच के बिना, आपके पास दो विकल्प होंगे:

  1. "नई" मॉडल को केवल नए वजन को अनुकूलित करने की अनुमति देकर सभी भार को मूल परतों में फ्रीज करें। यह आपको मूल 10 वर्गों के लिए ठीक वैसी ही भविष्य कहनेवाला शक्ति देगा और नए लोगों के लिए ओके प्रदर्शन दे सकता है।
  2. एक बार में पूरे नेटवर्क को प्रशिक्षित करें (नई कक्षाओं की त्रुटि को प्रचारित करके), जो नई कक्षा के लिए काम कर रहा हो (हो सकता है), लेकिन आप 10 कक्षाओं के लिए अप्रभावी मूल समाधान के साथ समाप्त हो जाएंगे (चूंकि निचले वर्गों और अंतिम परत के लिए वजन बदल जाएगा। उन परिवर्तनों से मेल करने के लिए अपडेट नहीं किया जाएगा)।

यद्यपि, आपके पास मूल प्रशिक्षण डेटा तक पहुंच है, लेकिन आप आसानी से मूल नेटवर्क में नई कक्षा जोड़ सकते हैं और इसे 11 कक्षाओं के समर्थन के लिए फिर से प्रशिक्षित कर सकते हैं।


2

यह आसानी से किया जा सकता है।

पहले उन 10 वर्गों के साथ एक मॉडल बनाएं और मॉडल को base_model के रूप में सहेजें।

Base_model लोड करें और new_model नामक एक नए मॉडल को भी परिभाषित करें-

new_model = Sequential()

फिर new_model में base_model की परतें जोड़ें -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

अब नए मॉडल की परतों को गैर-प्रशिक्षित करें क्योंकि आप नहीं चाहते कि आपका मॉडल फिर से प्रशिक्षित हो।

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

अब जैसा कि आप सीखने को स्थानांतरित करते हैं, जब आप अंतिम परतों को हटाते हैं, तो मॉडल की किस्म 10 वर्गों के बारे में भूल जाती है, इसलिए हमें base_model के वजन को new_model पर बनाए रखना होगा -

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

अब अंत में एक घनी परत जोड़ें और हम इस उदाहरण में केवल इस घने परत को प्रशिक्षित करेंगे।

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

अब मॉडल को प्रशिक्षित करें और मुझे आशा है कि यह सभी 11 वर्गों के लिए सही आउटपुट देता है।

हैप्पी लर्निंग।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.