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

قالب TF1 Hub

TensorFlow Hub در هنگام راه اندازی در سال 2018 ، یک نوع دارایی را ارائه داد: قالب TF1 Hub برای وارد کردن به برنامه های TensorFlow 1.

در این صفحه نحوه استفاده از قالب TF1 Hub در TF1 (یا حالت سازگاری TF1 TF2) با hub.Module کلاس و API های مرتبط توضیح داده شده است. (کاربرد معمول ساخت tf.Graph ، احتمالاً درون یک TF1 Estimator ، با ترکیب یک یا چند مدل در قالب TF1 Hub با tf.compat.layers یا tf.layers ).

کاربران TensorFlow 2 (خارج از حالت سازگاری TF1) باید از API جدید با hub.load() یا hub.KerasLayer . API جدید نوع دارایی TF2 SavedModel جدید را بارگیری می کند ، اما همچنین از بارگیری قالب TF1 Hub در TF2 پشتیبانی محدودی دارد.

استفاده از مدل در قالب TF1 Hub

نمونه سازی مدل در قالب TF1 Hub

یک مدل در قالب TF1 Hub با ایجاد یک توپی به یک برنامه hub.Module شود. شی object hub.Module را از یک رشته با URL یا مسیر سیستم فایل خود وارد کنید ، مانند:

m = hub.Module("path/to/a/module_dir")

این متغیرهای ماژول را به نمودار TensorFlow فعلی اضافه می کند. با اجرای مقادیر اولیه مقادیر از قبل آموزش دیده آنها از دیسک خوانده می شود. به همین ترتیب ، جداول و حالت دیگر به نمودار اضافه می شود.

ماژول های ذخیره

هنگام ایجاد ماژول از یک URL ، محتوای ماژول بارگیری و در فهرست موقتی سیستم محلی ذخیره می شود. با استفاده از متغیر محیط TFHUB_CACHE_DIR می توان مکانی را که ماژول ها در آن پنهان می شوند ، لغو کرد. برای جزئیات ، به ذخیره سازی مراجعه کنید.

استفاده از ماژول

پس از نمونه سازی ، یک ماژول m می توان صفر یا بیشتر بار مانند یک تابع Python از ورودی های تنسور به خروجی های تنسور صدا زد:

y = m(x)

هر چنین فراخوانی عملیاتی را به نمودار TensorFlow فعلی اضافه می کند تا y از x محاسبه کند. اگر این شامل متغیرهایی با وزن آموزش دیده باشد ، این موارد بین همه برنامه ها تقسیم می شوند.

ماژول ها می توانند چندین امضای نامگذاری شده را تعریف کنند تا بتوانند به بیش از یک روش اعمال شوند (شبیه به روشهای استفاده از اشیا Py پایتون). مستندات یک ماژول باید امضاهای موجود را توصیف کند. تماس فوق امضایی را با عنوان "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 گره خورده است. فقط در TensorFlow فقط تا حدی توسط TF Hub پشتیبانی می شود. لطفاً در عوض انتشار در قالب TF2 SavedModel جدید را در نظر بگیرید.

قالب TF1 Hub مشابه قالب SavedModel TensorFlow 1 در سطح نحوی است (نام پرونده ها و پیام های پروتکل یکسان) اما از نظر معنایی متفاوت است تا امکان استفاده مجدد ، ترکیب و آموزش مجدد ماژول را فراهم کند (به عنوان مثال ذخیره سازی متفاوت منابع اولیه ، برچسب گذاری متفاوت قراردادها برای متاگرافها). ساده ترین راه برای تشخیص آنها در دیسک ، وجود یا عدم وجود فایل tfhub_module.pb است.

رویکرد کلی

برای تعریف یک ماژول جدید ، ناشر به hub.create_module_spec() با عملکرد module_fn . این تابع با استفاده از tf.placeholder() ورودی هایی که توسط تماس گیرنده تأمین می شود ، 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 به مسیر عبور داده شده سریال می کند. این می تواند هنگام صادرات یک ماژول برای اولین بار ، و همچنین هنگام صادرات یک ماژول تنظیم دقیق استفاده شود.

