मेरे पास तंत्रिका नेटवर्क विकसित करने के बारे में एक सामान्य प्रश्न है। यह अभी भी संबंधित है कि किसी मॉडल को कैसे प्रोग्राम किया जाए।

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

मॉडल का प्रशिक्षण देते समय, मैं समय-समय पर देव और परीक्षण सेटों पर भी लागत (और शायद सटीकता) की गणना करना चाहता हूं, ताकि बाद में रुझानों की तुलना करने में सक्षम हो (विशेषकर प्रशिक्षण सेट और देव सेट के बीच) की बेहतर तस्वीर हो कि कैसे मॉडल काम कर रहा है। लेकिन मैं निम्नलिखित के रूप में थोड़ी देर में सीएसवी फ़ाइल (ओं) से ट्रेन डेटा पढ़ता हूं:

...
...
try:
        while not coord.should_stop():
          _ , minibatch_cost = sess.run([optimizer, cost])

          nr_of_minibatches += 1
          cost_of_model += minibatch_cost
          cost_of_model /= nr_of_minibatches

          # Print and save the progress (cost, accuracy, etc) periodically
          if print_progress == True and nr_of_minibatches % 5 == 0:
              print ("Cost after minibatch %i: %f" % (nr_of_minibatches, cost_of_model))
              costs.append(cost_of_model)
              accuracy_train = accuracy.eval() #(feed_dict={ZL: ZL, Y_mini_batch: Y_mini_batch})
              train_accuracies.append(accuracy_train)
              print("accuracy_train = " + str(accuracy_train))
              test_accuracy = accuracy.eval(feed_dict={X_Y_mini_batch: Y_test})
      except tf.errors.OutOfRangeError:
        print('Done training, epoch reached')
      finally:
        coord.request_stop()
        coord.join(threads)
...
...

यह तब तक लूप होगा जब तक ट्रेन सेट सीएसवी फ़ाइल (फाइलों) पर # युगों को पूरा नहीं किया जाता है। और जैसा कि ऊपर देखा गया है, प्रत्येक 5वें मिनी बैच के बाद, मैं लागत की गणना करता हूं। मैं देव और परीक्षण डेटा सेट के लिए भी लागत/सटीकता गणना जोड़ना चाहता हूं।

प्रश्न १) व्यावहारिक दृष्टिकोण से, मुझे लगता है कि देव और परीक्षण सेट डेटा अलग-अलग सीएसवी फाइलों में रहना चाहिए। क्या आप मेरी बात से सहमत होंगे? यदि नहीं, (यदि आपको लगता है कि यह ठीक है कि सभी ट्रेन/देव/परीक्षण सेट एक ही फ़ाइल में हो सकते हैं), तो मुझे इसे टेंसरफ़्लो में कैसे लागू करना चाहिए? मुझे लगता है कि स्किकिट-लर्न के पास इसके लिए एक ट्रिक है, लेकिन मुझे लगता है कि टेंसरफ़्लो कार्यान्वयन में ट्रेन/देव/टेस्ट डेटा अलग होना चाहिए।

प्रश्न २) यदि ट्रेन/देव/परीक्षण डेटा अलग-अलग सीएसवी फाइलों में होना चाहिए, तो कार्यान्वयन कैसा दिखना चाहिए? ऊपर दिया गया लूप ट्रेन सीएसवी फाइलों के माध्यम से लूपिंग कर रहा है। मैं थोड़ा उलझन में हूं कि इसे सुरुचिपूर्ण ढंग से कैसे कार्यान्वित किया जाए ताकि प्रत्येक के बाद - कहें - 5 वीं ट्रेन युग मैं देव/परीक्षण सेट के लिए लागत/सटीकता की फिर से गणना करता हूं जो कि हैं अलग सीएसवी फाइलों में।

0
edn 27 मार्च 2018, 00:49

1 उत्तर

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

आपके try/except/finally ब्लॉक में दोषपूर्ण इंडेंटेशन है। except और finally स्टेटमेंट इंडेंटेशन के स्तर पर try के समान होने चाहिए।

जहां तक ​​​​आपके डेटा को विभाजित करने की बात है, आप चीजों को किसी भी तरह से कर सकते हैं, यह आपके विशेष उपयोग के मामले पर निर्भर करता है। आप सभी डेटा को एक बड़ी CSV फ़ाइल में रख सकते हैं और प्रोग्राम को डेटा को प्रशिक्षण/देव/परीक्षण के लिए अलग-अलग ब्लॉक में विभाजित कर सकते हैं, या आप 3 अलग CSV फ़ाइलें रख सकते हैं। केवल सावधान रहने की बात यह है कि यदि आप सभी डेटा को एक CSV फ़ाइल में रखना चुनते हैं, तो जिस विधि से आप डेटा को ट्रेन/देव/परीक्षण सेट में विभाजित करते हैं, वह प्रतिलिपि प्रस्तुत करने योग्य होना चाहिए अन्यथा आप अपने देव पर प्रशिक्षण समाप्त कर देंगे /यदि आप अपने मॉडल को एक से अधिक बार प्रशिक्षित करते हैं तो दुर्घटनावश परीक्षण सेट हो जाता है।

आप डेटा को कैसे विभाजित करते हैं, यह आपके द्वारा उपयोग किए जाने वाले गहन शिक्षण पैकेज के लिए अद्वितीय नहीं है। आप निश्चित रूप से डेटा को विभाजित करने के लिए स्किकिट-लर्न की विधि का उपयोग कर सकते हैं और फिर अपने प्रशिक्षण को Tensorflow के साथ चला सकते हैं। Tensorflow विशिष्ट डेटा-विभाजन के लिए पहिया को फिर से शुरू करने का कोई कारण नहीं है।

एक चीज जिसकी मैं सलाह दूंगा, वह है प्रशिक्षण के दौरान परीक्षण सेट पर लागत/सटीकता की जांच करना। यह परीक्षण सेट के उद्देश्य को हरा देता है। आप अपने मॉडल में हाइपर-पैरामीटर को ठीक करने के लिए देव सेट का उपयोग कर सकते हैं, लेकिन आपको केवल अंत में परीक्षण सेट का उपयोग यह देखने के लिए करना चाहिए कि आपकी लागत/सटीकता "वास्तविक दुनिया" की तरह दिखने की संभावना है। आप कभी भी अपने परीक्षण सेट में फिट नहीं होना चाहते हैं, यह डेटा को 3 सेटों में विभाजित करने का पूरा बिंदु है।

यदि आप फ़ाइलों को अलग रखना चुनते हैं, तो इसका मतलब है कि आपके लूप के भीतर एक लूप होगा जो अलग फ़ाइल पर जाता है और अलग देव सेट फ़ाइल पर लागत/सटीकता की गणना करता है।

0
enumaris 26 मार्च 2018, 22:11