الترحيل من TF1 إلى TF2 باستخدام TensorFlow Hub

تشرح هذه الصفحة كيفية الاستمرار في استخدام TensorFlow Hub أثناء ترحيل كود TensorFlow من TensorFlow 1 إلى TensorFlow 2. وهو يكمل دليل الترحيل العام لـ TensorFlow.

بالنسبة إلى TF2، تحول TF Hub بعيدًا عن واجهة برمجة التطبيقات hub.Module القديمة لإنشاء tf.compat.v1.Graph مثل tf.contrib.v1.layers . بدلاً من ذلك، يوجد الآن hub.KerasLayer للاستخدام جنبًا إلى جنب مع طبقات Keras الأخرى لبناء نموذج tf.keras.Model (عادةً في بيئة التنفيذ الحريصة الجديدة لـ TF2 ) وطريقة hub.load() الأساسية الخاصة به لكود TensorFlow منخفض المستوى.

تظل واجهة برمجة التطبيقات hub.Module متاحة في مكتبة tensorflow_hub للاستخدام في TF1 وفي وضع التوافق TF1 لـ TF2. يمكنه فقط تحميل النماذج بتنسيق TF1 Hub .

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

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

ملخص واجهة برمجة التطبيقات الجديدة

hub.load() هي الوظيفة الجديدة ذات المستوى المنخفض لتحميل SavedModel من TensorFlow Hub (أو الخدمات المتوافقة). إنه يلتف حول tf.saved_model.load() الخاص بـ TF2؛ يصف دليل SavedModel الخاص بـ TensorFlow ما يمكنك فعله بالنتيجة.

m = hub.load(handle)
outputs = m(inputs)

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

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

تُظهر العديد من البرامج التعليمية واجهات برمجة التطبيقات هذه أثناء العمل. فيما يلي بعض الأمثلة:

استخدام واجهة برمجة التطبيقات الجديدة في تدريب المقدر

إذا كنت تستخدم TF2 SavedModel في Estimator للتدريب مع خوادم المعلمات (أو في جلسة TF1 مع المتغيرات الموضوعة على الأجهزة البعيدة)، فستحتاج إلى تعيين experimental.share_cluster_devices_in_session في ConfigProto الخاص بـ tf.Session، وإلا فسوف تحصل على خطأ مثل "الجهاز المخصص '/job:ps/replica:0/task:0/device:CPU:0' لا يتطابق مع أي جهاز."

يمكن تعيين الخيار الضروري مثل

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

بدءًا من TF2.2، لم يعد هذا الخيار تجريبيًا، ويمكن إسقاط القطعة .experimental .

تحميل النماذج القديمة بتنسيق TF1 Hub

من الممكن أن يكون نموذج TF2 SavedModel الجديد غير متاح بعد لحالة الاستخدام الخاصة بك وتحتاج إلى تحميل نموذج قديم بتنسيق TF1 Hub. بدءًا من الإصدار 0.7 tensorflow_hub ، يمكنك استخدام النموذج القديم بتنسيق TF1 Hub مع hub.KerasLayer كما هو موضح أدناه:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

بالإضافة إلى ذلك، يعرض KerasLayer القدرة على تحديد tags signature output_key signature_outputs_as_dict لاستخدامات أكثر تحديدًا للنماذج القديمة بتنسيق TF1 Hub والنماذج المحفوظة القديمة.

لمزيد من المعلومات حول توافق تنسيق TF1 Hub، راجع دليل توافق الطراز .

استخدام واجهات برمجة التطبيقات ذات المستوى الأدنى

يمكن تحميل نماذج تنسيق Legacy TF1 Hub عبر tf.saved_model.load . بدلاً من

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

فمن المستحسن استخدام:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

في هذه الأمثلة، m.signatures عبارة عن إملاء لوظائف TensorFlow الملموسة المرتبطة بأسماء التوقيع. استدعاء مثل هذه الوظيفة يحسب جميع مخرجاتها، حتى لو كانت غير مستخدمة. (وهذا يختلف عن التقييم البطيء لوضع الرسم البياني لـ TF1.)