tf.summary उपयोग को TF 2.x . में माइग्रेट करना

TensorFlow.org पर देखें Google Colab में चलाएं GitHub पर स्रोत देखें नोटबुक डाउनलोड करें
import tensorflow as tf

TensorFlow 2.x के लिए महत्वपूर्ण परिवर्तन शामिल tf.summary TensorBoard में दृश्य के लिए लिखने सारांश डेटा के लिए इस्तेमाल किया एपीआई।

क्या बदला है

यह सोचने के लिए उपयोगी है tf.summary दो उप-एपीआई के रूप में एपीआई:

  • रिकॉर्डिंग व्यक्ति के सारांश के लिए ऑप्स का एक सेट - summary.scalar() , summary.histogram() , summary.image() , summary.audio() , और summary.text() - जो अपने मॉडल कोड से इनलाइन कहा जाता है।
  • तर्क लिखना जो इन व्यक्तिगत सारांशों को एकत्र करता है और उन्हें एक विशेष रूप से स्वरूपित लॉग फ़ाइल में लिखता है (जिसे TensorBoard तब विज़ुअलाइज़ेशन उत्पन्न करने के लिए पढ़ता है)।

टीएफ 1.x . में

था दो हिस्सों मैन्युअल एक साथ तार हो करने के लिए - के माध्यम से सारांश सेशन आउटपुट प्राप्त करने में कठिनाई द्वारा Session.run() और बुला FileWriter.add_summary(output, step)v1.summary.merge_all() सेशन यह एक ग्राफ संग्रह का उपयोग करके सभी सारांश सेशन आउटपुट समग्र द्वारा आसान बना दिया है, लेकिन इस दृष्टिकोण अभी भी उत्सुक निष्पादन और नियंत्रण प्रवाह के लिए खराब काम किया, यह विशेष रूप से TF 2. x के लिए बीमार अनुकूल

टीएफ 2.X . में

दो हिस्सों कसकर एकीकृत कर रहे हैं, और अब अलग-अलग tf.summary ऑप्स जब निष्पादित अपने डेटा तुरंत लिखें। अपने मॉडल कोड से एपीआई का उपयोग करना अभी भी परिचित दिखना चाहिए, लेकिन ग्राफ-मोड संगत शेष रहते हुए अब यह उत्सुक निष्पादन के अनुकूल है। एपीआई साधन के दोनों हिस्सों का घालमेल summary.FileWriter अब TensorFlow निष्पादन संदर्भ का हिस्सा है और द्वारा सीधे पहुँचा जाता tf.summary ऑप्स, तो लेखकों को विन्यस्त मुख्य हिस्सा दिखता अलग है।

उत्सुक निष्पादन के साथ उदाहरण उपयोग, TF 2.x में डिफ़ॉल्ट:

writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
ls /tmp/mylogs/eager
events.out.tfevents.1633086727.kokoro-gcp-ubuntu-prod-1386032077.31590.0.v2

tf.function ग्राफ निष्पादन के साथ उदाहरण उपयोग:

writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
ls /tmp/mylogs/tf_function
events.out.tfevents.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.1.v2

लीगेसी TF 1.x ग्राफ़ निष्पादन के साथ उदाहरण उपयोग:

g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)
ls /tmp/mylogs/session
events.out.tfevents.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.2.v2

अपना कोड परिवर्तित करना

