মডেল এবং স্তর

মেশিন লার্নিং-এ, একটি মডেল হল শেখার যোগ্য প্যারামিটার সহ একটি ফাংশন যা একটি ইনপুটকে একটি আউটপুটে ম্যাপ করে। সর্বোত্তম পরামিতিগুলি ডেটাতে মডেলকে প্রশিক্ষণ দিয়ে প্রাপ্ত করা হয়। একটি ভাল-প্রশিক্ষিত মডেল ইনপুট থেকে পছন্দসই আউটপুটে একটি সঠিক ম্যাপিং প্রদান করবে।

TensorFlow.js-এ একটি মেশিন লার্নিং মডেল তৈরি করার দুটি উপায় রয়েছে:

  1. স্তর API ব্যবহার করে যেখানে আপনি স্তরগুলি ব্যবহার করে একটি মডেল তৈরি করেন।
  2. নিম্ন-স্তরের অপ্স যেমন tf.matMul() , tf.add() ইত্যাদির সাথে Core API ব্যবহার করে।

প্রথমে, আমরা লেয়ার এপিআই দেখব, যা মডেল তৈরির জন্য একটি উচ্চ-স্তরের API। তারপর, আমরা দেখাব কিভাবে কোর API ব্যবহার করে একই মডেল তৈরি করা যায়।

লেয়ার এপিআই দিয়ে মডেল তৈরি করা

লেয়ার এপিআই ব্যবহার করে একটি মডেল তৈরি করার দুটি উপায় রয়েছে: একটি অনুক্রমিক মডেল এবং একটি কার্যকরী মডেল। পরবর্তী দুটি বিভাগ প্রতিটি ধরনের আরো ঘনিষ্ঠভাবে তাকান.

অনুক্রমিক মডেল

মডেলের সবচেয়ে সাধারণ ধরন হল Sequential মডেল, যা স্তরগুলির একটি রৈখিক স্ট্যাক। আপনি sequential() ফাংশনে স্তরগুলির একটি তালিকা পাস করে একটি Sequential মডেল তৈরি করতে পারেন:

const model = tf.sequential({
 layers: [
   tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
   tf.layers.dense({units: 10, activation: 'softmax'}),
 ]
});

অথবা add() পদ্ধতির মাধ্যমে:

const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

গুরুত্বপূর্ণ: মডেলের প্রথম স্তরটির একটি inputShape প্রয়োজন৷ নিশ্চিত করুন যে আপনি inputShape প্রদান করার সময় ব্যাচের আকার বাদ দিয়েছেন। উদাহরণ স্বরূপ, আপনি যদি আকৃতির মডেল টেনসরগুলি [B, 784] খাওয়ানোর পরিকল্পনা করেন, যেখানে B যেকোনো ব্যাচের আকার হতে পারে, মডেল তৈরি করার সময় inputShape [784] হিসাবে উল্লেখ করুন।

আপনি model.layers , এবং আরও নির্দিষ্টভাবে model.inputLayers এবং model.outputLayers মাধ্যমে মডেলের স্তরগুলি অ্যাক্সেস করতে পারেন।

কার্যকরী মডেল

একটি LayersModel তৈরি করার আরেকটি উপায় হল tf.model() ফাংশনের মাধ্যমে। tf.model() এবং tf.sequential() এর মধ্যে মূল পার্থক্য হল tf.model() আপনাকে স্তরগুলির একটি নির্বিচারে গ্রাফ তৈরি করতে দেয়, যতক্ষণ না তাদের মধ্যে চক্র থাকে।

এখানে একটি কোড স্নিপেট রয়েছে যা tf.model() API ব্যবহার করে উপরের মতো একই মডেলকে সংজ্ঞায়িত করে:

// Create an arbitrary graph of layers, by connecting them
// via the apply() method.
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});

অন্য লেয়ারের আউটপুটে কানেক্ট করার জন্য আমরা প্রতিটি লেয়ারে apply() বলি। এই ক্ষেত্রে apply() এর ফলাফল হল একটি SymbolicTensor , যা একটি Tensor মত কাজ করে কিন্তু কোন নির্দিষ্ট মান ছাড়াই।

মনে রাখবেন যে অনুক্রমিক মডেলের বিপরীতে, আমরা প্রথম স্তরে একটি inputShape দেওয়ার পরিবর্তে tf.input() এর মাধ্যমে একটি SymbolicTensor তৈরি করি।

