TensorFlow.js عملکردی را برای ذخیره و بارگذاری مدل هایی که با Layers
API ایجاد شده اند یا از مدل های TensorFlow موجود تبدیل شده اند، ارائه می دهد. اینها ممکن است مدل هایی باشند که خودتان آموزش داده اید یا آنهایی که توسط دیگران آموزش دیده اند. یکی از مزایای کلیدی استفاده از Layers api این است که مدل های ایجاد شده با آن قابل سریال هستند و این چیزی است که در این آموزش بررسی خواهیم کرد.
این آموزش بر روی ذخیره و بارگذاری مدل های TensorFlow.js (قابل شناسایی با فایل های JSON) تمرکز دارد. ما همچنین می توانیم مدل های TensorFlow Python را وارد کنیم. بارگذاری این مدل ها در دو آموزش زیر پوشش داده شده است:
یک tf.Model را ذخیره کنید
tf.Model
و tf.Sequential
هر دو یک تابع model.save
ارائه می دهند که به شما امکان می دهد توپولوژی و وزن یک مدل را ذخیره کنید.
توپولوژی: این فایلی است که معماری یک مدل را توصیف می کند (یعنی از چه عملیاتی استفاده می کند). این شامل ارجاعاتی به وزن مدل ها است که در خارج ذخیره می شوند.
وزن ها: فایل های باینری هستند که وزن های یک مدل معین را در قالبی کارآمد ذخیره می کنند. آنها به طور کلی در همان پوشه توپولوژی ذخیره می شوند.
بیایید نگاهی بیندازیم که کد ذخیره یک مدل چگونه است
const saveResult = await model.save('localstorage://my-model-1');
چند نکته قابل توجه:
- متد
save
یک آرگومان رشته ای URL مانند می گیرد که با یک طرح شروع می شود. این نوع مقصدی را که میخواهیم یک مدل را در آن ذخیره کنیم، توصیف میکند. در مثال بالا، طرحlocalstorage://
- این طرح توسط یک مسیر دنبال می شود. در مثال بالا مسیر
my-model-1
است. - روش
save
ناهمزمان است. - مقدار بازگشتی
model.save
یک شی JSON است که اطلاعاتی مانند اندازه بایت توپولوژی و وزن مدل را حمل می کند. - محیطی که برای ذخیره مدل استفاده می شود تأثیری ندارد که کدام محیط ها می توانند مدل را بارگذاری کنند. ذخیره یک مدل در node.js مانع از بارگذاری آن در مرورگر نمی شود.
در زیر به بررسی طرح های مختلف موجود می پردازیم.
فضای ذخیرهسازی محلی (فقط مرورگر)
طرح: localstorage://
await model.save('localstorage://my-model');
این یک مدل را تحت نام my-model
در حافظه محلی مرورگر ذخیره می کند. این بین تازهسازیها ادامه پیدا میکند، اگرچه در صورت ایجاد نگرانی، فضای ذخیرهسازی محلی میتواند توسط کاربران یا خود مرورگر پاک شود. هر مرورگر همچنین محدودیت خاص خود را در مورد اینکه چه مقدار داده را می توان در حافظه محلی برای یک دامنه معین ذخیره کرد تعیین می کند.
IndexedDB (فقط مرورگر)
طرح: indexeddb://
await model.save('indexeddb://my-model');
این یک مدل را در حافظه IndexedDB مرورگر ذخیره می کند. مانند ذخیرهسازی محلی که بین تازهسازیها باقی میماند، همچنین تمایل دارد محدودیتهای بزرگتری در اندازه اشیاء ذخیرهشده داشته باشد.
دانلود فایل (فقط مرورگر)
طرح: downloads://
await model.save('downloads://my-model');
این باعث می شود مرورگر فایل های مدل را در دستگاه کاربر دانلود کند. دو فایل تولید خواهد شد:
- یک فایل JSON متنی با نام
[my-model].json
، که توپولوژی و ارجاع به فایل وزن شرح داده شده در زیر را حمل می کند. - یک فایل باینری حاوی مقادیر وزن به نام
[my-model].weights.bin
.
میتوانید نام [my-model]
را تغییر دهید تا فایلهایی با نام دیگری دریافت کنید.
از آنجایی که فایل .json
با استفاده از یک مسیر نسبی به .bin
اشاره می کند، دو فایل باید در یک پوشه باشند.
درخواست HTTP(S).
طرح: http://
یا https://
await model.save('http://model-server.domain/upload')
این یک درخواست وب برای ذخیره یک مدل در یک سرور راه دور ایجاد می کند. شما باید آن سرور راه دور را کنترل کنید تا بتوانید اطمینان حاصل کنید که قادر به رسیدگی به درخواست است.
مدل از طریق یک درخواست POST به سرور HTTP مشخص شده ارسال می شود. بدنه POST در قالب multipart/form-data
است و از دو فایل تشکیل شده است
- یک فایل JSON متنی به نام
model.json
که توپولوژی و ارجاع به فایل وزنی که در زیر توضیح داده شده است را حمل می کند. - یک فایل باینری حاوی مقادیر وزن به نام
model.weights.bin
.
توجه داشته باشید که نام دو فایل همیشه دقیقاً همانطور که در بالا مشخص شده است خواهد بود (نام در تابع تعبیه شده است). این api doc حاوی یک قطعه کد پایتون است که نشان میدهد چگونه میتوان از چارچوب وب flask برای رسیدگی به درخواست منشأ گرفته از save
استفاده کرد.
اغلب باید آرگومان های بیشتری ارسال کنید یا سرصفحه های درخواستی را به سرور HTTP خود ارسال کنید (مثلاً برای احراز هویت یا اگر می خواهید پوشه ای را مشخص کنید که مدل باید در آن ذخیره شود). میتوانید با جایگزین کردن آرگومان رشته URL در tf.io.browserHTTPRequest
، کنترل دقیقی بر روی این جنبههای درخواستها از save
به دست آورید. این API انعطاف پذیری بیشتری را در کنترل درخواست های HTTP فراهم می کند.
به عنوان مثال:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
سیستم فایل بومی (فقط Node.js)
طرح: file://
await model.save('file:///path/to/my-model');
هنگام اجرا در Node.js ما همچنین به سیستم فایل دسترسی مستقیم داریم و می توانیم مدل ها را در آنجا ذخیره کنیم. دستور بالا دو فایل را در path
مشخص شده بعد از scheme
ذخیره می کند.
- یک فایل JSON متنی با نام
[model].json
، که توپولوژی و ارجاع به فایل وزن شرح داده شده در زیر را حمل می کند. - یک فایل باینری حاوی مقادیر وزن به نام
[model].weights.bin
.
توجه داشته باشید که نام دو فایل همیشه دقیقاً همانطور که در بالا مشخص شده است خواهد بود (نام در تابع تعبیه شده است).
در حال بارگذاری tf.Model
با توجه به مدلی که با استفاده از یکی از روش های بالا ذخیره شده است، می توانیم آن را با استفاده از tf.loadLayersModel
API بارگذاری کنیم.
بیایید نگاهی بیندازیم که کد بارگذاری یک مدل چگونه است
const model = await tf.loadLayersModel('localstorage://my-model-1');
چند نکته قابل توجه:
- مانند
model.save()
، تابعloadLayersModel
یک آرگومان رشته ای URL مانند می گیرد که با یک طرح شروع می شود. این نوع مقصدی را که میخواهیم مدلی را از آن بارگیری کنیم، توصیف میکند. - این طرح توسط یک مسیر دنبال می شود. در مثال بالا مسیر
my-model-1
است. - رشته url مانند را می توان با یک شی که با رابط IOHandler مطابقت دارد جایگزین کرد.
- تابع
tf.loadLayersModel()
ناهمزمان است. - مقدار بازگشتی
tf.loadLayersModel
tf.Model
است
در زیر به بررسی طرح های مختلف موجود می پردازیم.
فضای ذخیرهسازی محلی (فقط مرورگر)
طرح: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
این یک مدل به نام my-model
را از حافظه محلی مرورگر بارگیری می کند.
IndexedDB (فقط مرورگر)
طرح: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
این یک مدل را از حافظه IndexedDB مرورگر بارگیری می کند.
HTTP(S)
طرح: http://
یا https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
این یک مدل را از یک نقطه پایانی http بارگیری می کند. پس از بارگذاری فایل json
، تابع درخواست هایی برای فایل های .bin
مربوطه که فایل json
به آنها ارجاع می دهد، می دهد.
سیستم فایل بومی (فقط Node.js)
طرح: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
هنگام اجرا در Node.js ما همچنین به سیستم فایل دسترسی مستقیم داریم و می توانیم مدل ها را از آنجا بارگیری کنیم. توجه داشته باشید که در فراخوانی تابع بالا به خود فایل model.json اشاره می کنیم (در حالی که هنگام ذخیره یک پوشه را مشخص می کنیم). فایل(های) .bin
مربوطه باید در همان پوشه فایل json
باشد.
بارگیری مدل ها با IOHandlers
اگر طرحهای بالا برای نیازهای شما کافی نیستند، میتوانید رفتار بارگذاری سفارشی را با یک IOHandler
پیادهسازی کنید. یکی از IOHandler
که TensorFlow.js ارائه می کند tf.io.browserFiles
است که به کاربران مرورگر اجازه می دهد فایل های مدل را در مرورگر آپلود کنند. برای اطلاعات بیشتر به مستندات مراجعه کنید.
ذخیره و بارگیری مدل ها با IOHhandler های سفارشی
اگر طرحهای بالا برای نیازهای بارگیری یا ذخیرهسازی شما کافی نیستند، میتوانید رفتار سریالسازی سفارشی را با پیادهسازی یک IOHandler
پیادهسازی کنید.
IOHandler
یک شی با روش save
و load
است.
تابع save
یک پارامتر را می گیرد که با رابط ModelArtifacts مطابقت دارد و باید قولی را برگرداند که به یک شی SaveResult حل شود.
تابع load
هیچ پارامتری دریافت نمی کند و باید قولی را برگرداند که به یک شی ModelArtifacts حل شود. این همان شیئی است که برای save
ارسال می شود.
برای مثالی از نحوه پیاده سازی IOHandler به BrowserHTTPRequest مراجعه کنید.