فرمت هاب 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 TensorFlow را وارد کنید. اگر ماژول دارای چندین نوع نمودار است، مطمئن شوید که یکی از آنها را برای آموزش انتخاب کنید. معمولاً این مورد با برچسب {"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 در مدل های عریض (یعنی خطی پراکنده) یا عریض و عمیق، می توان به جای آن از تلفات منظم سازی فردی استفاده کرد.

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