برای سازگاری با hub.LatestModuleExporter Estimators ، hub.LatestModuleExporter ماژول ها را از آخرین ایست بازرسی صادر می کند ، دقیقاً مانند tf.estimator.LatestExporter کل مدل را از آخرین ایست بازرسی صادر می کند.

ناشران ماژول باید در صورت امکان یک امضای مشترک را پیاده سازی کنند تا مصرف کنندگان بتوانند به راحتی ماژول ها را تبادل کرده و بهترین مورد را برای مشکل خود پیدا کنند.

مثال واقعی

برای نمونه ای از نحوه ایجاد ماژول از قالب مشترک تعبیه متن ، به صادرکننده ماژول تعبیه متن ما نگاهی بیندازید.

تنظیم دقیق

آموزش متغیرهای یک ماژول وارداتی همراه با مدل موجود در اطراف آن ، تنظیم دقیق نامیده می شود. تنظیم دقیق می تواند کیفیت بهتری داشته باشد ، اما عوارض جدیدی را به همراه دارد. ما به مصرف كنندگان توصيه مي كنيم فقط پس از بررسي اصلاحات با كيفيت ساده تر ، فقط در صورتي كه ناشر ماژول آن را توصيه كند ، به دنبال تنظيمات دقيق آن باشند.

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

برای فعال کردن تنظیم دقیق ، ماژول را با hub.Module(..., trainable=True) نمونه سازی کنید. ماژول hub.Module(..., trainable=True) برای متغیرهای آن قابل آموزش و وارد کردن REGULARIZATION_LOSSES برای REGULARIZATION_LOSSES . اگر ماژول دارای چندین نمودار مختلف است ، مطمئن شوید که یکی از موارد مناسب برای آموزش را انتخاب کنید. معمولاً این یکی با برچسب {"train"} .

رژیم تمرینی را انتخاب کنید که وزنه های از قبل آموزش دیده را خراب نکند ، به عنوان مثال ، میزان یادگیری کمتری نسبت به آموزش از ابتدا است.

برای ناشران

برای راحت تر کردن تنظیمات برای مصرف کنندگان ، لطفاً به موارد زیر توجه داشته باشید:

  • تنظیم دقیق نیاز به تنظیم دارد. ماژول شما با مجموعه REGULARIZATION_LOSSES صادر می شود ، این همان چیزی است که انتخاب شما را در tf.layers.dense(..., kernel_regularizer=...) و غیره به آنچه مصرف کننده از tf.losses.get_regularization_losses() می tf.losses.get_regularization_losses() . این روش را برای تعریف ضررهای تنظیم L1 / L2 ترجیح دهید.

  • در مدل ناشر، جلوگیری از تعریف L1 / L2 تنظیم از طریق l1_ و l2_regularization_strength پارامترهای tf.train.FtrlOptimizer ، tf.train.ProximalGradientDescentOptimizer ، و دیگر بهینه پروگزیمال. اینها در کنار ماژول صادر نمی شوند و تنظیم نقاط قوت تنظیم در سطح جهانی ممکن است برای مصرف کننده مناسب نباشد. به جز نظم L1 در مدل های گسترده (به صورت خطی پراکنده) و یا گسترده و عمیق ، باید به جای آن از تلفات تنظیم منظم استفاده شود.

  • اگر از ترک تحصیل ، عادی سازی دسته ای یا روش های مشابه آموزش استفاده می کنید ، ابر پارامترهای آنها را روی مقادیری تنظیم کنید که در بسیاری از کاربردهای مورد انتظار منطقی باشد. ممکن است لازم باشد میزان ترک تحصیل با توجه به میزان تمایل مشکل به مجهز شدن بیش از حد تنظیم شود. در نرمال سازی دسته ای ، حرکت (ضریب فروپاشی) باید آنقدر کوچک باشد که بتواند تنظیم دقیق با مجموعه داده های کوچک و / یا دسته های بزرگ را امکان پذیر کند. برای مصرف کنندگان پیشرفته ، امضایی را اضافه کنید که کنترل بیش از حد پارامترهای بحرانی را نشان دهد.