apply() আপনাকে একটি কংক্রিট Tensor দিতে পারে, যদি আপনি এটিতে একটি কংক্রিট Tensor পাস করেন:

const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]

বিচ্ছিন্নভাবে স্তরগুলি পরীক্ষা করার এবং তাদের আউটপুট দেখার সময় এটি কার্যকর হতে পারে।

একটি ক্রমিক মডেলের মতো, আপনি model.layers এবং আরও নির্দিষ্টভাবে model.inputLayers এবং model.outputLayers এর মাধ্যমে মডেলের স্তরগুলি অ্যাক্সেস করতে পারেন।

বৈধতা

অনুক্রমিক মডেল এবং কার্যকরী মডেল উভয়ই LayersModel ক্লাসের উদাহরণ। একটি LayersModel এর সাথে কাজ করার প্রধান সুবিধাগুলির মধ্যে একটি হল বৈধতা: এটি আপনাকে ইনপুট আকৃতি নির্দিষ্ট করতে বাধ্য করে এবং আপনার ইনপুট যাচাই করতে পরে এটি ব্যবহার করবে৷ স্তরগুলির মধ্য দিয়ে ডেটা প্রবাহিত হওয়ার সাথে সাথে LayersModel স্বয়ংক্রিয় আকারের অনুমানও করে। আকৃতিটি আগে থেকেই জেনে রাখা মডেলটিকে স্বয়ংক্রিয়ভাবে তার পরামিতি তৈরি করতে দেয় এবং পরপর দুটি স্তর একে অপরের সাথে সামঞ্জস্যপূর্ণ না হলে তা আপনাকে বলতে পারে।

মডেল সারাংশ

মডেলের একটি দরকারী সারাংশ মুদ্রণ করতে model.summary() এ কল করুন, যার মধ্যে রয়েছে:

  • মডেলের সমস্ত স্তরের নাম এবং প্রকার।
  • প্রতিটি স্তরের জন্য আউটপুট আকৃতি।
  • প্রতিটি স্তরের ওজন পরামিতির সংখ্যা।
  • যদি মডেলটিতে সাধারণ টপোলজি থাকে (নীচে আলোচনা করা হয়েছে), প্রতিটি স্তর প্রাপ্ত ইনপুট
  • মডেলের প্রশিক্ষণযোগ্য এবং অ-প্রশিক্ষণযোগ্য প্যারামিটারের মোট সংখ্যা।

আমরা উপরে সংজ্ঞায়িত মডেলের জন্য, আমরা কনসোলে নিম্নলিখিত আউটপুট পাই:

স্তর (প্রকার) আউটপুট আকৃতি পরম #
ঘন_ঘন১ (ঘন) [শূন্য, 32] 25120
ঘন_ঘন২ (ঘন) [শূন্য, 10] 330
মোট প্যারাম: 25450
প্রশিক্ষণযোগ্য প্যারামস: 25450
অ-প্রশিক্ষণযোগ্য প্যারামস: 0

স্তরগুলির আউটপুট আকারে null মানগুলি নোট করুন: একটি অনুস্মারক যে মডেলটি আশা করে যে ইনপুটটির বাইরেরতম মাত্রা হিসাবে একটি ব্যাচের আকার থাকবে, যা এই ক্ষেত্রে null মানের কারণে নমনীয় হতে পারে৷

সিরিয়ালাইজেশন

নিম্ন-স্তরের API-এর উপর একটি LayersModel ব্যবহার করার প্রধান সুবিধাগুলির মধ্যে একটি হল একটি মডেল সংরক্ষণ এবং লোড করার ক্ষমতা। একটি LayersModel সম্পর্কে জানে:

  • মডেলের আর্কিটেকচার, আপনাকে মডেলটি পুনরায় তৈরি করার অনুমতি দেয়।
  • মডেলের ওজন
  • প্রশিক্ষণ কনফিগারেশন (ক্ষতি, অপ্টিমাইজার, মেট্রিক্স)।
  • অপ্টিমাইজারের অবস্থা, আপনাকে প্রশিক্ষণ পুনরায় শুরু করার অনুমতি দেয়।

একটি মডেল সংরক্ষণ বা লোড করার জন্য কোডের মাত্র 1 লাইন:

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

