تنسيق TF1 Hub

عند إطلاقها في 2018 ، قدمت TensorFlow Hub نوعًا واحدًا من الأصول: تنسيق TF1 Hub للاستيراد إلى برامج TensorFlow 1.

تشرح هذه الصفحة كيفية استخدام تنسيق TF1 Hub في TF1 (أو وضع التوافق TF1 الخاص بـ TF2) مع فئة hub.Module وواجهات برمجة التطبيقات المرتبطة. (الاستخدام النموذجي هو بناء رسم tf.Graph ، ربما داخل Estimator TF1 ، من خلال الجمع بين واحد أو أكثر من النماذج بتنسيق TF1 Hub مع tf.compat.layers أو tf.layers ).

يجب على مستخدمي TensorFlow 2 (خارج وضع التوافق TF1) استخدام واجهة برمجة التطبيقات الجديدة مع hub.load() أو hub.KerasLayer . تقوم واجهة برمجة التطبيقات الجديدة بتحميل نوع أصل TF2 SavedModel الجديد ، ولكن لديها أيضًا دعمًا محدودًا لتحميل تنسيق TF1 Hub إلى TF2 .

استخدام نموذج بتنسيق TF1 Hub

إنشاء نموذج بتنسيق TF1 Hub

يتم استيراد نموذج بتنسيق TF1 Hub إلى برنامج TensorFlow عن طريق إنشاء كائن hub.Module من سلسلة مع عنوان URL الخاص بها أو مسار نظام الملفات ، مثل:

m = hub.Module("path/to/a/module_dir")

يؤدي هذا إلى إضافة متغيرات الوحدة إلى الرسم البياني الحالي لـ TensorFlow. سيؤدي تشغيل أدوات التهيئة الخاصة بهم إلى قراءة قيمهم المدربة مسبقًا من القرص. وبالمثل ، تتم إضافة الجداول والحالة الأخرى إلى الرسم البياني.

وحدات التخزين المؤقت

عند إنشاء وحدة نمطية من عنوان URL ، يتم تنزيل محتوى الوحدة وتخزينه مؤقتًا في الدليل المؤقت للنظام المحلي. يمكن تجاوز الموقع حيث يتم تخزين الوحدات النمطية مؤقتًا باستخدام متغير البيئة TFHUB_CACHE_DIR . للحصول على التفاصيل ، راجع التخزين المؤقت .

تطبيق وحدة

بمجرد إنشاء مثيل ، يمكن استدعاء الوحدة m صفر أو مرات أكثر مثل دالة Python من مدخلات موتر إلى مخرجات موتر:

y = m(x)

تضيف كل مكالمة من هذا القبيل عمليات إلى الرسم البياني TensorFlow الحالي لحساب y من x . إذا كان هذا يتضمن متغيرات ذات أوزان مدربة ، فسيتم مشاركتها بين جميع التطبيقات.

يمكن للوحدات النمطية تحديد عدة توقيعات مسماة للسماح بالتطبيق بأكثر من طريقة (على غرار الطريقة التي تمتلك بها كائنات Python طرقًا ). يجب أن تصف وثائق الوحدة التواقيع المتاحة. الاستدعاء أعلاه يطبق التوقيع المسمى "default" . يمكن تحديد أي توقيع بتمرير اسمه إلى signature= الاختياري signature= الوسيطة.

إذا كان للتوقيع مدخلات متعددة ، فيجب أن يتم تمريرها كإملاء ، باستخدام المفاتيح المحددة بواسطة التوقيع. وبالمثل ، إذا كان للتوقيع العديد من المخرجات ، فيمكن استرجاعها as_dict=True خلال تمرير as_dict=True ، تحت المفاتيح المحددة بواسطة التوقيع (المفتاح "default" هو للإخراج الفردي إذا كان as_dict=False ). لذا فإن الشكل الأكثر عمومية لتطبيق الوحدة يبدو كما يلي:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

يجب على المتصل توفير جميع المدخلات المحددة بواسطة التوقيع ، ولكن لا يوجد شرط لاستخدام جميع مخرجات الوحدة. سيعمل TensorFlow فقط على تلك الأجزاء من الوحدة النمطية التي ينتهي بها الأمر باعتبارها تبعيات لهدف في tf.Session.run() . في الواقع ، قد يختار ناشرو الوحدات تقديم مخرجات متنوعة للاستخدامات المتقدمة (مثل تنشيط الطبقات الوسيطة) جنبًا إلى جنب مع المخرجات الرئيسية. يجب أن يتعامل مستهلكو الوحدة النمطية مع المخرجات الإضافية بأمان.

تجربة وحدات بديلة

عندما تكون هناك وحدات متعددة للمهمة نفسها ، يشجع TensorFlow Hub على تزويدهم بالتوقيعات المتوافقة (الواجهات) بحيث تكون تجربة وحدات مختلفة سهلة مثل تغيير مقبض الوحدة النمطية كمعلمة فائقة القيمة.

تحقيقًا لهذه الغاية ، نحتفظ بمجموعة من التواقيع المشتركة الموصى بها للمهام الشائعة.

إنشاء وحدة جديدة

ملاحظة التوافق

تنسيق TF1 Hub موجه نحو TensorFlow 1. وهو مدعوم جزئيًا فقط بواسطة TF Hub في TensorFlow 2. يرجى التفكير في النشر بتنسيق TF2 SavedModel الجديد بدلاً من ذلك.

