مقدمه
TensorFlow Hub میزبان SavedModels برای TensorFlow 2، در میان دارایی های دیگر است. آنها را می توان دوباره در یک برنامه پایتون با obj = hub.load(url)
بارگذاری کرد [ بیشتر بدانید ]. obj
برگردانده شده نتیجه tf.saved_model.load()
است (به راهنمای SavedModel TensorFlow مراجعه کنید). این شی میتواند دارای ویژگیهای دلخواه باشد که عبارتند از tf.functions، tf.variables (از مقادیر از پیش آموزشدیده شده آنها)، منابع دیگر و بهطور بازگشتی، موارد بیشتری از این قبیل.
این صفحه رابطی را توصیف می کند که باید توسط obj
بارگذاری شده به منظور استفاده مجدد در یک برنامه TensorFlow Python پیاده سازی شود. SavedModels مطابق با این رابط، Reusable SavedModels نامیده می شوند.
استفاده مجدد به معنای ساخت یک مدل بزرگتر در اطراف obj
است، از جمله توانایی تنظیم دقیق آن. تنظیم دقیق به معنای تمرین بیشتر وزنه ها در obj
بارگذاری شده به عنوان بخشی از مدل اطراف است. تابع ضرر و بهینه ساز توسط مدل اطراف تعیین می شود. obj
فقط نگاشت ورودی به فعالسازیهای خروجی را تعریف میکند ("گذر به جلو")، احتمالاً شامل تکنیکهایی مانند انصراف یا عادیسازی دستهای.
تیم TensorFlow Hub توصیه میکند که رابط کاربری SavedModel قابل استفاده مجدد را در تمام SavedModelهایی که قرار است به معنای بالا مورد استفاده مجدد قرار گیرند، پیادهسازی شود . بسیاری از برنامه های کاربردی از کتابخانه tensorflow_hub
، به ویژه hub.KerasLayer
، برای پیاده سازی آن به SavedModels نیاز دارند.
ارتباط با SignatureDefs
این رابط از نظر توابع tf. و سایر ویژگیهای TF2 جدا از امضاهای SavedModel است که از TF1 در دسترس بوده و همچنان در TF2 برای استنتاج استفاده میشود (مانند استقرار SavedModels در TF Serving یا TF Lite). امضاها برای استنتاج به اندازه کافی رسا نیستند که از تنظیم دقیق پشتیبانی کنند، و tf.function
یک API پایتون طبیعی تر و گویاتر برای مدل استفاده مجدد ارائه می دهد.
ارتباط با کتابخانه های مدل سازی
یک SavedModel قابل استفاده مجدد فقط از TensorFlow 2 اولیه استفاده می کند، مستقل از هر کتابخانه مدل سازی خاصی مانند Keras یا Sonnet. این کار استفاده مجدد را در کتابخانههای مدلسازی بدون وابستگی به کد اصلی مدلسازی تسهیل میکند.
مقداری انطباق لازم است تا SavedModels قابل استفاده مجدد را بارگیری کنید یا آنها را از هر کتابخانه ساخت مدل ذخیره کنید. برای Keras، hub.KerasLayer بارگیری را فراهم میکند، و ذخیره داخلی Keras در قالب SavedModel برای TF2 با هدف ارائه یک مجموعه فوقالعاده از این رابط طراحی شده است (به RFC از می 2019 مراجعه کنید).
ارتباط با «API های رایج SavedModel» مختص کار
تعریف رابط در این صفحه امکان هر تعداد و نوع ورودی و خروجی را فراهم می کند. APIهای رایج SavedModel برای TF Hub این رابط عمومی را با قراردادهای استفاده برای کارهای خاص اصلاح میکنند تا مدلها را به راحتی قابل تعویض کنند.
تعریف رابط
صفات
SavedModel قابل استفاده مجدد یک SavedModel TensorFlow 2 است به طوری که obj = tf.saved_model.load(...)
یک شی را برمی گرداند که دارای ویژگی های زیر است.
__call__
___ مورد نیاز. یک تابع tf. که محاسبات مدل را اجرا می کند ("گذر به جلو") با توجه به مشخصات زیر.variables
: فهرستی از اشیاء tf.Variable، که همه متغیرهای مورد استفاده در هر فراخوانی احتمالی__call__
را فهرست می کند، از جمله متغیرهای قابل آموزش و غیرقابل آموزش.این لیست در صورت خالی بودن قابل حذف است.
trainable_variables
: لیستی از اشیاء tf.Variable به طوری کهv.trainable
برای همه عناصر صادق است. این متغیرها باید زیر مجموعه ای ازvariables
باشند. اینها متغیرهایی هستند که باید هنگام تنظیم دقیق شی مورد آموزش قرار گیرند. خالق SavedModel ممکن است برخی از متغیرها را که در ابتدا قابل آموزش بودند حذف کند تا نشان دهد که این متغیرها نباید در طول تنظیم دقیق اصلاح شوند.این لیست در صورت خالی بودن، به ویژه اگر SavedModel از تنظیم دقیق پشتیبانی نمی کند، می تواند حذف شود.
regularization_losses
: لیستی از توابع tf. که هر کدام ورودی صفر می گیرند و یک تانسور شناور اسکالر را برمی گرداند. برای تنظیم دقیق، به کاربر SavedModel توصیه میشود که این موارد را بهعنوان شرایط تنظیم اضافی در ضرر (در سادهترین حالت بدون مقیاسگذاری بیشتر) لحاظ کند. به طور معمول، اینها برای نشان دادن تنظیم کننده های وزن استفاده می شوند. (به دلیل کمبود ورودی، این توابع tf. نمی توانند تنظیم کننده های فعالیت را بیان کنند.)این لیست را می توان در صورت خالی بودن حذف کرد، به ویژه اگر SavedModel از تنظیم دقیق پشتیبانی نمی کند یا نمی خواهد تنظیم وزن را تجویز کند.
تابع __call__
یک obj
Restored SavedModel دارای یک ویژگی obj.__call__
است که یک تابع tf.بازیابی شده است و به obj
اجازه فراخوانی به صورت زیر را می دهد.
خلاصه (شبه کد):
outputs = obj(inputs, trainable=..., **kwargs)
استدلال ها
استدلال ها به شرح زیر است.
یک آرگومان موقعیتی و مورد نیاز با دسته ای از فعال سازی های ورودی SavedModel وجود دارد. نوع آن یکی از
- یک تانسور برای یک ورودی واحد،
- فهرستی از تانسورها برای یک توالی مرتب شده از ورودی های بی نام،
- دستوری از تانسورها که با مجموعه خاصی از نام های ورودی کلید می خورد.
(بازبینیهای آینده این رابط ممکن است لانههای عمومیتری را امکانپذیر کند.) خالق SavedModel یکی از آنها و اشکال تانسور و نوع d را انتخاب میکند. در موارد مفید، برخی از ابعاد شکل باید تعریف نشده باشد (به ویژه اندازه دسته).
ممکن است یک
training
آرگومان کلمه کلیدی اختیاری وجود داشته باشد که بولین،True
یاFalse
پایتون را بپذیرد. پیش فرضFalse
است. اگر مدل از تنظیم دقیق پشتیبانی میکند، و اگر محاسبات آن بین این دو تفاوت داشته باشد (مثلاً در حالت انحرافی و عادیسازی دستهای)، این تمایز با این استدلال اجرا میشود. در غیر این صورت، این استدلال ممکن است وجود نداشته باشد.لازم نیست
__call__
آرگومانtraining
با ارزش تنسور را بپذیرد. این بر عهده تماس گیرنده است که در صورت لزوم ازtf.cond()
برای ارسال بین آنها استفاده کند.خالق SavedModel ممکن است تصمیم بگیرد که
kwargs
اختیاری بیشتری از نام های خاص را بپذیرد.برای آرگومان های با ارزش تنسور، خالق SavedModel dtypes و شکل های مجاز آنها را تعریف می کند.
tf.function
یک مقدار پیش فرض پایتون را روی آرگومان می پذیرد که با ورودی tf.TensorSpec ردیابی می شود. چنین آرگومانهایی میتوانند برای سفارشیسازی فراپارامترهای عددی درگیر در__call__
(مثلاً نرخ ترک تحصیل) استفاده شوند.برای آرگومان های با ارزش پایتون، خالق SavedModel مقادیر مجاز آنها را تعریف می کند. چنین آرگومانهایی میتوانند به عنوان پرچمها برای انتخابهای گسسته در تابع ردیابی استفاده شوند (اما به انفجار ترکیبی ردیابیها توجه کنید).
تابع __call__
بازیابی شده باید ردیابی هایی را برای همه ترکیب های مجاز آرگومان ها ارائه دهد. training
چرخاندن بین True
و False
نباید مجاز بودن استدلال ها را تغییر دهد.
نتیجه
outputs
فراخوانی obj
می تواند باشد
- یک تانسور برای یک خروجی واحد،
- فهرستی از تانسورها برای یک دنباله مرتب از خروجی های بی نام،
- دستوری از تانسورها که با مجموعه خاصی از نامهای خروجی کلید میخورد.
(ویرایشهای آینده این رابط ممکن است لانههای عمومیتری را مجاز کند.) نوع بازگشت ممکن است بسته به کوارگهای با ارزش پایتون متفاوت باشد. این اجازه می دهد تا پرچم ها خروجی های اضافی تولید کنند. خالق SavedModel dtypes و اشکال خروجی و وابستگی آنها به ورودی ها را تعریف می کند.
تماس گیرندگان نامگذاری شده است
یک SavedModel قابل استفاده مجدد میتواند چندین قطعه مدل را به روشی که در بالا توضیح داده شد، با قرار دادن آنها در زیراشیاء نامگذاری شده، به عنوان مثال، obj.foo
، obj.bar
و غیره ارائه دهد. هر زیر شی یک متد __call__
و ویژگی های پشتیبان در مورد متغیرها و غیره خاص آن قطعه مدل را ارائه می دهد. برای مثال بالا، obj.foo.__call__
، obj.foo.variables
و غیره وجود دارد.
توجه داشته باشید که این رابط رویکرد افزودن یک tf.function خالی به طور مستقیم به عنوان tf.foo
را پوشش نمی دهد.
از کاربران SavedModels قابل استفاده مجدد انتظار می رود که فقط یک سطح از تودرتو مدیریت کنند ( obj.bar
اما نه obj.bar.baz
). (بازبینیهای آتی این رابط ممکن است امکان تودرتو عمیقتر را فراهم کند و ممکن است از الزامی که شی سطح بالا خود قابل فراخوانی باشد چشم پوشی کند.)
سخنان پایانی
ارتباط با APIهای در حال پردازش
این سند رابطی از یک کلاس پایتون را توصیف میکند که از ابتداییهایی مانند tf.function و tf.Variable تشکیل شده است که از طریق سریالسازی از طریق tf.saved_model.save()
و tf.saved_model.load()
از یک سفر رفت و برگشت جان سالم به در میبرند. با این حال، رابط قبلاً روی شی اصلی وجود داشت که به tf.saved_model.save()
ارسال شده بود. انطباق با آن رابط، تبادل قطعات مدل را در بین APIهای سازنده مدل در یک برنامه TensorFlow امکان پذیر می کند.