النماذج المحفوظة من TF Hub في TensorFlow 2

و شكل SavedModel من TensorFlow 2 هي الطريقة الموصى بها لنماذج تدريب ما قبل حصة وقطع النموذج على TensorFlow المحور. وهي تحل محل أقدم شكل TF1 المحور ، وتأتي مع مجموعة جديدة من واجهات برمجة التطبيقات.

تشرح هذه الصفحة كيفية إعادة استخدام TF2 SavedModels في برنامج TensorFlow 2 مع مستوى منخفض hub.load() API والتي hub.KerasLayer المجمع. (عادة hub.KerasLayer وجنبا إلى جنب مع غيرها من tf.keras.layers لبناء نموذج Keras أو model_fn من TF2 مقدر.) ويمكن لهذه واجهات برمجة التطبيقات أيضا تحميل النماذج الموروثة في شكل TF1 المحور، ضمن حدود، راجع دليل التوافق .

يمكن لمستخدمي TensorFlow 1 التحديث إلى TF 1.15 ثم استخدام نفس واجهات برمجة التطبيقات. الإصدارات القديمة من TF1 لا تعمل.

باستخدام SavedModels من TF Hub

استخدام نموذج SavedModel في Keras

Keras هو API رفيع المستوى TensorFlow لبناء نماذج التعلم العميق من تأليف الأجسام طبقة Keras. و tensorflow_hub توفر مكتبة الطبقة hub.KerasLayer أن يحصل على تهيئة مع URL (أو مسار الملفات) من SavedModel ومن ثم توفر حساب من SavedModel، بما في ذلك الأوزان المدربين قبل لها.

فيما يلي مثال على استخدام تضمين نص تم تدريبه مسبقًا:

import tensorflow as tf
import tensorflow_hub as hub

hub_url = "https://tfhub.dev/google/nnlm-en-dim128/2"
embed = hub.KerasLayer(hub_url)
embeddings = embed(["A long sentence.", "single-word", "http://example.com"])
print(embeddings.shape, embeddings.dtype)

من هذا ، يمكن بناء مصنف النص بالطريقة المعتادة Keras:

model = tf.keras.Sequential([
    embed,
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(1, activation="sigmoid"),
])

و colab تصنيف النص هو مثال كامل كيفية تدريب وتقييم مثل هذا المصنف.

الأوزان نموذج في hub.KerasLayer يتم تعيين لغير قابلة للتدريب افتراضيا. راجع قسم الضبط أدناه للتعرف على كيفية تغيير ذلك. تتم مشاركة الأوزان بين جميع التطبيقات لنفس كائن الطبقة ، كما هو معتاد في Keras.

استخدام SavedModel في مقدر

مستخدمي TensorFlow و مقدر يمكن API للتدريب موزعة استخدام SavedModels من TF المحور عن طريق الكتابة على model_fn من حيث hub.KerasLayer من بين أمور أخرى tf.keras.layers .

خلف الكواليس: SavedModel download and caching

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

استخدام SavedModel في TensorFlow منخفض المستوى

وظيفة hub.load(handle) التنزيلات وضغطها على SavedModel (إلا handle هو بالفعل مسار الملفات) ثم إرجاع نتيجة لتحميله مع المدمج في وظيفة TensorFlow في tf.saved_model.load() . ولذلك، hub.load() يمكن التعامل مع أي SavedModel صالحة (على عكس سابقتها hub.Module لTF1).

موضوع متقدم: ما يمكن توقعه من SavedModel بعد التحميل

