সংরক্ষণ করুন এবং মডেল লোড

TensorFlow.js Layers এপিআই দিয়ে তৈরি বা বিদ্যমান টেনসরফ্লো মডেল থেকে রূপান্তরিত মডেলগুলি সংরক্ষণ এবং লোড করার জন্য কার্যকারিতা প্রদান করে। এগুলি এমন মডেল হতে পারে যা আপনি নিজে প্রশিক্ষিত করেছেন বা অন্যদের দ্বারা প্রশিক্ষিত। লেয়ার এপিআই ব্যবহার করার একটি মূল সুবিধা হল যে এটির সাথে তৈরি করা মডেলগুলি সিরিয়ালাইজেবল এবং আমরা এই টিউটোরিয়ালে এটিই অন্বেষণ করব।

এই টিউটোরিয়ালটি TensorFlow.js মডেলগুলি সংরক্ষণ এবং লোড করার উপর ফোকাস করবে (JSON ফাইল দ্বারা শনাক্ত করা যায়)। আমরা টেনসরফ্লো পাইথন মডেলগুলিও আমদানি করতে পারি। এই মডেলগুলি লোড করা নিম্নলিখিত দুটি টিউটোরিয়ালে কভার করা হয়েছে:

একটি 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');

এর ফলে ব্রাউজারটি ব্যবহারকারীর মেশিনে মডেল ফাইল ডাউনলোড করবে। দুটি ফাইল উত্পাদিত হবে:

  1. [my-model].json নামের একটি টেক্সট JSON ফাইল, যা নীচে বর্ণিত ওয়েট ফাইলের টপোলজি এবং রেফারেন্স বহন করে।
  2. [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 ফরম্যাটে এবং দুটি ফাইল নিয়ে গঠিত

  1. model.json নামের একটি টেক্সট JSON ফাইল, যা নীচে বর্ণিত ওয়েট ফাইলের টপোলজি এবং রেফারেন্স বহন করে।
  2. model.weights.bin নামে একটি বাইনারি ফাইল ওজনের মান বহন করে।

মনে রাখবেন যে দুটি ফাইলের নাম সর্বদা ঠিক যেমন উপরে উল্লেখ করা হয়েছে (নামটি ফাংশনে অন্তর্নির্মিত)। এই এপিআই ডকটিতে একটি পাইথন কোড স্নিপেট রয়েছে যা প্রদর্শন করে যে কীভাবে একজন ফ্লাস্ক ওয়েব ফ্রেমওয়ার্ক ব্যবহার করে save থেকে উদ্ভূত অনুরোধটি পরিচালনা করতে পারে।

প্রায়শই আপনাকে আপনার HTTP সার্ভারে আরও আর্গুমেন্ট বা অনুরোধ শিরোনাম পাঠাতে হবে (যেমন প্রমাণীকরণের জন্য বা আপনি যদি এমন একটি ফোল্ডার নির্দিষ্ট করতে চান যেখানে মডেলটি সংরক্ষণ করা উচিত)। আপনি tf.io.browserHTTPRequest এ URL স্ট্রিং আর্গুমেন্ট প্রতিস্থাপন করে 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-এ চলমান অবস্থায় আমাদের ফাইল সিস্টেমে সরাসরি অ্যাক্সেস থাকে এবং আমরা সেখানে মডেল সংরক্ষণ করতে পারি। উপরের কমান্ডটি scheme পরে নির্দিষ্ট করা path দুটি ফাইল সংরক্ষণ করবে।

  1. [model].json নামের একটি টেক্সট JSON ফাইল, যা নীচে বর্ণিত ওয়েট ফাইলের টপোলজি এবং রেফারেন্স বহন করে।
  2. [model].weights.bin নামে ওজনের মান বহন করে এমন একটি বাইনারি ফাইল।

মনে রাখবেন যে দুটি ফাইলের নাম সর্বদা ঠিক যেমন উপরে উল্লেখ করা হয়েছে (নামটি ফাংশনে অন্তর্নির্মিত)।

একটি tf.Model লোড হচ্ছে

উপরের একটি পদ্ধতি ব্যবহার করে সংরক্ষণ করা একটি মডেল দেওয়া হয়েছে, আমরা tf.loadLayersModel API ব্যবহার করে এটি লোড করতে পারি।

একটি মডেল লোড করার জন্য কোডটি কেমন তা দেখে নেওয়া যাক

const model = await tf.loadLayersModel('localstorage://my-model-1');

কয়েকটি বিষয় লক্ষ করুন:

  • model.save() এর মতো, loadLayersModel ফাংশনটি একটি URL-এর মতো স্ট্রিং আর্গুমেন্ট নেয় যা একটি স্কিম দিয়ে শুরু হয়। এটি বর্ণনা করে যে গন্তব্যের ধরন থেকে আমরা একটি মডেল লোড করার চেষ্টা করছি৷
  • স্কিম একটি পথ দ্বারা অনুসরণ করা হয়. উপরের উদাহরণে পাথ হল my-model-1
  • ইউআরএল-এর মতো স্ট্রিংটি আইওহ্যান্ডলার ইন্টারফেসের সাথে মেলে এমন একটি বস্তু দ্বারা প্রতিস্থাপিত হতে পারে।
  • 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 যা ব্রাউজার ব্যবহারকারীদের ব্রাউজারে মডেল ফাইল আপলোড করতে দেয়। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন.

কাস্টম IOHandlers সঙ্গে মডেল সংরক্ষণ এবং লোড হচ্ছে

যদি উপরের স্কিমগুলি আপনার লোডিং বা সংরক্ষণের প্রয়োজনের জন্য পর্যাপ্ত না হয় তবে আপনি একটি IOHandler প্রয়োগ করে কাস্টম সিরিয়ালাইজেশন আচরণ বাস্তবায়ন করতে পারেন।

একটি IOHandler একটি save এবং load পদ্ধতি সহ একটি বস্তু।

save ফাংশনটি একটি প্যারামিটার নেয় যা মডেলআর্টিফ্যাক্টস ইন্টারফেসের সাথে মেলে এবং একটি প্রতিশ্রুতি ফেরত দেওয়া উচিত যা একটি SaveResult অবজেক্টে সমাধান করে।

load ফাংশন কোন পরামিতি নেয় না এবং একটি প্রতিশ্রুতি ফেরত দেওয়া উচিত যা একটি মডেলআর্টিফ্যাক্ট অবজেক্টে সমাধান করে। এটি একই বস্তু যা save জন্য পাস করা হয়।

কিভাবে একটি IOHandler বাস্তবায়ন করতে হয় তার একটি উদাহরণের জন্য BrowserHTTPRrequest দেখুন।