TensorFlow एक फ़ाइल से एक ग्राफ को बचाने / लोड करने में


98

अब तक जो मैंने इकट्ठा किया है, उसमें एक TensorFlow ग्राफ को एक फ़ाइल में डंप करने और फिर दूसरे प्रोग्राम में लोड करने के कई अलग-अलग तरीके हैं, लेकिन मैं कैसे वे काम करते हैं इस पर स्पष्ट उदाहरण / जानकारी नहीं मिल पाई है। जो मुझे पहले से पता है वह यह है:

  1. मॉडल के चर को चेकपॉइंट फ़ाइल (.ckpt) में सहेजें tf.train.Saver()और बाद में उन्हें पुनर्स्थापित करें ( स्रोत )
  2. एक मॉडल को एक .pb फ़ाइल में सहेजें और इसे वापस प्रयोग करने में लोड करें tf.train.write_graph()और tf.import_graph_def()( स्रोत )
  3. एक .pb फ़ाइल से एक मॉडल में लोड करें, इसे पुनः प्राप्त करें, और इसे Bazel ( स्रोत ) का उपयोग करके एक नई .pb फ़ाइल में डंप करें।
  4. ग्राफ और भार को एक साथ बचाने के लिए ग्राफ को फ्रीज करें ( स्रोत )
  5. as_graph_def()मॉडल को बचाने के लिए उपयोग करें , और वजन / चर के लिए, उन्हें स्थिरांक ( स्रोत ) में मैप करें

हालाँकि, मैं इन विभिन्न तरीकों के बारे में कई प्रश्न स्पष्ट नहीं कर पाया:

  1. चेकपॉइंट फ़ाइलों के बारे में, क्या वे केवल एक मॉडल के प्रशिक्षित वजन को बचाते हैं? क्या चेकपॉइंट फ़ाइलों को एक नए प्रोग्राम में लोड किया जा सकता है, और मॉडल को चलाने के लिए उपयोग किया जा सकता है, या क्या वे एक निश्चित समय / चरण में मॉडल में भार को बचाने के तरीके के रूप में काम करते हैं?
  2. के बारे में tf.train.write_graph(), क्या वजन / चर भी बचाए गए हैं?
  3. Bazel के बारे में, क्या यह केवल .pb से पुनर्प्राप्त करने के लिए / pb फ़ाइलों से लोड कर सकता है? वहाँ एक साधारण Bazel आदेश सिर्फ एक .pb में एक ग्राफ डंप करने के लिए है?
  4. ठंड के संबंध में, क्या जमे हुए ग्राफ का उपयोग करने में लोड किया जा सकता है tf.import_graph_def()?
  5. TensorFlow के लिए Android डेमो एक .pb फ़ाइल से Google के इंसेप्शन मॉडल में लोड होता है। अगर मैं अपनी .pb फाइल को स्थानापन्न करना चाहता हूं, तो मैं कैसे करूंगा? क्या मुझे किसी मूल कोड / विधियों को बदलने की आवश्यकता होगी?
  6. सामान्य तौर पर, इन सभी तरीकों में क्या अंतर है? या अधिक मोटे तौर पर, as_graph_def()/.tpt/.pb में क्या अंतर है ?

संक्षेप में, मैं जो खोज रहा हूं वह एक ग्राफ को (जैसे, विभिन्न परिचालनों और इस तरह) और उसके वज़न / चर को एक फ़ाइल में सहेजने की एक विधि है, जिसका उपयोग किसी अन्य प्रोग्राम में ग्राफ़ और वज़न को लोड करने के लिए किया जा सकता है। , उपयोग के लिए (जरूरी नहीं कि निरंतरता / वापसी हो)।

इस विषय के बारे में प्रलेखन बहुत सीधा नहीं है, इसलिए किसी भी उत्तर / जानकारी की बहुत सराहना की जाएगी।


2
सबसे नया / सबसे पूर्ण एपीआई मेटा ग्राफ है, जो आपको तीनों को एक साथ सहेजने का एक तरीका देता है - 1) ग्राफ 2) पैरामीटर मान 3) संग्रह: टैंसरफ़्लो.org
यारोस्लाव बुलटोव

जवाबों:


80