اعتمادا على محتويات SavedModel، نتيجة obj = hub.load(...) يمكن الاحتجاج بطرق مختلفة (كما هو موضح في الكثير بمزيد من التفصيل في TensorFlow في دليل SavedModel :

  • ويمثل التوقيعات خدمة للSavedModel (إن وجدت)، وقاموس وظائف محددة، ويمكن أن تسمى مثل tensors_out = obj.signatures["serving_default"](**tensors_in) ، مع قواميس التنسورات مرتبطا بها المدخلات والمخرجات منها الأسماء وتخضع لشكل التوقيع وقيود النوع.

  • و @tf.function تتم استعادة أساليب -decorated الكائن المحفوظة (إن وجدت) ككائنات tf.function التي يمكن استدعاؤها من قبل كافة تركيبات من الحجج التنسور وغير التنسور للالذي tf.function قد تتبعت قبل إنقاذ. على وجه الخصوص، إذا كان هناك obj.__call__ الأسلوب مع آثار مناسبة، obj نفسها يمكن أن يسمى مثل وظيفة بيثون. وهناك مثال بسيط يمكن أن تبدو وكأنها output_tensor = obj(input_tensor, training=False) .

هذا يترك حرية هائلة في الواجهات التي يمكن أن تطبقها SavedModels. و اجهة قابلة لإعادة الاستخدام SavedModels عن obj تنص الاتفاقيات بحيث رمز العميل، بما في ذلك محولات مثل hub.KerasLayer ، ومعرفة كيفية استخدام SavedModel.

قد لا تتبع بعض نماذج SavedModels هذا الاصطلاح ، خاصةً النماذج الكاملة التي لا يُقصد منها إعادة استخدامها في النماذج الأكبر حجمًا ، وتقدم فقط تواقيع الخدمة.

وإعادة تحميل متغيرات قابلة للتدريب في SavedModel كما قابلة للتدريب، و tf.GradientTape سوف مشاهدتها بشكل افتراضي. راجع قسم الضبط أدناه للحصول على بعض التحذيرات ، وفكر في تجنب ذلك للمبتدئين. حتى إذا كنت ترغب في صقل، قد ترغب في معرفة ما إذا كان obj.trainable_variables تنصح لإعادة تدريب مجموعة فرعية فقط من متغيرات قابلة للتدريب أصلا.

إنشاء SavedModels لـ TF Hub

ملخص

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

إنقاذ من كيراس

بدءا TensorFlow 2، tf.keras.Model.save() و tf.keras.models.save_model() الافتراضي إلى تنسيق SavedModel (لا HDF5). وSavedModels الناتجة التي يمكن استخدامها مع hub.load() ، hub.KerasLayer والمحولات مشابهة ل API أخرى رفيعة المستوى لأنها تصبح متاحة.

لمشاركة Keras نموذج كامل، مجرد حفظه مع include_optimizer=False .

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

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

.. أو قص القطعة لمشاركتها بعد الحقيقة (إذا كانت تتماشى مع طبقات نموذجك الكامل):

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

نماذج TensorFlow على جيثب يستخدم النهج السابق بيرت (انظر البرمجة اللغوية العصبية / أدوات / export_tfhub_lib.py ، لاحظ انقسام بين core_model للتصدير و pretrainer لاستعادة الحاجز) وهذا النهج الأخير لResNet (انظر رؤية / image_classification / tfhub_export. الحمر ).

التوفير من TensorFlow منخفض المستوى

وهذا يتطلب معرفة جيدة مع TensorFlow في دليل SavedModel .

إذا كنت ترغب في توفير أكثر من مجرد توقيع خدمة، يجب تنفيذ واجهة قابلة لإعادة الاستخدام SavedModel . من الناحية المفاهيمية ، يبدو هذا

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

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

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

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

للمستهلكين SavedModel

إنشاء hub.KerasLayer مثل

layer = hub.KerasLayer(..., trainable=True)

يتيح ضبط SavedModel الذي تم تحميله بواسطة الطبقة. إنها تضيف الأوزان القابلة للتدريب ومنظمي الوزن المعلن عنها في SavedModel إلى نموذج Keras ، وتدير حساب SavedModel في وضع التدريب (فكر في التسرب وما إلى ذلك).

و colab تصنيف الصور يحتوي على سبيل المثال نهاية إلى نهاية مع اختياري صقل.

إعادة تصدير نتيجة الضبط الدقيق

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

loaded_obj = hub.load("https://tfhub.dev/...")
hub_layer = hub.KerasLayer(loaded_obj, trainable=True, ...)

model = keras.Sequential([..., hub_layer, ...])
model.compile(...)
model.fit(...)

export_module_dir = os.path.join(os.getcwd(), "finetuned_model_export")
tf.saved_model.save(loaded_obj, export_module_dir)

لمنشئي SavedModel

عند إنشاء SavedModel للمشاركة على TensorFlow Hub ، فكر مسبقًا فيما إذا وكيف ينبغي للمستهلكين تعديله ، وتقديم الإرشادات في الوثائق.

يجب توفير من Keras نموذج جعل جميع اليات العمل صقل (إنقاذ خسائر الوزن التنظيم، معلنا متغيرات قابلة للتدريب والبحث عن المفقودين __call__ لكل من training=True و training=False ، وما إلى ذلك)

اختر واجهة نموذج تعمل بشكل جيد مع تدفق التدرج ، على سبيل المثال ، تسجيلات الإخراج بدلاً من احتمالات softmax أو تنبؤات top-k.

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

يتم حفظ regularizers الوزن على طبقات الفردية (مع معاملات قوة تنظيم بهم)، ولكن الوزن تسوية من داخل محسن (مثل tf.keras.optimizers.Ftrl.l1_regularization_strength=...) ) وخسر. قم بإبلاغ المستهلكين بنموذج SavedModel الخاص بك وفقًا لذلك.