مشاهده در 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)آن را تبدیل به نامپای
مشاهده در TensorFlow.org
در Google Colab اجرا شود
مشاهده منبع در GitHub
دانلود دفترچه یادداشت