عند إطلاقها في 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
، تحت المفاتيح المحددة بواسطة التوقيع (المفتاح "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
.
النهج العام
لتعريف وحدة نمطية جديدة ، يستدعي الناشر hub.create_module_spec()
بوظيفة module_fn
. تنشئ هذه الوظيفة رسمًا بيانيًا يمثل الهيكل الداخلي للوحدة ، باستخدام 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
يقوم بتصدير النموذج بأكمله من أحدث نقطة فحص.
يجب على ناشري الوحدات النمطية تنفيذ توقيع مشترك عندما يكون ذلك ممكنًا ، بحيث يمكن للمستهلكين تبادل الوحدات بسهولة والعثور على أفضل ما يناسب مشكلتهم.
مثال حقيقي
ألق نظرة على مصدر وحدة تضمين النص لدينا للحصول على مثال حقيقي لكيفية إنشاء وحدة من تنسيق تضمين نص شائع.
الكون المثالى
يسمى تدريب متغيرات الوحدة النمطية المستوردة مع متغيرات النموذج المحيط بها بالضبط الدقيق . يمكن أن يؤدي الضبط الدقيق إلى جودة أفضل ، لكنه يضيف تعقيدات جديدة. ننصح المستهلكين بالبحث في الضبط الدقيق فقط بعد استكشاف تعديلات أبسط للجودة ، وفقط إذا أوصى ناشر الوحدة بذلك.
للمستهلكين
لتمكين الضبط الدقيق ، قم بإنشاء مثيل للوحدة باستخدام hub.Module(..., trainable=True)
لجعل متغيراتها قابلة للتدريب واستيراد REGULARIZATION_LOSSES
من TensorFlow. إذا كانت الوحدة تحتوي على العديد من متغيرات الرسم البياني ، فتأكد من اختيار النوع المناسب للتدريب. عادة ، هذا هو واحد مع العلامات {"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 في النماذج العريضة (أي الخطية المتفرقة) أو النماذج الواسعة والعميقة ، ينبغي أن يكون من الممكن استخدام خسائر التنظيم الفردية بدلاً من ذلك.إذا كنت تستخدم التسرب ، أو تسوية الدُفعات ، أو تقنيات تدريب مشابهة ، فقم بتعيين معلماتها الفائقة على قيم منطقية عبر العديد من الاستخدامات المتوقعة. قد يتعين تعديل معدل التسرب وفقًا لميل المشكلة المستهدفة إلى التجهيز الزائد. في تسوية الدفعات ، يجب أن يكون الزخم (المعروف أيضًا باسم معامل الانحلال) صغيرًا بما يكفي لتمكين الضبط الدقيق لمجموعات البيانات الصغيرة و / أو الدفعات الكبيرة. للمستهلكين المتقدمين ، ضع في اعتبارك إضافة توقيع يكشف التحكم في معلمات التشعب الحرجة.