يتشابه تنسيق TF1 Hub مع تنسيق SavedModel الخاص بـ TensorFlow 1 على مستوى نحوي (نفس أسماء الملفات ورسائل البروتوكول) ولكنه يختلف معنويًا للسماح بإعادة استخدام الوحدة النمطية والتكوين وإعادة التدريب (على سبيل المثال ، التخزين المختلف لمُهيئ الموارد ، ووضع علامات مختلفة اتفاقيات للفقرات). أسهل طريقة tfhub_module.pb بينها على القرص هي وجود أو عدم وجود ملف tfhub_module.pb .

النهج العام

لتعريف وحدة نمطية جديدة ، يستدعي الناشر hub.create_module_spec() بوظيفة module_fn . tf.placeholder() هذه الوظيفة رسمًا بيانيًا يمثل الهيكل الداخلي للوحدة ، باستخدام tf.placeholder() للمدخلات التي tf.placeholder() المتصل. ثم يقوم بتعريف التوقيعات عن طريق استدعاء hub.add_signature(name, inputs, outputs) مرة واحدة أو أكثر.

على سبيل المثال:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

يمكن استخدام نتيجة hub.create_module_spec() ، بدلاً من المسار ، لإنشاء كائن وحدة نمطية داخل رسم بياني TensorFlow معين. في مثل هذه الحالة ، لا توجد نقطة تحقق ، وسيستخدم مثيل الوحدة النمطية المتغير المبدئي بدلاً من ذلك.

يمكن إجراء تسلسل لأي مثيل وحدة نمطية إلى القرص عبر طريقة export(path, session) . يؤدي تصدير وحدة نمطية إلى إجراء تسلسل لتعريفها مع الحالة الحالية لمتغيراتها في session إلى المسار الذي تم تمريره. يمكن استخدام هذا عند تصدير وحدة نمطية لأول مرة ، وكذلك عند تصدير وحدة مضبوطة بدقة.

للتوافق مع TensorFlow Estimator ، يقوم hub.LatestModuleExporter بتصدير الوحدات النمطية من أحدث نقطة tf.estimator.LatestExporter ، تمامًا مثل tf.estimator.LatestExporter بتصدير النموذج بأكمله من أحدث نقطة tf.estimator.LatestExporter .

يجب على ناشري الوحدات النمطية تنفيذ توقيع مشترك عندما يكون ذلك ممكنًا ، بحيث يمكن للمستهلكين تبادل الوحدات بسهولة والعثور على أفضل ما يناسب مشكلتهم.

مثال حقيقي

ألق نظرة على مصدر وحدة تضمين النص لدينا للحصول على مثال حقيقي لكيفية إنشاء وحدة من تنسيق تضمين نص شائع.

الكون المثالى

يسمى تدريب متغيرات وحدة مستوردة مع متغيرات النموذج المحيط بها بالضبط الدقيق . يمكن أن يؤدي الضبط الدقيق إلى جودة أفضل ، لكنه يضيف تعقيدات جديدة. ننصح المستهلكين بالبحث في الضبط الدقيق فقط بعد استكشاف تعديلات أبسط للجودة ، وفقط إذا أوصى ناشر الوحدة بذلك.

للمستهلكين

لتمكين الضبط الدقيق ، قم بإنشاء مثيل للوحدة باستخدام hub.Module(..., trainable=True) لجعل متغيراتها قابلة للتدريب واستيراد REGULARIZATION_LOSSES من REGULARIZATION_LOSSES . إذا كانت الوحدة تحتوي على العديد من متغيرات الرسم البياني ، فتأكد من اختيار النوع المناسب للتدريب. عادة ، هذا هو واحد مع العلامات {"train"} .

اختر نظام تدريب لا يفسد الأوزان المدربة مسبقًا ، على سبيل المثال ، معدل تعلم أقل من التدريب من الصفر.

للناشرين

لتسهيل الضبط الدقيق على المستهلكين ، يُرجى مراعاة ما يلي:

  • يحتاج الضبط إلى تسوية. ويتم تصدير الوحدة النمطية الخاص بك مع REGULARIZATION_LOSSES جمع، وهو ما يضع اختيارك لل tf.layers.dense(..., kernel_regularizer=...) الخ في ما يحصل المستهلك من tf.losses.get_regularization_losses() . تفضل هذه الطريقة لتعريف خسائر تسوية L1 / L2.

  • في نموذج الناشر، تجنب يحددان L1 / L2 تسوية عن طريق l1_ و l2_regularization_strength معالم tf.train.FtrlOptimizer ، tf.train.ProximalGradientDescentOptimizer ، وغيرها من أبتيميزر الداني. لا يتم تصديرها جنبًا إلى جنب مع الوحدة النمطية ، وقد لا يكون تحديد نقاط القوة على المستوى العالمي مناسبًا للمستهلك. باستثناء تنظيم L1 في النماذج العريضة (أي الخطية المتفرقة) أو النماذج الواسعة والعميقة ، ينبغي أن يكون من الممكن استخدام خسائر التنظيم الفردية بدلاً من ذلك.

  • إذا كنت تستخدم التسرب ، أو تسوية الدُفعات ، أو تقنيات تدريب مشابهة ، فقم بتعيين معلماتها الفائقة على قيم منطقية عبر العديد من الاستخدامات المتوقعة. قد يتعين تعديل معدل التسرب وفقًا لميل المشكلة المستهدفة إلى التجهيز الزائد. في تسوية الدفعات ، يجب أن يكون الزخم (المعروف أيضًا باسم معامل الانحلال) صغيرًا بما يكفي لتمكين الضبط الدقيق لمجموعات البيانات الصغيرة و / أو الدفعات الكبيرة. للمستهلكين المتقدمين ، ضع في اعتبارك إضافة توقيع يكشف التحكم في معلمات التشعب الحرجة.