در راه اندازی خود در سال 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 در مدل های عریض (یعنی خطی پراکنده) یا عریض و عمیق، می توان به جای آن از تلفات منظم سازی فردی استفاده کرد.اگر از ترک تحصیل، نرمالسازی دستهای یا تکنیکهای آموزشی مشابه استفاده میکنید، فراپارامترهای آنها را روی مقادیری تنظیم کنید که در بسیاری از کاربردهای مورد انتظار منطقی هستند. نرخ ترک تحصیل ممکن است با توجه به گرایش مشکل هدف به بیش از حد مناسب تنظیم شود. در نرمالسازی دستهای، تکانه (معروف به ضریب فروپاشی) باید به اندازهای کوچک باشد که تنظیم دقیق با مجموعه دادههای کوچک و/یا دستههای بزرگ را امکانپذیر کند. برای مصرف کنندگان پیشرفته، اضافه کردن امضایی را در نظر بگیرید که کنترل بر پارامترهای حیاتی را نشان دهد.