2017-01-19 5 views
8

मैं एक नए डेटासेट पर tensorflow में एक pretrained मॉडल कैसे finetune कर सकते हैं? कैफे में मैं बस अंतिम परत का नाम बदल सकता हूं और यादृच्छिक प्रारंभ के लिए कुछ पैरामीटर सेट कर सकता हूं। क्या tensorflow में कुछ समान संभव है?टेन्सफोर्लो: विभिन्न डेटा वर्गों के साथ नए डेटासेट पर Finetune pretrained मॉडल

कहें कि मेरे पास एक चेकपॉइंट फ़ाइल (deeplab_resnet.ckpt) है और कुछ कोड जो कम्प्यूटेशनल ग्राफ सेट करता है जिसमें मैं अंतिम परत को संशोधित कर सकता हूं जैसे कि नए डेटासेट में कक्षाओं की संख्या समान है।

तो मैं इस तरह सत्र प्रारंभ करने का प्रयास:

sess = tf.Session(config=config) 
init = tf.initialize_all_variables() 

sess.run(init) 

trainable = tf.trainable_variables() 
saver = tf.train.Saver(var_list=trainable, max_to_keep=40) 
saver.restore(sess, 'ckpt_path/deeplab_resnet.ckpt') 

लेकिन जब saver.restore फ़ंक्शन कॉल के बाद से यह एक से बचा लिया गया था के रूप में ठीक उसी ग्राफ संरचना उम्मीद यह मुझे एक त्रुटि देता है। 'ckpt_path/deeplab_resnet.ckpt' फ़ाइल से अंतिम परत को छोड़कर मैं केवल सभी वजन कैसे लोड कर सकता हूं? मैं भी Classification परत नाम लेकिन या तो कोई किस्मत ...

बदलते मैं tensorflow-deeplab-resnet model

+0

मैं वास्तव में समझ में नहीं आता कि आप क्या चाहते हैं। क्या आप * परत * को संशोधित करना चाहते हैं, लेकिन इसका उपयोग करें लेकिन अलग-अलग (आकार बदलना आदि) या आप सभी मॉडल का उपयोग करना चाहते हैं लेकिन परत (एक ब्रांड नई परत का उपयोग करके) का उपयोग करना चाहते हैं। pltrdy – pltrdy

+0

दोनों (जैसा कि फाइनेटिंग में किया जाता है)। मैं एक पुराना मॉडल लेता हूं जो अंतिम परत को प्रतिस्थापित करता है जो नए डेटासेट की कक्षाओं की नई संख्या को फिट करता है। फिर इस आखिरी परत को यादृच्छिक रूप से प्रारंभ करने की आवश्यकता है। मुझे लगता है कि @Alexey Romanovs उत्तर पहले ही समाधान का आधा है। गायब होने वाला एकमात्र हिस्सा एक परत के स्पष्ट यादृच्छिक प्रारंभिकरण है जब नेटवर्क को पूर्व कैफिमोडल से आयात किया गया था क्योंकि यह 'tensorflow-deeplab-resnet' – mcExchange

+0

@mcExchange में मामला है, कृपया पूर्ण समाधान के साथ नीचे दिए गए उत्तर को पूरा करें और/या स्वीकृति दें नीचे समाधान। –

उत्तर

3

आप चर कि आप पुनर्स्थापित करना चाहते के नाम निर्दिष्ट कर सकते हैं का उपयोग कर रहा करने की कोशिश की।

तो, आप मॉडल में चर के सभी की एक सूची प्राप्त और पिछले परत के चर को फ़िल्टर कर सकते हैं:

all_vars = tf.all_variables() 
var_to_restore = [v for v in all_vars if not v.name.startswith('xxx')] 

saver = tf.train.Saver(var_to_restore) 

जानकारी के लिए documentation देखें।

वैकल्पिक रूप से, आप पूरे मॉडल को लोड करने के लिए आखिरी बार परत से बाहर एक नई "शाखा" बनाने का प्रयास कर सकते हैं और प्रशिक्षण के दौरान लागत समारोह में इसका उपयोग कर सकते हैं।

+0

'v.name.startswith ('xxx') 'एक अच्छा संकेत था। यद्यपि नेटवर्क अब और क्रैश नहीं होता है, यह प्रशिक्षण अभी तक अभिसरण नहीं कर रहा है/नुकसान घट रहा है। क्या मुझे स्पष्ट रूप से उन परतों को यादृच्छिक रूप से प्रारंभ करने के लिए नेटवर्क को बताना है जो छोड़े गए थे? (जिस तरह से मुझे 'all_vars = tf.trainable_variables() '' all_vars = tf.all_variables() ' – mcExchange

+0

के बजाय' all_vars = tf.trainable_variables()' का उपयोग करना था, क्या आप नए चर को प्रारंभ किए बिना मॉडल को प्रशिक्षित करने में सक्षम थे? TensorFlow आपको एक त्रुटि देनी चाहिए प्रारंभिक चर का उपयोग करने का प्रयास करें। आप 'tf.variables_initializer (var_list) 'का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह अजीब बात है कि टेंसरफ्लो ने आपको सभी चरों को शुरू किए बिना मॉडल को प्रशिक्षित करने की अनुमति दी। –

+0

यहां समस्या यह है कि टीएफ ग्राफ था मैन्युअल रूप से नहीं बनाया गया है लेकिन एक कैफिमोडल से परिवर्तित किया गया है। इसलिए मेरे पास स्पष्ट रूप से परिवर्तनीय परिभाषाएं नहीं हैं जैसे 'myVar = tf.Variable (tf.random_normal ([...], stddev = ...), name = "...")। मुझे शायद इन चरों को उनके नाम के माध्यम से चुनना होगा और टीएफ को स्पष्ट रूप से यादृच्छिक रूप से प्रारंभ करने के लिए बताएं। क्या आपको कोई विचार है कि यह कैसे करें? – mcExchange

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