این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

مدلهای ذخیره شده از TF Hub در TensorFlow 2

قالب SavedModel TensorFlow 2 روش پیشنهادی برای به اشتراک گذاشتن مدلهای از قبل آموزش دیده و قطعات مدل در TensorFlow Hub است. جایگزین قالب قدیمی TF1 Hub می شود و با مجموعه جدیدی از API ارائه می شود.

در این صفحه نحوه استفاده مجدد از TF2 SavedModels در برنامه TensorFlow 2 با API سطح پایین hub.load() و بسته بندی آن hub.KerasLayer . (به طور معمول ، hub.KerasLayer با سایر tf.keras.layers ترکیب می شود تا یک مدل Keras یا model_fn یک برآوردگر TF2 model_fn .) همچنین این API ها می توانند مدل های قدیمی را در قالب TF1 Hub بارگیری کنند ، در محدودیت ها ، به راهنمای سازگاری مراجعه کنید.

کاربران TensorFlow 1 می توانند به TF 1.15 به روز شوند و سپس از همان API ها استفاده کنند. نسخه های قدیمی TF1 کار نمی کنند.

استفاده از SavedModels از TF Hub

استفاده از یک مدل SavedMel در کراس

Keras یک API سطح بالا TensorFlow برای ساخت مدل های یادگیری عمیق با ترکیب اشیاay لایه Keras است. کتابخانه tensorflow_hub کلاس hub.KerasLayer فراهم می کند که با URL (یا مسیر سیستم فایل) یک SavedModel مقداردهی اولیه می شود و سپس محاسبه را از SavedModel ، از جمله وزن های از قبل آموزش داده شده ارائه می دهد.

در اینجا مثالی از استفاده از تعبیه متن از پیش آموزش دیده شده وجود دارد:

import tensorflow as tf
import tensorflow_hub as hub

hub_url = "https://tfhub.dev/google/tf2-preview/nnlm-en-dim128/1"
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"),
])

متن طبقه بندی متن نمونه کاملی از نحوه آموزش و ارزیابی چنین طبقه بندی است.

وزن مدل ها در یک hub.KerasLayer به طور پیش فرض غیرقابل آموزش است. برای نحوه تغییر آن به بخش تنظیم دقیق در زیر مراجعه کنید. وزن ها بین همه برنامه های شی object یک لایه طبق معمول در کراس به اشتراک گذاشته می شوند.

استفاده از SavedModel در برآوردگر

کاربران TensorFlow's Estimator API برای آموزش توزیع شده می توانند از SavedModels از TF Hub با نوشتن model_fn خود از نظر hub.KerasLayer در میان سایر tf.keras.layers .

پشت صحنه: بارگیری و ذخیره سازی ذخیره شده مدل

با استفاده از SavedModel از TensorFlow Hub (یا سایر سرورهای HTTPS که پروتکل میزبانی آن را پیاده سازی می کنند) بارگیری می شود و در صورت عدم وجود آن را در سیستم فایل محلی از حالت فشرده خارج می کنید. متغیر محیطی TFHUB_CACHE_DIR می توان به گونه ای تنظیم کرد که مکان موقتی پیش فرض را برای ذخیره مدل های ذخیره شده فشرده نشده و فشرده شده لغو کند. برای جزئیات ، به ذخیره سازی مراجعه کنید.

استفاده از SavedModel در سطح پایین TensorFlow

عملکرد hub.load(handle) یک SavedModel را بارگیری و از حالت فشرده خارج می کند (مگر اینکه handle از قبل مسیر سیستم فایل باشد) و سپس نتیجه بارگیری آن را با عملکرد tf.saved_model.load() برمی گرداند. بنابراین ، hub.load() می تواند هر SavedModel معتبری را مدیریت کند (برخلاف hub.Module قبلی خود برای TF1).

مبحث پیشرفته: انتظارات پس از بارگیری از SavedModel

