انتقال tf.summary use به TF 2.x

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت
import tensorflow as tf

TensorFlow نسخه 2.x شامل تغییرات قابل توجهی را به 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() عملیات این ساده تر با استفاده از مجموعه نمودار را به جمع همه خروجی خلاصه عملیات، اما این رویکرد هنوز هم ضعیف برای اجرای مشتاق و کنترل جریان کار می کرد، آن را به ویژه نامناسب برای 2.X. TF

در TF 2.X

دو نیمه شدیدا یکپارچه، و در حال حاضر فردی tf.summary عملیات ارسال داده های خود را بلافاصله پس از اجرا می شود. استفاده از API از کد مدل شما هنوز هم باید آشنا به نظر برسد، اما اکنون برای اجرای مشتاقانه مناسب است و در عین حال سازگار با حالت نمودار است. یکپارچه سازی هر دو نیمه از ابزار 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.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 استفاده به API 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()

اگر کد نگارش 1.x TF خود را به جای استفاده از شد tf.contrib.summary API، آن را بسیار بیشتر شبیه به API TF نسخه 2.x، بنابراین tf_upgrade_v2 اسکریپت ترین مراحل مهاجرت (و منتشر می کنند هشدار و یا اشتباهات برای هر گونه استفاده به طور خودکار است که می تواند به طور کامل مهاجرت شود). در اکثر موارد فقط بازنویسی تماس API به tf.compat.v2.summary ؛ اگر شما تنها نیاز به سازگاری با نسخه 2.x TF شما می توانید رها compat.v2 و فقط آن به عنوان مرجع tf.summary .

نکات اضافی

علاوه بر مناطق بحرانی فوق، برخی از جنبه های کمکی نیز تغییر کرده اند:

  • ضبط مشروط (مانند "ورود هر 100 مرحله") ظاهر جدیدی دارد

    • به OPS کنترل و کد مربوط به آن، قرار دادن آنها در یک به طور منظم اگر بیانیه (که کار می کند در حالت مشتاق و در @tf.function از طریق دستخط ) و یا یک tf.cond
    • برای کنترل خلاصه فقط، استفاده از جدید tf.summary.record_if() بدهید زمینه، و با تصویب آن شرایط بولی از انتخاب شما
    • اینها جایگزین الگوی TF 1.x می شوند:

      if condition:
        writer.add_summary()
      
  • بدون نوشتن مستقیم از tf.compat.v1.Graph - به جای توابع استفاده اثری

  • بدون ذخیره نویسنده جهانی بیشتر در هر logdir با tf.summary.FileWriterCache

    • کاربران یا باید پیاده سازی ذخیره خود را / به اشتراک گذاری از اشیاء نویسنده، یا فقط استفاده از نویسندگان جداگانه (پشتیبانی TensorBoard برای دومی است در حال پیشرفت )
  • نمایش باینری فایل رویداد تغییر کرده است

    • TensorBoard 1.x در حال حاضر از فرمت جدید پشتیبانی می کند. این تفاوت فقط بر کاربرانی تأثیر می‌گذارد که به صورت دستی داده‌های خلاصه را از فایل‌های رویداد تجزیه می‌کنند
    • داده های خلاصه اکنون به عنوان بایت های تانسور ذخیره می شوند. شما می توانید استفاده tf.make_ndarray(event.summary.value[0].tensor) آن را تبدیل به نامپای