উপরের উদাহরণটি ব্রাউজারে স্থানীয় স্টোরেজে মডেলটিকে সংরক্ষণ করে। model.save() documentation এবং কিভাবে বিভিন্ন মাধ্যমে সংরক্ষণ করতে হয় তার জন্য সংরক্ষণ এবং লোড নির্দেশিকা দেখুন (যেমন ফাইল স্টোরেজ, IndexedDB , একটি ব্রাউজার ডাউনলোড ট্রিগার করুন ইত্যাদি)

কাস্টম স্তর

স্তরগুলি একটি মডেলের বিল্ডিং ব্লক। যদি আপনার মডেল একটি কাস্টম গণনা করছে, আপনি একটি কাস্টম স্তর সংজ্ঞায়িত করতে পারেন, যা বাকি স্তরগুলির সাথে ভালভাবে ইন্টারঅ্যাক্ট করে৷ নীচে আমরা একটি কাস্টম স্তর সংজ্ঞায়িত করি যা স্কোয়ারের যোগফল গণনা করে:

class SquaredSumLayer extends tf.layers.Layer {
 constructor() {
   super({});
 }
 // In this case, the output is a scalar.
 computeOutputShape(inputShape) { return []; }

 // call() is where we do the computation.
 call(input, kwargs) { return input.square().sum();}

 // Every layer needs a unique name.
 getClassName() { return 'SquaredSum'; }
}

এটি পরীক্ষা করার জন্য, আমরা একটি কংক্রিট টেনসর সহ apply() পদ্ধতিকে কল করতে পারি:

const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30

গুরুত্বপূর্ণ: আপনি যদি একটি কাস্টম স্তর যোগ করেন, তাহলে আপনি একটি মডেলকে সিরিয়ালাইজ করার ক্ষমতা হারাবেন৷

কোর API দিয়ে মডেল তৈরি করা

এই গাইডের শুরুতে, আমরা উল্লেখ করেছি যে TensorFlow.js-এ একটি মেশিন লার্নিং মডেল তৈরি করার দুটি উপায় রয়েছে।

থাম্বের সাধারণ নিয়ম হল সর্বদা প্রথমে লেয়ার এপিআই ব্যবহার করার চেষ্টা করা, যেহেতু এটি ভালভাবে গৃহীত কেরাস এপিআই-এর পরে মডেল করা হয়েছে যা সর্বোত্তম অনুশীলনগুলি অনুসরণ করে এবং জ্ঞানীয় লোড হ্রাস করে । লেয়ার এপিআই বিভিন্ন অফ-দ্য-শেল্ফ সমাধানও অফার করে যেমন ওজন প্রাথমিককরণ, মডেল সিরিয়ালাইজেশন, পর্যবেক্ষণ প্রশিক্ষণ, বহনযোগ্যতা এবং নিরাপত্তা পরীক্ষা।

আপনি যখনই কোর API ব্যবহার করতে চাইতে পারেন:

  • আপনি সর্বোচ্চ নমনীয়তা বা নিয়ন্ত্রণ প্রয়োজন.
  • আপনার সিরিয়ালাইজেশনের প্রয়োজন নেই, বা আপনার নিজস্ব সিরিয়ালাইজেশন যুক্তি প্রয়োগ করতে পারেন।

Core API-এর মডেলগুলি হল এমন ফাংশন যা এক বা একাধিক Tensors নেয় এবং একটি Tensor ফেরত দেয়। কোর API ব্যবহার করে উপরে লেখা একই মডেলটি এইরকম দেখাচ্ছে:

// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));

function model(x) {
  return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
}

মনে রাখবেন যে কোর API-এ আমরা মডেলের ওজন তৈরি এবং শুরু করার জন্য দায়ী। প্রতিটি ওজন একটি Variable দ্বারা সমর্থিত যা TensorFlow.js কে সংকেত দেয় যে এই টেনসরগুলি শেখার যোগ্য। আপনি tf.variable() ব্যবহার করে একটি Variable তৈরি করতে পারেন এবং একটি বিদ্যমান Tensor পাস করতে পারেন।

এই গাইডে আপনি লেয়ার এবং কোর API ব্যবহার করে মডেল তৈরি করার বিভিন্ন উপায়ের সাথে নিজেকে পরিচিত করেছেন। এরপরে, কিভাবে একটি মডেলকে প্রশিক্ষিত করতে হয় তার জন্য ট্রেনিং মডেল গাইড দেখুন।