مشاهده در 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، باید کد خود را به صورت زیر تطبیق دهید:
مجموعه ای به طور پیش فرض از طریق نویسنده
.as_default()
باید در حال حاضر به استفاده از عملیات خلاصه می شود- این به معنای اجرای عملیات مشتاقانه یا استفاده از عملیات در ساخت گراف است
- بدون یک نویسنده پیشفرض، عملیات خلاصه به غیرفعالهای بیصدا تبدیل میشوند
- نویسندگان به طور پیش فرض (هنوز) قلمه زدن در سراسر
@tf.function
اعدام مرز - آنها را تنها شناسایی هنگامی که از عملکرد ترسیم شده است - بنابراین بهترین عمل است برای پاسخwriter.as_default()
در بدنه تابع، و به اطمینان حاصل شود که شی نویسنده کماکان نیز ادامه دارد تا زمانی که@tf.function
استفاده شده است
"مرحله" مقدار باید به هر عمل از طریق یک گذشت
step
استدلال- TensorBoard برای نمایش داده ها به صورت سری زمانی به یک مقدار مرحله نیاز دارد
- عبور صریح ضروری است زیرا مرحله کلی از TF 1.x حذف شده است، بنابراین هر عملیات باید متغیر مرحله مورد نظر را برای خواندن بداند.
- برای کاهش تکیهکلامهای، پشتیبانی آزمایشی برای ثبت مقدار گام پیش فرض در دسترس است به عنوان
tf.summary.experimental.set_step()
، اما این قابلیت موقت که ممکن است بدون اطلاع قبلی تغییر است
امضای عملکرد عملیات خلاصه فردی تغییر کرده است
- مقدار بازگشتی اکنون یک بولی است (نشان می دهد که آیا خلاصه واقعاً نوشته شده است)
- نام پارامتر دوم (در صورت استفاده) را تغییر داد از
tensor
بهdata
-
collections
پارامتر حذف شده است. مجموعه ها فقط TF 1.x هستند -
family
پارامتر حذف شده است. فقط استفادهtf.name_scope()
[فقط برای کاربران حالت نمودار قدیمی / اجرای جلسه]
نخست نویسنده با مقداردهی اولیه
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()
- به OPS کنترل و کد مربوط به آن، قرار دادن آنها در یک به طور منظم اگر بیانیه (که کار می کند در حالت مشتاق و در
بدون نوشتن مستقیم از
tf.compat.v1.Graph
- به جای توابع استفاده اثری- اعدام نمودار در استفاده TF نسخه 2.x
@tf.function
به جای نمودار صریح - در نسخه 2.x TF، استفاده از API های جدید ردیابی سبک
tf.summary.trace_on()
وtf.summary.trace_export()
برای ضبط نمودار تابع اجرا
- اعدام نمودار در استفاده TF نسخه 2.x
بدون ذخیره نویسنده جهانی بیشتر در هر logdir با
tf.summary.FileWriterCache
- کاربران یا باید پیاده سازی ذخیره خود را / به اشتراک گذاری از اشیاء نویسنده، یا فقط استفاده از نویسندگان جداگانه (پشتیبانی TensorBoard برای دومی است در حال پیشرفت )
نمایش باینری فایل رویداد تغییر کرده است
- TensorBoard 1.x در حال حاضر از فرمت جدید پشتیبانی می کند. این تفاوت فقط بر کاربرانی تأثیر میگذارد که به صورت دستی دادههای خلاصه را از فایلهای رویداد تجزیه میکنند
- داده های خلاصه اکنون به عنوان بایت های تانسور ذخیره می شوند. شما می توانید استفاده
tf.make_ndarray(event.summary.value[0].tensor)
آن را تبدیل به نامپای