تبدیل مدل

TensorFlow.js دارای انواع مدل های از پیش آموزش دیده ای است که برای استفاده در مرورگر آماده هستند - آنها را می توانید در مخزن مدل های ما پیدا کنید. با این حال ممکن است یک مدل TensorFlow را در جای دیگری پیدا کرده باشید یا نوشته باشید که می خواهید در برنامه وب خود از آن استفاده کنید. TensorFlow.js یک مبدل مدل برای این منظور فراهم می کند. مبدل TensorFlow.js دو جزء دارد:

  1. یک ابزار خط فرمان که مدل‌های Keras و TensorFlow را برای استفاده در TensorFlow.js تبدیل می‌کند.
  2. یک API برای بارگیری و اجرای مدل در مرورگر با TensorFlow.js.

مدل خود را تبدیل کنید

مبدل TensorFlow.js با چندین قالب مدل مختلف کار می کند:

SavedModel : این فرمت پیش‌فرض است که مدل‌های TensorFlow در آن ذخیره می‌شوند. قالب SavedModel در اینجا مستند شده است.

مدل Keras : مدل‌های Keras معمولاً به عنوان یک فایل HDF5 ذخیره می‌شوند. اطلاعات بیشتر در مورد ذخیره مدل های Keras را می توانید در اینجا بیابید.

ماژول TensorFlow Hub : اینها مدل‌هایی هستند که برای توزیع در TensorFlow Hub، پلتفرمی برای اشتراک‌گذاری و کشف مدل‌ها، بسته‌بندی شده‌اند. کتابخانه مدل را می توانید در اینجا پیدا کنید.

بسته به نوع مدلی که می خواهید تبدیل کنید، باید آرگومان های مختلفی را به مبدل ارسال کنید. به عنوان مثال، فرض کنید یک مدل Keras به نام model.h5 را در دایرکتوری tmp/ ذخیره کرده اید. برای تبدیل مدل خود با استفاده از مبدل TensorFlow.js، می توانید دستور زیر را اجرا کنید:

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

این مدل را در /tmp/model.h5 تبدیل می کند و یک فایل model.json به همراه فایل های وزن باینری را به دایرکتوری tmp/tfjs_model/ شما خروجی می دهد.

جزئیات بیشتر در مورد آرگومان های خط فرمان مربوط به قالب های مدل مختلف را می توان در مبدل TensorFlow.js README یافت.

در طول فرآیند تبدیل، نمودار مدل را طی می کنیم و بررسی می کنیم که هر عملیات توسط TensorFlow.js پشتیبانی می شود. اگر چنین است، نمودار را در قالبی می نویسیم که مرورگر بتواند آن را مصرف کند. ما سعی می کنیم با تقسیم وزن ها در فایل های 4 مگابایتی، مدل را برای ارائه در وب بهینه سازی کنیم - به این ترتیب می توان آنها را توسط مرورگرها کش کرد. ما همچنین سعی می کنیم خود نمودار مدل را با استفاده از پروژه Grappler منبع باز ساده کنیم. ساده‌سازی نمودار شامل تا کردن عملیات مجاور، حذف زیرگراف‌های رایج و غیره است. این تغییرات تأثیری بر خروجی مدل ندارد. برای بهینه‌سازی بیشتر، کاربران می‌توانند آرگومان‌هایی را ارسال کنند که به مبدل دستور می‌دهد تا مدل را به اندازه بایت مشخصی کوانتیزه کند. کوانتیزاسیون تکنیکی برای کاهش اندازه مدل با نمایش وزن با بیت های کمتر است. کاربران باید مراقب باشند تا مطمئن شوند که مدل آنها پس از کوانتیزاسیون، دقت قابل قبولی را حفظ می کند.

اگر در حین تبدیل با عملیات پشتیبانی نشده مواجه شویم، فرآیند با شکست مواجه می شود و نام عملیات را برای کاربر چاپ می کنیم. با خیال راحت مشکلی را در GitHub ما ارسال کنید تا به ما اطلاع دهید - ما سعی می کنیم عملیات جدیدی را در پاسخ به تقاضای کاربر پیاده سازی کنیم.

بهترین شیوه ها

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

مدل خود را اجرا کنید

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

در اینجا API برای یک ماژول TensorFlow SavedModel یا TensorFlow Hub تبدیل شده به نظر می رسد:

const model = await tf.loadGraphModel(‘path/to/model.json’);

و در اینجا چیزی است که برای یک مدل Keras تبدیل شده به نظر می رسد:

const model = await tf.loadLayersModel(‘path/to/model.json’);

tf.loadGraphModel API یک tf.FrozenModel برمی گرداند، به این معنی که پارامترها ثابت هستند و شما نمی توانید مدل خود را با داده های جدید تنظیم کنید. tf.loadLayersModel API یک tf.Model را برمی گرداند که قابل آموزش است. برای اطلاعات در مورد نحوه آموزش tf.Model، به راهنمای مدل های قطار مراجعه کنید.

پس از تبدیل، ایده خوبی است که استنتاج را چند بار اجرا کنید و سرعت مدل خود را محک بزنید. ما یک صفحه بنچمارک مستقل داریم که می‌توان برای این منظور از آن استفاده کرد: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html ممکن است متوجه شوید که ما اندازه‌گیری‌ها را از اجرای اولیه گرم کردن حذف می‌کنیم - این به این دلیل است که (به طور کلی) استنتاج اول مدل شما چندین برابر کندتر از استنتاج های بعدی به دلیل سربار ایجاد بافت ها و کامپایل کردن سایه بان ها خواهد بود.