برنامج TensorFlow 2.0 الفعال: أفضل الممارسات وما تم تغييره

أرسلت بواسطة فريق TensorFlow

في مقال حديث ، ذكرنا أن TensorFlow 2.0 قد أعيد تصميمه مع التركيز على إنتاجية المطورين والبساطة وسهولة الاستخدام.

لإلقاء نظرة فاحصة على ما تم تغييره وللتعرف على أفضل الممارسات ، راجع دليل Effective TensorFlow 2.0 الجديد (المنشور على GitHub). تقدم هذه المقالة ملخصًا سريعًا للمحتوى الذي ستجده هناك. إذا كان أي من هذه المواضيع يثير اهتمامك ، فتوجه إلى الدليل لمعرفة المزيد!

ملخص موجز للتغيرات الرئيسية

هناك العديد من التغييرات في TensorFlow 2.0 لجعل المستخدمين أكثر إنتاجية ، بما في ذلك إزالة واجهات برمجة التطبيقات الزائدة ، وجعل واجهات برمجة التطبيقات أكثر اتساقًا (شبكات RNN الموحدة ، ومحسِّن موحد) ، والتكامل بشكل أفضل مع وقت تشغيل Python مع تنفيذ Eager.

لقد أوضحت العديد من طلبات RFC (راجعها ، إذا كنت جديدًا عليها!) التغييرات والتفكير الذي بدأ في صنع TensorFlow 2.0. يقدم هذا الدليل رؤية لما يجب أن يبدو عليه التطور في TensorFlow 2.0. من المفترض أن لديك بعض الإلمام بـ TensorFlow 1.x.

تنظيف API

تم إنهاء أو نقل العديد من واجهات برمجة التطبيقات في TF 2.0 ، وتم استبدال بعضها بمكافئاتها 2.0 - tf.summary و tf.keras.metrics و tf.keras.optimizers. أسهل طريقة لتطبيق هذه التسميات تلقائيًا هي استخدام البرنامج النصي للترقية v2.

تنفيذ حريصة

يتطلب TensorFlow 1.X من المستخدمين تجميع شجرة بنية مجردة (الرسم البياني) يدويًا عن طريق إجراء مكالمات tf. * API. ثم يتطلب من المستخدمين أن يقوموا يدويًا بتجميع شجرة بناء الجملة المجردة عن طريق تمرير مجموعة من مخرجات التنسورات وتنسورات الإدخال إلى مكالمة session.run (). على النقيض من ذلك ، يتم تنفيذ TensorFlow 2.0 بشغف (مثلما يفعل Python عادةً) وفي 2.0 ، يجب أن تشعر الرسوم البيانية وجلسات العمل بتفاصيل التنفيذ.

لا مزيد من globals

اعتمد TensorFlow 1.X اعتمادًا كبيرًا على مساحات الأسماء العالمية الضمنية. عند الاتصال بـ tf.Variable () ، سيتم وضعه في الرسم البياني الافتراضي ، وسيظل هناك ، حتى لو فقدت مسار متغير Python الذي يشير إليه. يمكنك بعد ذلك استرداد tf.Variable ، ولكن فقط إذا كنت تعرف الاسم الذي تم إنشاؤه به. كان هذا صعبًا إذا لم تكن متحكمًا في تكوين المتغير. نتيجة لذلك ، انتشرت كل أنواع الآليات لمحاولة مساعدة المستخدمين في العثور على متغيراتهم مرة أخرى.

TensorFlow 2.0 يزيل كل هذه الآليات (المتغيرات 2.0 RFC) لصالح الآلية الافتراضية: تتبع المتغيرات الخاصة بك! إذا فقدت مسار tf.Variable ، فسيتم جمع القمامة. انظر الدليل لمزيد من التفاصيل.

وظائف ، وليس جلسات

يشبه استدعاء session.run () استدعاء دالة تقريبًا: يمكنك تحديد المدخلات والدالة المطلوب استدعاؤها ، وتعيد مجموعة من المخرجات. في TensorFlow 2.0 ، يمكنك تزيين دالة Python باستخدام tf.function () لوضع علامة عليها لتجميع JIT بحيث يعمل TensorFlow على أنه رسم بياني فردي (Functions 2.0 RFC).

تسمح هذه الآلية لـ TensorFlow 2.0 بالحصول على جميع مزايا وضع الرسم البياني:

  • الأداء: يمكن تحسين الوظيفة (تشذيب العقدة ، دمج النواة ، إلخ)
  • إمكانية النقل: يمكن تصدير / إعادة تصدير الوظيفة (SavedModel 2.0 RFC) ، مما يسمح للمستخدمين بإعادة استخدام ومشاركة وظائف TensorFlow النموذجية.

من خلال القدرة على تفريق شفرة Python و TensorFlow بحرية ، يمكنك الاستفادة الكاملة من تعبير Python. لكن TensorFlow المحمول ينفذ في سياقات بدون مترجم Python - mobile و C ++ و JS. لمساعدة المستخدمين على تجنب الاضطرار إلى إعادة كتابة التعليمات البرمجية الخاصة بهم عند إضافة @ tf.function ، فإن AutoGraph ستحول مجموعة فرعية من تصميمات Python إلى معادلاتها في TensorFlow.

انظر الدليل لمزيد من التفاصيل.

توصيات الاصطلاحي TensorFlow 2.0

Refactor التعليمات البرمجية الخاصة بك إلى وظائف أصغر

