প্রশিক্ষণ মডেল

এই নির্দেশিকাটি অনুমান যদি আপনার আগে থেকেই পড়েছি মডেল এবং স্তর গাইড।

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

  1. স্তরগুলির API ব্যবহার করে LayersModel.fit() বা LayersModel.fitDataset()
  2. সঙ্গে কোর API ব্যবহার করে Optimizer.minimize()

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

ভূমিকা

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

প্রশিক্ষণে বেশ কয়েকটি ধাপ জড়িত:

  • একটি পথ ব্যাচ মডেলের ডেটার।
  • একটি ভবিষ্যদ্বাণী করতে মডেল জিজ্ঞাসা.
  • "সত্য" মানের সাথে সেই ভবিষ্যদ্বাণীটির তুলনা করা।
  • প্রতিটি প্যারামিটার কতটা পরিবর্তন করতে হবে তা নির্ধারণ করা যাতে মডেলটি সেই ব্যাচের জন্য ভবিষ্যতে আরও ভাল ভবিষ্যদ্বাণী করতে পারে।

একটি ভাল-প্রশিক্ষিত মডেল ইনপুট থেকে পছন্দসই আউটপুটে একটি সঠিক ম্যাপিং প্রদান করবে।

মডেল পরামিতি

লেয়ার API ব্যবহার করে একটি সাধারণ 2-স্তর মডেল সংজ্ঞায়িত করা যাক:

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

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

model.weights.forEach(w => {
 console.log(w.name, w.shape);
});

আমরা নিম্নলিখিত আউটপুট পেতে:

> dense_Dense1/kernel [784, 32]
> dense_Dense1/bias [32]
> dense_Dense2/kernel [32, 10]
> dense_Dense2/bias [10]

মোট 4টি ওজন রয়েছে, প্রতি ঘন স্তরে 2টি। এই আশা করা হচ্ছে যেহেতু ঘন স্তর একটি ফাংশন যে মানচিত্র ইনপুট টেন্সর প্রতিনিধিত্ব x একটি আউটপুট টেন্সর করার y সমীকরণ মাধ্যমে y = Ax + b যেখানে A (কার্নেল) এবং b (পক্ষপাত) ঘন স্তর পরামিতি।

উল্লেখ্য: ডিফল্টরূপে ঘন স্তর একটি পক্ষপাত অন্তর্ভুক্ত, কিন্তু আপনি নির্দিষ্ট করে এটা বাদ পারেন {useBias: false} বিকল্পগুলিতে যখন একটি ঘন স্তর তৈরি করা।

model.summary() একটি দরকারী পদ্ধতি আপনার মডেল ওভারভিউ পেতে এবং পরামিতি মোট সংখ্যা দেখতে চাই যদি হল:

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

মডেল প্রতিটি ওজন একটি দ্বারা ব্যাক-এন্ডের হয় Variable অবজেক্ট। TensorFlow.js, একটি Variable একটি ফ্লোটিং পয়েন্ট হয় Tensor একটি অতিরিক্ত পদ্ধতি সঙ্গে assign() তার মান আপডেট করার জন্য ব্যবহার করা হয়। স্তর API সর্বোত্তম অনুশীলন ব্যবহার করে স্বয়ংক্রিয়ভাবে ওজন শুরু করে। বিক্ষোভের অনুরোধে জন্য, আমরা কল করে ওজন ওভাররাইট পারে assign() অন্তর্নিহিত ভেরিয়েবল করুন:

model.weights.forEach(w => {
  const newVals = tf.randomNormal(w.shape);
  // w.val is an instance of tf.Variable
  w.val.assign(newVals);
});

অপ্টিমাইজার, ক্ষতি এবং মেট্রিক

