ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تنسيق محور TF1

عند إطلاقه في عام 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= الوسيطة.

إذا كان التوقيع يحتوي على إدخالات متعددة ، فيجب تمريرها على شكل إملاء ، مع المفاتيح التي يحددها التوقيع. وبالمثل ، إذا كان التوقيع يحتوي على مخرجات متعددة ، فيمكن استعادتها على أنها as_dict=True بتمرير as_dict=True ، تحت المفاتيح المحددة بواسطة التوقيع (المفتاح "default" as_dict=False المفرد الذي تم إرجاعه إذا كان 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() المتصل. ثم يحدد التوقيعات عن طريق استدعاء 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 ، يقوم hub.LatestModuleExporter بتصدير الوحدات النمطية من أحدث نقاط التفتيش ، تمامًا مثل tf.estimator.LatestExporter بتصدير النموذج بأكمله من أحدث نقاط التفتيش.

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

مثال حقيقي

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

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

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

للمستهلكين

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

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

للناشرين

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

  • الضبط الدقيق يحتاج إلى تسوية. يتم تصدير REGULARIZATION_LOSSES مع مجموعة 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 في النماذج العريضة (أي الخطية المتفرقة) أو النماذج العريضة والعميقة ، يجب أن يكون من الممكن استخدام خسائر التسوية الفردية بدلاً من ذلك.

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