मौजूदा परिवर्तित tf.summary TF 2.x एपीआई के उपयोग मज़बूती से स्वचालित नहीं किया जा सकता है, तो tf_upgrade_v2 स्क्रिप्ट सिर्फ यह सब करने के लिए पुनर्लेखन tf.compat.v1.summary । TF 2.x में माइग्रेट करने के लिए, आपको अपना कोड निम्नानुसार अनुकूलित करना होगा:

  1. के माध्यम से एक डिफ़ॉल्ट लेखक सेट .as_default() के लिए उपयोग सारांश ऑप्स मौजूद होना चाहिए

    • इसका मतलब है कि ऑप्स को उत्सुकता से निष्पादित करना या ग्राफ़ निर्माण में ऑप्स का उपयोग करना
    • एक डिफ़ॉल्ट लेखक के बिना, सारांश ऑप्स मूक हो जाते हैं नो-ऑप्स
    • डिफ़ॉल्ट लेखकों (अभी तक) भर में प्रचार नहीं करते @tf.function निष्पादन सीमा - वे केवल पता लगाया जाता है जब समारोह का पता लगाया है - तो सबसे अच्छा अभ्यास कॉल करने के लिए है writer.as_default() समारोह शरीर के भीतर है, और यह सुनिश्चित करें कि लेखक वस्तु तब तक मौजूद रहेंगे जारी है के रूप में @tf.function किया जा रहा है
  2. "कदम" मान के माध्यम से प्रत्येक सेशन में पारित किया जाना चाहिए step तर्क

    • डेटा को समय श्रृंखला के रूप में प्रस्तुत करने के लिए TensorBoard को एक चरण मान की आवश्यकता होती है
    • स्पष्ट पासिंग आवश्यक है क्योंकि TF 1.x से वैश्विक चरण हटा दिया गया है, इसलिए प्रत्येक ऑप को पढ़ने के लिए वांछित चरण चर को जानना चाहिए
    • बॉयलरप्लेट कम करने के लिए एक डिफ़ॉल्ट कदम मूल्य पंजीकरण के लिए प्रयोगात्मक समर्थन के रूप में उपलब्ध है tf.summary.experimental.set_step() , लेकिन इस अनंतिम कार्यक्षमता कि सूचना के बिना बदला जा सकता है है
  3. अलग-अलग समरी ऑप्स के फंक्शन सिग्नेचर बदल गए हैं

    • वापसी मूल्य अब एक बूलियन है (यह दर्शाता है कि क्या सारांश वास्तव में लिखा गया था)
    • दूसरा पैरामीटर नाम (प्रयुक्त हो) से बदल गया है tensor लिए data
    • collections पैरामीटर हटा दिया गया है; संग्रह केवल TF 1.x हैं
    • family पैरामीटर हटा दिया गया है; सिर्फ उपयोग tf.name_scope()
  4. [केवल लीगेसी ग्राफ़ मोड / सत्र निष्पादन उपयोगकर्ताओं के लिए]

    • सबसे पहले साथ लेखक को प्रारंभ v1.Session.run(writer.init())

    • उपयोग v1.summary.all_v2_summary_ops() वर्तमान ग्राफ के लिए सभी TF 2.x सारांश ऑप्स प्राप्त करने के लिए, उदाहरण के लिए के माध्यम से उन्हें निष्पादित करने के लिए Session.run()

    • साथ लेखक फ्लश v1.Session.run(writer.flush()) और इसी तरह के लिए close()

अपने TF 1.x कोड के बजाय उपयोग कर रहा था, तो tf.contrib.summary एपीआई, यह बहुत ज्यादा TF 2.x एपीआई के समान है, इसलिए tf_upgrade_v2 स्क्रिप्ट किसी भी उपयोग के लिए माइग्रेशन के चरण से ज्यादातर (और फेंकना चेतावनियों या त्रुटियों को स्वचालित करेगा कि नहीं कर सकते पूरी तरह से माइग्रेट हो)। अधिकांश भाग के लिए यह सिर्फ करने के लिए API कॉल का पुनर्लेखन tf.compat.v2.summary ; आप ड्रॉप कर सकते हैं अगर आप केवल TF 2.x के साथ संगतता की जरूरत compat.v2 और बस के रूप में इसे संदर्भ tf.summary

अतिरिक्त सुझाव

उपरोक्त महत्वपूर्ण क्षेत्रों के अलावा, कुछ सहायक पहलू भी बदल गए हैं:

  • सशर्त रिकॉर्डिंग (जैसे "हर 100 चरणों में लॉग करें") का एक नया रूप है

    • नियंत्रण ऑप्स और संबद्ध कोड, उन्हें एक नियमित रूप से अगर बयान (जो उत्सुक मोड में और में काम करता है में रैप करने के लिए @tf.function हस्ताक्षर के माध्यम से ) या एक tf.cond
    • बस के सारांश को नियंत्रित करने के लिए, नई का उपयोग tf.summary.record_if() संदर्भ प्रबंधक, और यह आपके द्वारा चुनी गई बूलियन हालत पारित
    • ये TF 1.x पैटर्न की जगह लेते हैं:

      if condition:
        writer.add_summary()
      
  • का कोई प्रत्यक्ष लेखन tf.compat.v1.Graph - बजाय उपयोग का पता लगाने कार्यों

    • TF 2.x उपयोग में ग्राफ़ निष्पादन @tf.function स्पष्ट ग्राफ़ के बजाय
    • TF 2.x में, नए ट्रेसिंग शैली API का उपयोग tf.summary.trace_on() और tf.summary.trace_export() निष्पादित समारोह रेखांकन रिकॉर्ड करने के लिए
  • साथ logdir प्रति कोई और अधिक वैश्विक लेखक कैशिंग tf.summary.FileWriterCache

    • उपयोगकर्ता या तो अपने कैशिंग (TensorBoard समर्थन के लिए उत्तरार्द्ध है को लागू करना चाहिए / लेखक वस्तुओं के साझा करने, या बस अलग लेखकों का उपयोग का कार्य प्रगति पर )
  • ईवेंट फ़ाइल बाइनरी प्रतिनिधित्व बदल गया है

    • TensorBoard 1.x पहले से ही नए प्रारूप का समर्थन करता है; यह अंतर केवल उन उपयोगकर्ताओं को प्रभावित करता है जो ईवेंट फ़ाइलों से सारांश डेटा को मैन्युअल रूप से पार्स कर रहे हैं
    • सारांश डेटा अब टेंसर बाइट्स के रूप में संग्रहीत है; आप उपयोग कर सकते tf.make_ndarray(event.summary.value[0].tensor) यह numpy में बदलने के लिए