ترحيل استخدام tf.summary إلى TF 2.x

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر
import tensorflow as tf

يتضمن الإصدار 2.x TensorFlow تغييرات كبيرة على tf.summary API استخدامها لبيانات موجزة الكتابة عن التصور في TensorBoard.

ما الذي تغير

من المفيد التفكير في tf.summary API عن اثنين من واجهات برمجة التطبيقات الفرعية:

  • وهناك مجموعة من التقاط لتسجيل ملخصات الفردية - summary.scalar() ، summary.histogram() ، summary.image() ، summary.audio() ، و summary.text() - التي تسمى مضمنة من التعليمات البرمجية النموذج الخاص بك.
  • منطق الكتابة الذي يجمع هذه الملخصات الفردية ويكتبها في ملف سجل منسق خصيصًا (والذي يقرأه TensorBoard بعد ذلك لإنشاء تصورات).

في TF 1.x

نصفي كان لا بد السلكية يدويا معا - من خلال جلب مخرجات ملخص المرجع عبر Session.run() والدعوة FileWriter.add_summary(output, step) . و v1.summary.merge_all() جعلت المرجع هذا أسهل باستخدام مجموعة الرسم البياني لتجميع جميع النواتج ملخص المرجع، ولكن هذا النهج لا يزال يعمل بشكل سيئ لتنفيذ حريصة والتحكم في التدفق، مما يجعلها غير مناسبة خاصة لTF 2.X.

في TF 2.X

يتم دمج شطري بإحكام، والآن الفردية tf.summary التقاط كتابة البيانات على الفور عندما أعدم. يجب أن يظل استخدام واجهة برمجة التطبيقات من كود النموذج الخاص بك مألوفًا ، ولكنه أصبح الآن سهل التنفيذ مع الحفاظ على توافق وضع الرسم البياني. دمج كل شطر من وسائل API في 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:

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 الاستخدام إلى API TF الإصدار 2.x لا يمكن أن تتم بشكل موثوق، وبالتالي فإن tf_upgrade_v2 النصي فقط يعيد كتابة كل شيء ل tf.compat.v1.summary . للانتقال إلى TF 2.x ، ستحتاج إلى تعديل التعليمات البرمجية الخاصة بك على النحو التالي:

  1. مجموعة الكاتب الافتراضية عبر .as_default() يجب أن تكون موجودة لاستخدام مكتب خدمات المشاريع موجز

    • هذا يعني تنفيذ العمليات بشغف أو استخدام العمليات في إنشاء الرسم البياني
    • بدون كاتب افتراضي ، تصبح عمليات الملخص no-ops صامتة
    • افتراضي الكتاب لا (حتى الآن) نشر عبر و @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 API، وأكثر من ذلك بكثير مماثلة لAPI 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، استخدم جديد على غرار تتبع واجهات برمجة التطبيقات tf.summary.trace_on() و tf.summary.trace_export() لتسجيل الرسوم البيانية وظيفة المنفذة
  • لا التخزين المؤقت الكاتب أكثر عالمية في logdir مع tf.summary.FileWriterCache

    • يجب على المستخدمين إما تنفيذ التخزين المؤقت الخاصة بهم / تقاسم الأشياء الكاتب، أو مجرد استخدام الكتاب منفصلة (دعم TensorBoard لهذا الأخير هو في التقدم )
  • تم تغيير التمثيل الثنائي لملف الحدث

    • يدعم TensorBoard 1.x التنسيق الجديد ؛ يؤثر هذا الاختلاف فقط على المستخدمين الذين يقومون يدويًا بتحليل البيانات التلخيصية من ملفات الأحداث
    • يتم الآن تخزين البيانات الموجزة كوحدات بايت موتر. يمكنك استخدام tf.make_ndarray(event.summary.value[0].tensor) لتحويلها إلى نمباي