النماذج المحفوظة القابلة لإعادة الاستخدام

مقدمة

يستضيف TensorFlow Hub SavedModels لـ TensorFlow 2، من بين أصول أخرى. يمكن تحميلها مرة أخرى إلى برنامج Python باستخدام obj = hub.load(url) [ معرفة المزيد ]. obj الذي تم إرجاعه هو نتيجة tf.saved_model.load() (راجع دليل SavedModel الخاص بـ TensorFlow ). يمكن أن يحتوي هذا الكائن على سمات عشوائية مثل tf.functions، وtf.Variables (التي تتم تهيئتها من قيمها المدربة مسبقًا)، وموارد أخرى، وبشكل متكرر، المزيد من هذه الكائنات.

تصف هذه الصفحة الواجهة التي سيتم تنفيذها بواسطة obj المحمل لإعادة استخدامها في برنامج TensorFlow Python. تسمى SavedModels المطابقة لهذه الواجهة بالنماذج المحفوظة القابلة لإعادة الاستخدام .

إعادة الاستخدام تعني بناء نموذج أكبر حول obj ، بما في ذلك القدرة على ضبطه. الضبط الدقيق يعني المزيد من التدريب على الأوزان الموجودة في obj المحمل كجزء من النموذج المحيط. يتم تحديد وظيفة الخسارة والمُحسِّن بواسطة النموذج المحيط؛ يحدد obj فقط تعيين عمليات تنشيط المدخلات والمخرجات ("التمرير الأمامي")، وربما يتضمن تقنيات مثل التسرب أو تسوية الدُفعات.

يوصي فريق TensorFlow Hub بتنفيذ واجهة SavedModel القابلة لإعادة الاستخدام في جميع SavedModels التي من المفترض إعادة استخدامها بالمعنى المذكور أعلاه. العديد من الأدوات المساعدة من مكتبة tensorflow_hub ، ولا سيما hub.KerasLayer ، تتطلب SavedModels لتنفيذها.

العلاقة بـ SignatureDefs

هذه الواجهة من حيث وظائف tf. وميزات TF2 الأخرى منفصلة عن توقيعات SavedModel، والتي كانت متاحة منذ TF1 ويستمر استخدامها في TF2 للاستدلال (مثل نشر SavedModels إلى TF Serving أو TF Lite). تواقيع الاستدلال ليست معبرة بما يكفي لدعم الضبط الدقيق، وتوفر tf.function واجهة برمجة تطبيقات Python أكثر طبيعية وتعبيرية للنموذج المعاد استخدامه.

العلاقة بمكتبات بناء النماذج

يستخدم SavedModel القابل لإعادة الاستخدام عناصر TensorFlow 2 الأولية فقط، بشكل مستقل عن أي مكتبة معينة لبناء النماذج مثل Keras أو Sonnet. وهذا يسهل إعادة الاستخدام عبر مكتبات بناء النماذج، خالية من التبعيات على كود بناء النموذج الأصلي.

ستكون هناك حاجة إلى قدر من التكيف لتحميل النماذج المحفوظة القابلة لإعادة الاستخدام أو حفظها من أي مكتبة معينة لبناء النماذج. بالنسبة إلى Keras، يوفر hub.KerasLayer التحميل، وقد تمت إعادة تصميم حفظ Keras المدمج بتنسيق SavedModel لـ TF2 بهدف توفير مجموعة شاملة من هذه الواجهة (راجع RFC من مايو 2019).

العلاقة بـ "واجهات برمجة تطبيقات SavedModel الشائعة" الخاصة بالمهمة

يسمح تعريف الواجهة في هذه الصفحة بأي عدد ونوع من المدخلات والمخرجات. تعمل واجهات برمجة التطبيقات SavedModel المشتركة لـ TF Hub على تحسين هذه الواجهة العامة من خلال اصطلاحات الاستخدام لمهام محددة لجعل النماذج قابلة للتبديل بسهولة.

تعريف الواجهة

صفات

إن SavedModel القابل لإعادة الاستخدام هو TensorFlow 2 SavedModel بحيث يقوم obj = tf.saved_model.load(...) بإرجاع كائن له السمات التالية

  • __call__ . مطلوب. دالة tf تنفذ حساب النموذج ("التمرير الأمامي") وفقًا للمواصفات أدناه.

  • variables : قائمة بكائنات tf.Variable، تسرد جميع المتغيرات المستخدمة بواسطة أي استدعاء محتمل لـ __call__ ، بما في ذلك المتغيرات القابلة للتدريب وغير القابلة للتدريب.

    يمكن حذف هذه القائمة إذا كانت فارغة.

  • trainable_variables : قائمة بكائنات tf.Variable بحيث يكون v.trainable صحيحًا لجميع العناصر. يجب أن تكون هذه المتغيرات مجموعة فرعية من variables . هذه هي المتغيرات التي يجب تدريبها عند ضبط الكائن. قد يختار منشئ SavedModel حذف بعض المتغيرات هنا التي كانت قابلة للتدريب في الأصل للإشارة إلى أنه لا ينبغي تعديلها أثناء الضبط الدقيق.

    يمكن حذف هذه القائمة إذا كانت فارغة، على وجه الخصوص، إذا كان SavedModel لا يدعم الضبط الدقيق.

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

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

