فرمت هاب TF1

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

این صفحه نحوه استفاده از قالب TF1 Hub را در TF1 (یا حالت سازگاری TF1 TF2) با کلاس hub.Module و APIهای مرتبط توضیح می دهد. (کاربرد معمولی ساخت یک tf.Graph ، احتمالاً در یک Estimator TF1، با ترکیب یک یا چند مدل در قالب 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 از یک رشته با URL یا مسیر سیستم فایل آن، به یک برنامه TensorFlow وارد می شود، مانند:

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

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

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

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

اعمال یک ماژول

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

y = m(x)

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

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

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

رویکرد کلی

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

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

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

مثال واقعی

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

تنظیم دقیق

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

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

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

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

برای ناشران

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

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

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

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