আপনি কোন প্রশিক্ষণ করার আগে, আপনাকে তিনটি বিষয়ে সিদ্ধান্ত নিতে হবে:

  1. একটি অপটিমাইজার। অপ্টিমাইজারের কাজ হল বর্তমান মডেলের ভবিষ্যদ্বাণী অনুসারে মডেলের প্রতিটি প্যারামিটার কতটা পরিবর্তন করতে হবে তা নির্ধারণ করা। স্তরসমূহ এপিআই ব্যবহার করার সময়, আপনি যদি একটি বিদ্যমান অপটিমাইজার (যেমন একটি স্ট্রিং আইডেন্টিফায়ার পারেন প্রদান করতে পারেন 'sgd' বা 'adam' বা একটি দৃষ্টান্ত) Optimizer বর্গ।
  2. একটি ক্ষতি ফাংশন। একটি উদ্দেশ্য যা মডেলটি ছোট করার চেষ্টা করবে। এর লক্ষ্য হল মডেলের ভবিষ্যদ্বাণী "কত ভুল" এর জন্য একটি একক সংখ্যা দেওয়া। ডেটার প্রতিটি ব্যাচে ক্ষতি গণনা করা হয় যাতে মডেলটি তার ওজন আপডেট করতে পারে। স্তরসমূহ এপিআই ব্যবহার করার সময়, আপনি যদি একটি বিদ্যমান ক্ষতি ফাংশন (যেমন একটি স্ট্রিং আইডেন্টিফায়ার পারেন প্রদান করতে পারেন 'categoricalCrossentropy' ), অথবা কোনো ফাংশন যে একটি পূর্বাভাস এবং একটি সত্য মান এবং আয় একটি ক্ষতি লাগে। একটি দেখতে প্রাপ্তিসাধ্য ক্ষতির তালিকা আমাদের API ডক্সে।
  3. মেট্রিক্সের তালিকা। লোকসানের মতো, মেট্রিক্স একটি একক সংখ্যা গণনা করে, আমাদের মডেল কতটা ভাল করছে তা সংক্ষিপ্ত করে। মেট্রিক্স সাধারণত প্রতিটি যুগের শেষে সমগ্র ডেটাতে গণনা করা হয়। অন্তত, আমরা নিরীক্ষণ করতে চাই যে সময়ের সাথে আমাদের ক্ষতি কমছে। যাইহোক, আমরা প্রায়ই আরো মানব-বান্ধব মেট্রিক যেমন নির্ভুলতা চাই। স্তরসমূহ API ব্যবহার করে, তখন আপনি একটি স্ট্রিং আইডেন্টিফায়ার পারেন প্রদান করতে পারেন একটি মেট্রিক বিদ্যমান (যেমন 'accuracy' , বা কোনো ফাংশন যে একটি পূর্বাভাস এবং একটি সত্য মান এবং আয় একটি স্কোর নেয়)। একটি দেখতে প্রাপ্তিসাধ্য মেট্রিক্স তালিকা আমাদের API ডক্সে।

আপনি যখন সিদ্ধান্ত নিয়েছে করেছি, একটি কম্পাইল LayersModel কল করে model.compile() প্রদান করা বিকল্প সহ:

model.compile({
  optimizer: 'sgd',
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

সংকলনের সময়, আপনার বেছে নেওয়া বিকল্পগুলি একে অপরের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে মডেলটি কিছু বৈধতা দেবে।

প্রশিক্ষণ

একটা প্রশিক্ষণের জন্য দুটি উপায় আছে LayersModel :

  • ব্যবহার model.fit() এবং এক বৃহৎ টেন্সর যেমন ডাটা করে।
  • ব্যবহার model.fitDataset() এবং মাধ্যমে তথ্য প্রদানের Dataset অবজেক্ট।

model.fit()

যদি প্রধান মেমরি আপনার ডেটা সেটটি ফিট করে, এবং একটি একক টেন্সর হিসাবে পাওয়া যায়, আপনি কল করে একটি মডেল শেখাতে পারেন fit() পদ্ধতি:

// Generate dummy data.
const data = tf.randomNormal([100, 784]);
const labels = tf.randomUniform([100, 10]);

function onBatchEnd(batch, logs) {
  console.log('Accuracy', logs.acc);
}

// Train for 5 epochs with batch size of 32.
model.fit(data, labels, {
   epochs: 5,
   batchSize: 32,
   callbacks: {onBatchEnd}
 }).then(info => {
   console.log('Final accuracy', info.history.acc);
 });

ফণা অধীনে, model.fit() আমাদের জন্য অনেক কাজ করতে পারেন:

  • একটি ট্রেন এবং বৈধতা সেটে ডেটা বিভক্ত করে এবং প্রশিক্ষণের সময় অগ্রগতি পরিমাপ করতে বৈধতা সেট ব্যবহার করে।
  • ডেটা এলোমেলো করে কিন্তু শুধুমাত্র বিভক্ত হওয়ার পরে। নিরাপদ হতে, আপনি উচিত ডেটা এটি ক্ষণস্থায়ী আগে প্রাক এলোমেলো fit()
  • আকার ছোট tensors মধ্যে বিপুল ডেটা টেন্সর splits batchSize.
  • কল optimizer.minimize() ডেটার ব্যাচ থেকে সম্মান সঙ্গে মডেল হারানোর কম্পিউটিং হয়েছে।
  • এটি প্রতিটি যুগ বা ব্যাচের শুরু এবং শেষে আপনাকে অবহিত করতে পারে। আমাদের ক্ষেত্রে, আমরা ব্যবহার প্রত্যেক ব্যাচের শেষে জানানো হয় callbacks.onBatchEnd বিকল্প। অন্যান্য অপশন অন্তর্ভুক্ত: onTrainBegin , onTrainEnd , onEpochBegin , onEpochEnd এবং onBatchBegin
  • JS ইভেন্ট লুপে সারিবদ্ধ কাজগুলি একটি সময়মত পরিচালনা করা যায় তা নিশ্চিত করার জন্য এটি মূল থ্রেডে পৌঁছে দেয়।

আরো তথ্যের জন্য, দেখুন ডকুমেন্টেশন এর fit() । মনে রাখবেন যে আপনি যদি Core API ব্যবহার করতে চান তবে আপনাকে এই যুক্তিটি নিজেই প্রয়োগ করতে হবে।

model.fitDataset()

আপনার ডেটা মেমরি সম্পূর্ণরূপে মাপসই করা হবে না, অথবা প্রবাহিত হচ্ছে, আপনি কল করে একটি মডেল শেখাতে পারেন fitDataset() , যা একটি লাগে Dataset অবজেক্ট। এখানে একই প্রশিক্ষণ কোড আছে কিন্তু একটি ডেটাসেট সহ যা একটি জেনারেটর ফাংশন মোড়ানো হয়:

function* data() {
 for (let i = 0; i < 100; i++) {
   // Generate one sample at a time.
   yield tf.randomNormal([784]);
 }
}

function* labels() {
 for (let i = 0; i < 100; i++) {
   // Generate one sample at a time.
   yield tf.randomUniform([10]);
 }
}

const xs = tf.data.generator(data);
const ys = tf.data.generator(labels);
// We zip the data and labels together, shuffle and batch 32 samples at a time.
const ds = tf.data.zip({xs, ys}).shuffle(100 /* bufferSize */).batch(32);

// Train the model for 5 epochs.
model.fitDataset(ds, {epochs: 5}).then(info => {
 console.log('Accuracy', info.history.acc);
});

ডেটাসেট সম্পর্কে আরো তথ্যের জন্য, দেখুন ডকুমেন্টেশন এর model.fitDataset()

নতুন তথ্য ভবিষ্যদ্বাণী

একবার মডেল প্রশিক্ষিত করা হয়েছে, আপনি কল করতে পারেন model.predict() অদেখা ডেটার উপর ভবিষ্যৎবাণী করার:

// Predict 3 random samples.
const prediction = model.predict(tf.randomNormal([3, 784]));
prediction.print();

কোর API

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

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

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

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

এই API সম্পর্কে আরো তথ্যের জন্য, মধ্যে "কোর এপিআই" বিভাগে পড়া মডেল এবং স্তরসমূহ গাইড।

কোর 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);
}