TensorFlow में एक मॉडल को बचाने की समस्या से निपटने के कई तरीके हैं, जो इसे थोड़ा भ्रमित कर सकते हैं। अपने प्रत्येक उप-प्रश्नों को बदले में लेना:

  1. चेकपॉइंट फ़ाइलों ( saver.save()किसी tf.train.Saverऑब्जेक्ट पर कॉल करके उदा) का उत्पादन केवल वज़न और उसी प्रोग्राम में परिभाषित किसी अन्य चर में होता है। उन्हें किसी अन्य प्रोग्राम में उपयोग करने के लिए, आपको संबंधित ग्राफ़ संरचना (जैसे फिर से इसे बनाने के लिए कोड चलाकर, या कॉल करके tf.import_graph_def()) पुनः बनाना होगा , जो TensorFlow को बताता है कि उन भारों का क्या करना है। ध्यान दें कि कॉलिंग में saver.save()एक फ़ाइल भी होती है MetaGraphDef, जिसमें एक ग्राफ होता है और उस ग्राफ़ के साथ एक चेकपॉइंट से वेट को जोड़ने के तरीके का विवरण होता है। देखें ट्यूटोरियल अधिक जानकारी के लिए।

  2. tf.train.write_graph()केवल ग्राफ संरचना लिखता है; वज़न नहीं।

  3. Bazel पढ़ने या लिखने के लिए असंबंधित है TensorFlow रेखांकन। (शायद मैं आपके प्रश्न को गलत समझता हूं: एक टिप्पणी में इसे स्पष्ट करने के लिए स्वतंत्र महसूस करें।)

  4. एक जमे हुए ग्राफ का उपयोग करके लोड किया जा सकता है tf.import_graph_def()। इस स्थिति में, वज़न ग्राफ़ में एम्बेडेड होते हैं (आमतौर पर), इसलिए आपको एक अलग चेकपॉइंट लोड करने की आवश्यकता नहीं है।

  5. मुख्य बदलाव यह होगा कि मॉडल में खिलाए जाने वाले टेंसर (ओं) के नाम और मॉडल से प्राप्त किए गए टेंसर (नों) के नामों को अपडेट किया जाए। TensorFlow Android डेमो में, यह उन inputNameऔर outputNameतार के अनुरूप होता है, जिन्हें पास किया जाता है TensorFlowClassifier.initializeTensorFlow()

  6. GraphDefकार्यक्रम संरचना है, जो आम तौर पर प्रशिक्षण प्रक्रिया के माध्यम से परिवर्तन नहीं करता है। चेकपॉइंट एक प्रशिक्षण प्रक्रिया की स्थिति का एक स्नैपशॉट है, जो आमतौर पर प्रशिक्षण प्रक्रिया के हर चरण में बदलता है। परिणामस्वरूप, TensorFlow इन प्रकार के डेटा के लिए अलग-अलग संग्रहण स्वरूपों का उपयोग करता है, और निम्न-स्तरीय API उन्हें सहेजने और लोड करने के लिए अलग-अलग तरीके प्रदान करता है। जैसे उच्च स्तर पुस्तकालयों, MetaGraphDefपुस्तकालयों, Keras , और skflow इन तंत्रों पर निर्माण को बचाने और एक पूरे मॉडल बहाल करने के लिए और अधिक सुविधाजनक तरीके प्रदान करते हैं।


इसका मतलब यह है कि सी ++ एपीआई प्रलेखन झूठ है, जब यह कहता है कि आप सहेजे गए ग्राफ को लोड कर सकते हैं tf.train.write_graph()और फिर इसे निष्पादित कर सकते हैं?
mnicky

2
C ++ API डॉक्यूमेंट झूठ नहीं बोलता है, लेकिन यह कुछ विवरणों को याद कर रहा है। सबसे महत्वपूर्ण विवरण यह है कि, इसके GraphDefद्वारा सहेजे जाने के अलावा tf.train.write_graph(), आपको उन टेनर्स के नामों को भी याद रखना होगा जिन्हें आप ग्राफ़ को निष्पादित करते समय खिलाना और प्राप्त करना चाहते हैं (ऊपर आइटम 5)।
mrry

@mrry: मैंने टेंसोर्फ़्लो डीपड्रीम उदाहरण का उपयोग करने की कोशिश की। लेकिन ऐसा लगता है कि इसे पीबी प्रारूप में ढोंग किए गए मॉडल की आवश्यकता है! मैंने Cifar10 का उदाहरण दिया, लेकिन यह केवल चौकियों का निर्माण करता है! मैं किसी भी pb फ़ाइलों या जो भी मिल सकता है! मैं अपनी चौकियों को pb प्रारूप में कैसे परिवर्तित कर सकता हूं जो डीप्रीम उदाहरण का उपयोग करता है?
रीका

2
@ Coderx7 मुझे वास्तव में लगता है कि आप एक .ppt में परिवर्तित नहीं कर सकते हैं। क्योंकि चेकपॉइंट में केवल वज़न और चर होते हैं और ग्राफ़ की संरचना के बारे में कुछ भी नहीं जानते हैं
davidivad

1
क्या एक .pb फ़ाइल को लोड करने और फिर उसे चलाने के लिए एक सरल कोड है?
कोंग

1

आप निम्न कोड आज़मा सकते हैं:

with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    g_in = tf.import_graph_def(graph_def, name="")
sess = tf.Session(graph=g_in)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.