كان نمط الاستخدام الشائع في TensorFlow 1.X هو استراتيجية "مغسلة المطبخ" ، حيث تم وضع اتحاد لجميع الحسابات الممكنة بشكل استباقي ، ثم تم تقييم التنسورات المختارة عبر session.run (). في TensorFlow 2.0 ، يجب على المستخدمين إعادة تشكيل كودهم في وظائف أصغر تسمى حسب الحاجة. بشكل عام ، ليس من الضروري تزيين كل من هذه الوظائف الأصغر مع tf.function ؛ استخدم tf.function فقط لتزيين الحسابات عالية المستوى - على سبيل المثال ، خطوة واحدة من التدريب ، أو التمرير الأمامي للنموذج الخاص بك.

استخدم طبقات ونماذج Keras لإدارة المتغيرات

تقدم نماذج Keras وطبقاته المتغيرات المناسبة وخصائص trainable_variables ، والتي تجمع بشكل متكرر كل المتغيرات التابعة. هذا يجعل من السهل إدارة المتغيرات محليا إلى حيث يتم استخدامها.

ترث طبقات / نماذج Keras من tf.train.Checkpointable وتتكامل مع @ tf.function ، مما يجعل من الممكن تحديد نقطة تفتيش مباشرة أو تصدير SavedModels من كائنات Keras. ليس عليك بالضرورة استخدام واجهة برمجة تطبيقات Keras’s.fit () للاستفادة من عمليات الدمج هذه.

انظر الدليل لمزيد من التفاصيل.

الجمع بين tf.data.Datasets و @ tf.function

عند تكرار بيانات التدريب التي تتلاءم مع الذاكرة ، لا تتردد في استخدام تكرار بيثون العادي. وإلا ، فإن tf.data.Dataset هو أفضل طريقة لدفق بيانات التدريب من القرص. مجموعات البيانات هي خواص متكررة (وليست مكررة) ، وتعمل تمامًا مثل خواص بيثون الأخرى في وضع Eager. يمكنك الاستفادة الكاملة من ميزات الجلب المسبق / تدفق مجموعة البيانات غير المتزامنة من خلال التفاف الكود الخاص بك في tf.function () ، والذي يحل محل بيثون التكرار مع عمليات الرسم البياني المكافئ باستخدام رسم بياني.

@ tf.function
قطار def (نموذج ، مجموعة بيانات ، محسن):
 بالنسبة إلى x ، y في مجموعة البيانات:
  مع tf.GradientTape () كشريط:
   التنبؤ = النموذج (س)
   الخسارة = الخسارة (التوقع ، ذ)
  التدرجات = الشريط. الدرجات (الفقدان ، النموذج. متغير)
  optimizer.apply_gradients (التدرجات ، model.trainable_variables)

إذا كنت تستخدم واجهة برمجة تطبيقات Keras .fit () ، فلن تقلق بشأن تكرار مجموعة البيانات.

model.compile (للمحسن = المحسن ، الخسارة = الخسارة)
model.fit (بيانات)

استفد من رسم تلقائي مع تدفق تحكم Python

يوفر AutoGraph طريقة لتحويل تدفق التحكم المعتمد على البيانات إلى معادلات وضع الرسم البياني مثل tf.cond و tf.while_loop.

مكان واحد شائع حيث يظهر تدفق التحكم المعتمد على البيانات في نماذج التسلسل. يلتف tf.keras.layers.RNN بخلية RNN ، مما يسمح لك بإلغاء التكرار بشكل ثابت أو ديناميكي. من أجل العرض التوضيحي ، يمكنك إعادة تنفيذ التمرير الديناميكي على النحو التالي:

فئة DynamicRNN (tf.keras.Model):
def __init __ (self، rnn_cell):
 super (DynamicRNN، self) .__ init __ (self)
 self.cell = rnn_cell
دعوة def (النفس ، input_data):
 # [الدفعة ، الوقت ، الميزات] -> [الوقت ، الدفعة ، الميزات]
 input_data = tf.transpose (input_data، [1، 0، 2])
 المخرجات = tf.TensorArray (tf.float32 ، input_data.shape [0])
 الحالة = self.cell.zero_state (input_data.shape [1] ، dtype = tf.float32)
 من أجل i in tf.range (input_data.shape [0]):
  الإخراج ، الحالة = self.cell (input_data [i] ، الحالة)
  المخرجات = مخرجات. الكتابة (ط ، الإخراج)
 إرجاع tf.transpose (outputs.stack () ، [1 ، 0 ، 2]) ، الحالة

انظر الدليل لمزيد من التفاصيل.

استخدم tf.metrics لتجميع البيانات و tf.summary لتسجيلها

أخيرًا ، ستظهر قريبًا مجموعة كاملة من الرموز tf.summary. يمكنك الوصول إلى الإصدار 2.0 من tf.summary باستخدام:

من tensorflow.python.ops ، يمكنك استيراد summary_ops_v2

انظر الدليل لمزيد من التفاصيل.

الخطوات التالية

قدمت هذه المقالة ملخصًا سريعًا لدليل TF 2.0 الفعال (إذا كنت مهتمًا بهذه الموضوعات ، فتوجه إلى هناك لمعرفة المزيد!) لمعرفة المزيد حول TensorFlow 2.0 ، نوصي أيضًا بهذه المقالات الحديثة:

  • المساهمة في TensorFlow: SIGs و RFCs والاختبار والمستندات.
  • ما هي واجهات برمجة التطبيقات الرمزية والرمزية في TensorFlow 2.0؟
  • التوحيد القياسي على Keras: إرشادات حول واجهات برمجة التطبيقات عالية المستوى في TensorFlow 2.0

ويرجى الاستماع إلى قمة مطور TensorFlow يومي 6 و 7 مارس. كما هو الحال دائمًا ، سيتم تحميل جميع المحادثات على YouTube للأشخاص الذين لا يمكنهم إجراؤها شخصيًا.