লেয়ার এপিআই ছাড়াও, ডেটা এপিআই কোর এপিআই-এর সাথে নির্বিঘ্নে কাজ করে। আসুন ডেটা সেটটি যে আমরা আগে সংজ্ঞায়িত পুনরায় ব্যবহার model.fitDataset () অধ্যায়, যা অদলবদল করে এবং আমাদের জন্য Batching:

const xs = tf.data.generator(data);
const ys = tf.data.generator(labels);
// Zip the data and labels together, shuffle and batch 32 samples at a time.
const ds = tf.data.zip({xs, ys}).shuffle(100 /* bufferSize */).batch(32);

আসুন মডেলটি প্রশিক্ষণ দেওয়া যাক:

const optimizer = tf.train.sgd(0.1 /* learningRate */);
// Train for 5 epochs.
for (let epoch = 0; epoch < 5; epoch++) {
  await ds.forEachAsync(({xs, ys}) => {
    optimizer.minimize(() => {
      const predYs = model(xs);
      const loss = tf.losses.softmaxCrossEntropy(ys, predYs);
      loss.data().then(l => console.log('Loss', l));
      return loss;
    });
  });
  console.log('Epoch', epoch);
}

কোর API এর সাথে একটি মডেলকে প্রশিক্ষণ দেওয়ার সময় উপরের কোডটি আদর্শ রেসিপি:

  • epochs সংখ্যা উপর লুপ.
  • প্রতিটি যুগের ভিতরে, আপনার ব্যাচের ডেটা লুপ করুন। একটি ব্যবহার করার সময় Dataset , dataset.forEachAsync() আপনার ব্যাচ উপর লুপ একটি সুবিধাজনক উপায়।
  • প্রতিটি ব্যাচ, কল জন্য optimizer.minimize(f) , যা executes f এবং চার ভেরিয়েবল আমরা আগেই সংজ্ঞায়িত থেকে সম্মান সঙ্গে কম্পিউটিং গ্রেডিয়েন্ট দ্বারা তার আউটপুট ছোট।
  • f ক্ষতি নির্ণয় করে। এটি মডেলের পূর্বাভাস এবং সত্য মান ব্যবহার করে পূর্বনির্ধারিত ক্ষতির ফাংশনগুলির একটিকে কল করে।