وظيفة __call__

يحتوي obj SavedModel المستعاد على سمة obj.__call__ وهي وظيفة tf. التي تمت استعادتها وتسمح باستدعاء obj على النحو التالي.

ملخص (رمز زائف):

outputs = obj(inputs, trainable=..., **kwargs)

الحجج

الحجج هي كما يلي.

  • توجد وسيطة موضعية واحدة مطلوبة مع مجموعة من عمليات تنشيط الإدخال الخاصة بـ SavedModel. نوعه هو واحد من

    • موتر واحد لإدخال واحد،
    • قائمة Tensors لتسلسل مرتب من المدخلات غير المسماة،
    • إملاء Tensors مرتبط بمجموعة معينة من أسماء الإدخال.

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

  • قد يكون هناك training اختياري على وسيطة الكلمات الرئيسية يقبل لغة Python المنطقية أو True أو False . الافتراضي هو False . إذا كان النموذج يدعم الضبط الدقيق، وإذا كان حسابه يختلف بين الاثنين (على سبيل المثال، كما هو الحال في تسوية التسرب والدفعة)، فسيتم تنفيذ هذا التمييز باستخدام هذه الوسيطة. وإلا فإن هذه الحجة قد تكون غائبة.

    ليس من الضروري أن يقبل __call__ وسيطة training ذات قيمة Tensor. يقع على عاتق المتصل استخدام tf.cond() إذا لزم الأمر للإرسال بينهما.

  • قد يختار منشئ SavedModel قبول المزيد kwargs الاختيارية لأسماء معينة.

    • بالنسبة للوسائط ذات قيمة Tensor، يحدد منشئ SavedModel أنواعها وأشكالها المسموح بها. تقبل tf.function قيمة افتراضية لـ Python على وسيطة يتم تتبعها باستخدام إدخال tf.TensorSpec. يمكن استخدام مثل هذه الوسيطات للسماح بتخصيص المعلمات الرقمية المتضمنة في __call__ (على سبيل المثال، معدل التسرب).

    • بالنسبة للوسائط ذات قيمة Python، يحدد منشئ SavedModel قيمها المسموح بها. يمكن استخدام مثل هذه الوسائط كأعلام لإجراء اختيارات منفصلة في الدالة المتتبعة (لكن انتبه إلى الانفجار التوافقي للآثار).

يجب أن توفر الدالة __call__ المستعادة تتبعات لكافة مجموعات الوسائط المسموح بها. إن تقليب training بين True False يجب ألا يغير من جواز الحجج.

نتيجة

يمكن أن تكون outputs استدعاء obj

  • موتر واحد لإخراج واحد،
  • قائمة Tensors لتسلسل مرتب من المخرجات غير المسماة،
  • إملاء Tensors مرتبط بمجموعة معينة من أسماء المخرجات.

(قد تسمح المراجعات المستقبلية لهذه الواجهة بتداخلات أكثر عمومية.) قد يختلف نوع الإرجاع اعتمادًا على kwargs ذات قيمة بايثون. وهذا يسمح للأعلام بإنتاج مخرجات إضافية. يحدد منشئ SavedModel أنواع وأشكال الإخراج واعتمادها على المدخلات.

الأسماء القابلة للاستدعاء

يمكن أن يوفر SavedModel القابل لإعادة الاستخدام أجزاء نموذجية متعددة بالطريقة الموضحة أعلاه عن طريق وضعها في كائنات فرعية مسماة، على سبيل المثال، obj.foo و obj.bar وما إلى ذلك. يوفر كل كائن فرعي طريقة __call__ والسمات الداعمة حول المتغيرات وما إلى ذلك الخاصة بتلك القطعة النموذجية. في المثال أعلاه، سيكون هناك obj.foo.__call__ و obj.foo.variables وما إلى ذلك.

لاحظ أن هذه الواجهة لا تغطي طريقة إضافة دالة tf. مجردة مباشرة مثل tf.foo .

من المتوقع أن يتعامل مستخدمو النماذج المحفوظة القابلة لإعادة الاستخدام مع مستوى واحد فقط من التداخل ( obj.bar ولكن ليس obj.bar.baz ). (قد تسمح المراجعات المستقبلية لهذه الواجهة بتداخل أعمق، وقد تتنازل عن شرط أن يكون كائن المستوى الأعلى قابلاً للاستدعاء بنفسه.)

الملاحظات الختامية

العلاقة بواجهات برمجة التطبيقات قيد التشغيل

يصف هذا المستند واجهة فئة Python التي تتكون من عناصر أولية مثل tf.function و tf.Variable التي تبقى على قيد الحياة ذهابًا وإيابًا من خلال التسلسل عبر tf.saved_model.save() و tf.saved_model.load() . ومع ذلك، كانت الواجهة موجودة بالفعل على الكائن الأصلي الذي تم تمريره إلى tf.saved_model.save() . يتيح التكيف مع تلك الواجهة تبادل قطع النماذج عبر واجهات برمجة التطبيقات لبناء النماذج ضمن برنامج TensorFlow واحد.