عرض على 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 ، ستحتاج إلى تعديل التعليمات البرمجية الخاصة بك على النحو التالي:
مجموعة الكاتب الافتراضية عبر
.as_default()
يجب أن تكون موجودة لاستخدام مكتب خدمات المشاريع موجز- هذا يعني تنفيذ العمليات بشغف أو استخدام العمليات في إنشاء الرسم البياني
- بدون كاتب افتراضي ، تصبح عمليات الملخص no-ops صامتة
- افتراضي الكتاب لا (حتى الآن) نشر عبر و
@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()
إذا 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()
لتسجيل الرسوم البيانية وظيفة المنفذة
- تنفيذ الرسم البياني في الاستخدامات TF الإصدار 2.x
لا التخزين المؤقت الكاتب أكثر عالمية في logdir مع
tf.summary.FileWriterCache
- يجب على المستخدمين إما تنفيذ التخزين المؤقت الخاصة بهم / تقاسم الأشياء الكاتب، أو مجرد استخدام الكتاب منفصلة (دعم TensorBoard لهذا الأخير هو في التقدم )
تم تغيير التمثيل الثنائي لملف الحدث
- يدعم TensorBoard 1.x التنسيق الجديد ؛ يؤثر هذا الاختلاف فقط على المستخدمين الذين يقومون يدويًا بتحليل البيانات التلخيصية من ملفات الأحداث
- يتم الآن تخزين البيانات الموجزة كوحدات بايت موتر. يمكنك استخدام
tf.make_ndarray(event.summary.value[0].tensor)
لتحويلها إلى نمباي