بسته به محتویات SavedModel ، نتیجه obj = hub.load(...) می توان به روش های مختلف فراخوانی کرد (همانطور که در راهنمای SavedModel TensorFlow با جزئیات بیشتر توضیح داده شده است:

  • امضاهای ارائه شده از SavedModel (در صورت وجود) به عنوان یک دیکشنری از توابع مشخص نشان داده می شوند و می توان آنها را مانند tensors_out = obj.signatures["serving_default"](**tensors_in) ، با دیکشنری های tensors_out = obj.signatures["serving_default"](**tensors_in) که توسط ورودی و خروجی مربوطه کلید می tensors_out = obj.signatures["serving_default"](**tensors_in) نام و منوط به محدودیت های شکل و نوع امضا.

  • روشهای @tf.function از شی ذخیره شده (در صورت وجود) به عنوان اشیاunction tf.function بازیابی می شوند که می توان آنها را با تمام ترکیبات آرگومانهای Tensor و غیر Tensor که قبل از صرفه جویی در آنها tf.faction ردیابی شده است فراخوانی کرد. به طور خاص ، اگر یک روش obj.__call__ با ردیابی های مناسب وجود داشته باشد ، می توان obj را مانند یک تابع Python فراخوانی کرد. یک مثال ساده می تواند مانند output_tensor = obj(input_tensor, training=False) .

این آزادی عظیم در رابط هایی است که SavedModels می تواند پیاده سازی کند. رابط قابل استفاده مجدد SavedModels برای obj قراردادهایی را ایجاد می کند که کد سرویس گیرنده ، از جمله آداپتورهایی مانند hub.KerasLayer . hub.KerasLayer ، نحوه استفاده از SavedModel را می داند.

برخی از مدلهای SavedMon ممکن است از آن کنوانسیون پیروی نکنند ، مخصوصاً مدلهای کامل که قرار نیست در مدلهای بزرگتر مورد استفاده مجدد قرار بگیرند و فقط امضاهای ارائه دهنده را ارائه می دهند.

متغیرهای قابل آموزش در یک SavedModel به عنوان قابل آموزش بارگیری می شوند و tf.GradientTape به طور پیش فرض آنها را تماشا می کند. برای برخی از هشدارها ، به بخش تنظیم دقیق در زیر مراجعه کنید و اجتناب از این کار را برای مبتدیان در نظر بگیرید. حتی اگر می خواهید تنظیم دقیق کنید ، ممکن است بخواهید ببینید obj.trainable_variables توصیه می کند فقط زیرمجموعه ای از متغیرهای قابل آموزش را دوباره آموزش دهید.

ایجاد مدلهای ذخیره شده برای TF Hub

بررسی اجمالی

SavedModel قالب سریال سازی استاندارد TensorFlow برای مدلهای آموزش دیده یا قطعات مدل است. وزن های آموزش دیده مدل را همراه با عملیات دقیق TensorFlow ذخیره می کند تا محاسبات آن انجام شود. می تواند به طور مستقل از کدی که ایجاد کرده استفاده شود. به طور خاص ، می توان از آن در API های مختلف سطح بالا ساخت مدل مانند Keras استفاده مجدد کرد ، زیرا عملیات TensorFlow زبان اصلی مشترک آنها است.

پس انداز از کراس

با شروع tf.keras.Model.save() 2 ، tf.keras.Model.save() و tf.keras.models.save_model() به طور پیش فرض در قالب SavedModel (نه HDF5). مدل های ذخیره شده Saved که می توانند با در 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 در GitHub استفاده از روش سابق برت (نگاه کنید به NLP / برت / bert_models.py و NLP / برت / export_tfhub.py ، توجه داشته باشید شکاف بین core_model و pretrain_model ) و روش دوم برای RESNET (نگاه کنید به چشم انداز / image_classification / tfhub_export .سپس )

در حال ذخیره از TensorFlow سطح پایین

این مستلزم آشنایی کافی با راهنمای SavedModel TensorFlow است .

اگر می خواهید چیزی بیش از یک امضای سرویس ارائه ندهید ، باید رابط SavedModel قابل استفاده مجدد را پیاده سازی کنید . از نظر مفهومی ، این به نظر می رسد

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super(MyMulModel, self).__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

کد موجود در tensorflow / مثالها / ذخیره شده_مدل / آزمایشات_پارچگی / شامل مثالهای بزرگتر است ، esp. export_mnist.py و use_mnist.py جفت.

تنظیم دقیق

آموزش متغیرهای آموزش دیده SavedModel وارداتی همراه با مدل های موجود در اطراف آن ، تنظیم دقیق SavedModel نامیده می شود. این می تواند منجر به کیفیت بهتر شود ، اما اغلب آموزش را بیشتر طلب می کند (ممکن است زمان بیشتری طول بکشد ، بیشتر به بهینه ساز و بیش از حد پارامترهای آن بستگی داشته باشد ، خطر نصب بیش از حد را افزایش دهد و نیاز به تقویت مجموعه داده ها ، به ویژه CNN ها). ما به مصرف کنندگان SavedModel توصیه می کنیم فقط پس از ایجاد یک رژیم آموزشی خوب ، تنظیم دقیق آن را انجام دهند و فقط در صورت توصیه ناشر SavedModel.

تنظیم دقیق پارامترهای مدل "مداوم" را که آموزش می بینند تغییر می دهد. این تبدیلات رمزگذاری شده سخت را تغییر نمی دهد ، مانند رمزگذاری ورودی متن و نقشه برداری نشانه ها به ورودی های مربوطه در یک ماتریس تعبیه شده.

برای مصرف کنندگان SavedModel

ایجاد یک hub.KerasLayer مانند

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

تنظیم دقیق SavedModel بارگذاری شده توسط لایه را امکان پذیر می کند. این وزنه های قابل آموزش و تنظیم کننده های وزن اعلام شده در مدل SavedMel را به مدل Keras اضافه می کند و محاسبات SavedModel را در حالت آموزش اجرا می کند (به فکر افت تحصیل و غیره باشید).

کلاگ طبقه بندی تصویر شامل یک مثال از پایان به انتها با تنظیم دقیق اختیاری است.

صادرات مجدد نتیجه تنظیم دقیق

کاربران پیشرفته ممکن است بخواهند نتایج تنظیم دقیق را در یک 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

هنگام ایجاد یک مدل SavedMod برای اشتراک گذاری در TensorFlow Hub ، در مورد اینکه آیا و چگونه مصرف کنندگان آن باید آن را تنظیم دقیق کنند ، فکر کنید و در اسناد راهنمایی کنید.

صرفه جویی در مدل Keras باید تمام مکانیک های تنظیم دقیق کار را ایجاد کند (صرفه جویی در کاهش وزن تنظیم شده ، اعلام متغیرهای قابل آموزش ، ردیابی __call__ برای هر دو training=True و training=False و غیره)

یک رابط مدل انتخاب کنید که با جریان شیب به خوبی بازی کند ، به عنوان مثال ، به جای احتمالات softmax یا پیش بینی های top-k ، از خروجی های خروجی استفاده کنید.

اگر مدل از ترک تحصیل ، عادی سازی دسته ای یا روش های مشابه آموزشی که شامل ابر پارامترها هستند استفاده می کند ، آنها را روی مقادیری تنظیم کنید که در بسیاری از مشکلات هدف و اندازه های دسته ای منطقی باشد. (از زمان نگارش این مقاله ، صرفه جویی در هزینه Keras اجازه نمی دهد مصرف کنندگان آنها را تنظیم کنند ، اما برای برخی از راه حل های خام tensorflow / مثال / ذخیره شده_مدل / یکپارچه سازی_تست / صادرات_منیست_ cnn.py را ببینید .)

تنظیم کننده های وزن در لایه های منفرد ذخیره می شوند (با ضرایب قدرت تنظیم آنها) ، اما تنظیم وزن از درون بهینه ساز (مانند tf.keras.optimizers.Ftrl.l1_regularization_strength=...) از بین می رود. بر این اساس به مصرف کنندگان SavedModel خود مشاوره دهید.