TensorFlow.js - ট্রান্সফার লার্নিং ব্যবহার করে অডিও স্বীকৃতি

১. ভূমিকা

এই কোডল্যাবে, আপনি একটি অডিও রিকগনিশন নেটওয়ার্ক তৈরি করবেন এবং শব্দ তৈরির মাধ্যমে ব্রাউজারের একটি স্লাইডার নিয়ন্ত্রণ করতে এটি ব্যবহার করবেন। আপনি জাভাস্ক্রিপ্টের জন্য একটি শক্তিশালী ও নমনীয় মেশিন লার্নিং লাইব্রেরি, TensorFlow.js ব্যবহার করবেন।

প্রথমে, আপনি একটি প্রি-ট্রেইনড মডেল লোড ও রান করবেন যেটি ২০টি স্পিচ কমান্ড শনাক্ত করতে পারে। তারপর, আপনার মাইক্রোফোন ব্যবহার করে একটি সাধারণ নিউরাল নেটওয়ার্ক তৈরি ও ট্রেইন করবেন, যেটি আপনার শব্দ শনাক্ত করে স্লাইডারটিকে বামে বা ডানে সরাবে।

এই কোডল্যাবে অডিও রিকগনিশন মডেলের পেছনের তত্ত্ব নিয়ে আলোচনা করা হবে না । আপনি যদি এ বিষয়ে আগ্রহী হন, তবে এই টিউটোরিয়ালটি দেখতে পারেন।

এই কোডল্যাবে ব্যবহৃত মেশিন লার্নিং পরিভাষাগুলোর একটি শব্দকোষও আমরা তৈরি করেছি।

আপনি যা শিখবেন

  • একটি পূর্ব-প্রশিক্ষিত স্পিচ কমান্ড শনাক্তকরণ মডেল কীভাবে লোড করবেন
  • মাইক্রোফোন ব্যবহার করে কীভাবে রিয়েল-টাইম পূর্বাভাস তৈরি করা যায়
  • ব্রাউজার মাইক্রোফোন ব্যবহার করে কীভাবে একটি কাস্টম অডিও শনাক্তকরণ মডেলকে প্রশিক্ষণ ও ব্যবহার করা যায়

তাহলে চলুন শুরু করা যাক।

২. প্রয়োজনীয়তা

এই কোডল্যাবটি সম্পন্ন করতে আপনার প্রয়োজন হবে:

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

৩. TensorFlow.js এবং অডিও মডেল লোড করুন

একটি এডিটরে index.html খুলুন এবং এই কন্টেন্টটি যোগ করুন:

<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/speech-commands"></script>
  </head>
  <body>
    <div id="console"></div>
    <script src="index.js"></script>
  </body>
</html>

প্রথম <script> ট্যাগটি TensorFlow.js লাইব্রেরি ইম্পোর্ট করে, এবং দ্বিতীয় <script> প্রি-ট্রেইনড স্পিচ কমান্ডস মডেল ইম্পোর্ট করে। মডেলটির আউটপুট প্রদর্শন করার জন্য <div id="console"> ট্যাগটি ব্যবহৃত হবে।

৪. রিয়েল-টাইমে পূর্বাভাস দিন

এরপর, একটি কোড এডিটরে index.js ফাইলটি খুলুন/তৈরি করুন এবং নিম্নলিখিত কোডটি অন্তর্ভুক্ত করুন:

let recognizer;

function predictWord() {
 // Array of words that the recognizer is trained to recognize.
 const words = recognizer.wordLabels();
 recognizer.listen(({scores}) => {
   // Turn scores into a list of (score,word) pairs.
   scores = Array.from(scores).map((s, i) => ({score: s, word: words[i]}));
   // Find the most probable word.
   scores.sort((s1, s2) => s2.score - s1.score);
   document.querySelector('#console').textContent = scores[0].word;
 }, {probabilityThreshold: 0.75});
}

async function app() {
 recognizer = speechCommands.create('BROWSER_FFT');
 await recognizer.ensureModelLoaded();
 predictWord();
}

app();

৫. ভবিষ্যদ্বাণীটি পরীক্ষা করুন।

আপনার ডিভাইসে মাইক্রোফোন আছে কিনা তা নিশ্চিত করুন। উল্লেখ্য যে, এটি মোবাইল ফোনেও কাজ করবে! ওয়েবপেজটি চালানোর জন্য, ব্রাউজারে index.html খুলুন। আপনি যদি কোনো লোকাল ফাইল থেকে কাজ করেন, তাহলে মাইক্রোফোন অ্যাক্সেস করার জন্য আপনাকে একটি ওয়েব সার্ভার চালু করতে হবে এবং http://localhost:port/ ব্যবহার করতে হবে।

পোর্ট ৮০০০-এ একটি সাধারণ ওয়েব সার্ভার চালু করতে:

python -m SimpleHTTPServer

মডেলটি ডাউনলোড হতে কিছুটা সময় লাগতে পারে, তাই অনুগ্রহ করে ধৈর্য ধরুন। মডেলটি লোড হওয়ার সাথে সাথেই আপনি পেজের উপরে একটি শব্দ দেখতে পাবেন। মডেলটিকে ০ থেকে ৯ পর্যন্ত সংখ্যা এবং 'বাম', 'ডান', 'হ্যাঁ', 'না' ইত্যাদির মতো আরও কিছু অতিরিক্ত কমান্ড শনাক্ত করার জন্য প্রশিক্ষণ দেওয়া হয়েছে।

ওই শব্দগুলোর মধ্যে একটি বলুন। এটি কি আপনার শব্দটি সঠিকভাবে শনাক্ত করতে পারে? probabilityThreshold নিয়ে পরীক্ষা করুন, যা মডেলটি কত ঘন ঘন সক্রিয় হবে তা নিয়ন্ত্রণ করে – ০.৭৫ এর অর্থ হলো, মডেলটি তখনই সক্রিয় হবে যখন এটি কোনো একটি নির্দিষ্ট শব্দ শোনার ব্যাপারে ৭৫%-এর বেশি আত্মবিশ্বাসী হবে।

স্পিচ কমান্ড মডেল এবং এর এপিআই সম্পর্কে আরও জানতে, গিটহাবে থাকা README.md দেখুন।

৬. তথ্য সংগ্রহ করুন

বিষয়টাকে আরও মজাদার করতে, স্লাইডারটি নিয়ন্ত্রণ করার জন্য পুরো শব্দের পরিবর্তে ছোট ছোট ধ্বনি ব্যবহার করা যাক!

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

  1. প্রথমে আমাদের ডেটা সংগ্রহ করতে হবে। <div id="console"> এর আগে <body> ট্যাগের ভিতরে এটি যোগ করে অ্যাপটিতে একটি সহজ UI যোগ করুন:
<button id="left" onmousedown="collect(0)" onmouseup="collect(null)">Left</button>
<button id="right" onmousedown="collect(1)" onmouseup="collect(null)">Right</button>
<button id="noise" onmousedown="collect(2)" onmouseup="collect(null)">Noise</button>
  1. index.js এ এটি যোগ করুন:
// One frame is ~23ms of audio.
const NUM_FRAMES = 3;
let examples = [];

function collect(label) {
 if (recognizer.isListening()) {
   return recognizer.stopListening();
 }
 if (label == null) {
   return;
 }
 recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
   let vals = normalize(data.subarray(-frameSize * NUM_FRAMES));
   examples.push({vals, label});
   document.querySelector('#console').textContent =
       `${examples.length} examples collected`;
 }, {
   overlapFactor: 0.999,
   includeSpectrogram: true,
   invokeCallbackOnNoiseAndUnknown: true
 });
}

function normalize(x) {
 const mean = -100;
 const std = 10;
 return x.map(x => (x - mean) / std);
}
  1. app() থেকে predictWord() সরিয়ে ফেলুন:
async function app() {
 recognizer = speechCommands.create('BROWSER_FFT');
 await recognizer.ensureModelLoaded();
 // predictWord() no longer called.
}

ভেঙে বিশ্লেষণ করা

এই কোডটি প্রথমে বেশ জটিল মনে হতে পারে, তাই চলুন এটিকে ভেঙে ভেঙে আলোচনা করা যাক।

আমরা আমাদের UI-তে "Left", "Right" এবং "Noise" লেবেলযুক্ত তিনটি বাটন যোগ করেছি, যা আমাদের মডেলকে চিনিয়ে দিতে চাওয়া তিনটি কমান্ডের সাথে সঙ্গতিপূর্ণ। এই বাটনগুলো চাপলে আমাদের সদ্য যোগ করা collect() ফাংশনটি কল হয়, যা আমাদের মডেলের জন্য প্রশিক্ষণের উদাহরণ তৈরি করে।

collect() ফাংশনটি recognizer.listen() এর আউটপুটের সাথে একটি label যুক্ত করে। যেহেতু includeSpectrogram true , recognizer.listen() ১ সেকেন্ডের অডিওর জন্য কাঁচা স্পেকট্রোগ্রাম (ফ্রিকোয়েন্সি ডেটা) প্রদান করে, যা ৪৩টি ফ্রেমে বিভক্ত থাকে, ফলে প্রতিটি ফ্রেম প্রায় ২৩ মিলিসেকেন্ডের অডিও হয়।

recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
...
}, {includeSpectrogram: true});

যেহেতু আমরা স্লাইডারটি নিয়ন্ত্রণ করতে শব্দের পরিবর্তে সংক্ষিপ্ত ধ্বনি ব্যবহার করতে চাই, তাই আমরা কেবল শেষ ৩টি ফ্রেম (~৭০ মিলিসেকেন্ড) বিবেচনায় নিচ্ছি:

let vals = normalize(data.subarray(-frameSize * NUM_FRAMES));

এবং সংখ্যাগত সমস্যা এড়ানোর জন্য, আমরা ডেটাগুলোকে এমনভাবে স্বাভাবিক করি যাতে তাদের গড় ০ এবং আদর্শ বিচ্যুতি ১ হয়। এক্ষেত্রে, স্পেকট্রোগ্রামের মানগুলো সাধারণত -১০০ এর কাছাকাছি বড় ঋণাত্মক সংখ্যা এবং বিচ্যুতি ১০ হয়:

const mean = -100;
const std = 10;
return x.map(x => (x - mean) / std);

অবশেষে, প্রতিটি প্রশিক্ষণ উদাহরণে ২টি ফিল্ড থাকবে:

  • label ****: যথাক্রমে 'বাম', 'ডান' এবং 'গোলমাল'-এর জন্য ০, ১ এবং ২।
  • vals ****: ৬৯৬টি সংখ্যা যা কম্পাঙ্কের তথ্য (স্পেকট্রোগ্রাম) ধারণ করে।

এবং আমরা সমস্ত ডেটা examples ভেরিয়েবলে সংরক্ষণ করি:

examples.push({vals, label});

৭. পরীক্ষার তথ্য সংগ্রহ

ব্রাউজারে index.html খুলুন, এবং আপনি ৩টি কমান্ডের জন্য ৩টি বাটন দেখতে পাবেন। আপনি যদি কোনো লোকাল ফাইল থেকে কাজ করেন, তাহলে মাইক্রোফোন অ্যাক্সেস করার জন্য আপনাকে একটি ওয়েবসার্ভার চালু করতে হবে এবং http://localhost:port/ ব্যবহার করতে হবে।

পোর্ট ৮০০০-এ একটি সাধারণ ওয়েব সার্ভার চালু করতে:

python -m SimpleHTTPServer

প্রতিটি কমান্ডের জন্য উদাহরণ সংগ্রহ করতে, প্রতিটি বোতাম ৩-৪ সেকেন্ড ধরে চেপে রেখে বারবার (বা একটানা) একটি নির্দিষ্ট শব্দ করুন। প্রতিটি লেবেলের জন্য আপনার প্রায় ১৫০টি উদাহরণ সংগ্রহ করা উচিত। উদাহরণস্বরূপ, আমরা 'বাম'-এর জন্য আঙুল ফোটাতে পারি, 'ডান'-এর জন্য শিস দিতে পারি এবং 'শব্দ'-এর জন্য পর্যায়ক্রমে নীরবতা ও কথা বলতে পারি।

আপনি যত বেশি উদাহরণ সংগ্রহ করবেন, পেজে দেখানো কাউন্টারটি তত বাড়তে থাকবে। আপনি চাইলে কনসোলে examples ভেরিয়েবলের উপর console.log() কল করে ডেটা পরীক্ষা করে দেখতে পারেন। এই পর্যায়ে মূল লক্ষ্য হলো ডেটা সংগ্রহের প্রক্রিয়াটি পরীক্ষা করা। পরবর্তীতে, পুরো অ্যাপটি পরীক্ষা করার সময় আপনি আবার ডেটা সংগ্রহ করবেন।

৮. একটি মডেলকে প্রশিক্ষণ দিন

  1. index.html-এর body-তে ' Noise ' বাটনের ঠিক পরেই একটি ' Train ' বাটন যোগ করুন :
<br/><br/>
<button id="train" onclick="train()">Train</button>
  1. index.js- এর বিদ্যমান কোডে নিম্নলিখিতটি যোগ করুন:
const INPUT_SHAPE = [NUM_FRAMES, 232, 1];
let model;

async function train() {
 toggleButtons(false);
 const ys = tf.oneHot(examples.map(e => e.label), 3);
 const xsShape = [examples.length, ...INPUT_SHAPE];
 const xs = tf.tensor(flatten(examples.map(e => e.vals)), xsShape);

 await model.fit(xs, ys, {
   batchSize: 16,
   epochs: 10,
   callbacks: {
     onEpochEnd: (epoch, logs) => {
       document.querySelector('#console').textContent =
           `Accuracy: ${(logs.acc * 100).toFixed(1)}% Epoch: ${epoch + 1}`;
     }
   }
 });
 tf.dispose([xs, ys]);
 toggleButtons(true);
}

function buildModel() {
 model = tf.sequential();
 model.add(tf.layers.depthwiseConv2d({
   depthMultiplier: 8,
   kernelSize: [NUM_FRAMES, 3],
   activation: 'relu',
   inputShape: INPUT_SHAPE
 }));
 model.add(tf.layers.maxPooling2d({poolSize: [1, 2], strides: [2, 2]}));
 model.add(tf.layers.flatten());
 model.add(tf.layers.dense({units: 3, activation: 'softmax'}));
 const optimizer = tf.train.adam(0.01);
 model.compile({
   optimizer,
   loss: 'categoricalCrossentropy',
   metrics: ['accuracy']
 });
}

function toggleButtons(enable) {
 document.querySelectorAll('button').forEach(b => b.disabled = !enable);
}

function flatten(tensors) {
 const size = tensors[0].length;
 const result = new Float32Array(tensors.length * size);
 tensors.forEach((arr, i) => result.set(arr, i * size));
 return result;
}
  1. অ্যাপ লোড হওয়ার সময় buildModel() কল করুন:
async function app() {
 recognizer = speechCommands.create('BROWSER_FFT');
 await recognizer.ensureModelLoaded();
 // Add this line.
 buildModel();
}

এই পর্যায়ে আপনি অ্যাপটি রিফ্রেশ করলে একটি নতুন " Train " বাটন দেখতে পাবেন। আপনি পুনরায় ডেটা সংগ্রহ করে এবং "Train"-এ ক্লিক করে ট্রেনিং পরীক্ষা করতে পারেন, অথবা প্রেডিকশনের সাথে ট্রেনিং পরীক্ষা করার জন্য ধাপ ১০ পর্যন্ত অপেক্ষা করতে পারেন।

ভেঙে বিশ্লেষণ করা

মূলত আমরা দুটি কাজ করছি: buildModel() মডেলের কাঠামো নির্ধারণ করে এবং train() সংগৃহীত ডেটা ব্যবহার করে মডেলটিকে প্রশিক্ষণ দেয়।

মডেল স্থাপত্য

মডেলটিতে ৪টি লেয়ার রয়েছে: একটি কনভল্যুশনাল লেয়ার যা অডিও ডেটা (স্পেকট্রোগ্রাম হিসেবে উপস্থাপিত) প্রসেস করে, একটি ম্যাক্স পুল লেয়ার, একটি ফ্ল্যাটেন লেয়ার, এবং একটি ডেন্স লেয়ার যা ৩টি অ্যাকশনের সাথে ম্যাপ করে।

model = tf.sequential();
 model.add(tf.layers.depthwiseConv2d({
   depthMultiplier: 8,
   kernelSize: [NUM_FRAMES, 3],
   activation: 'relu',
   inputShape: INPUT_SHAPE
 }));
 model.add(tf.layers.maxPooling2d({poolSize: [1, 2], strides: [2, 2]}));
 model.add(tf.layers.flatten());
 model.add(tf.layers.dense({units: 3, activation: 'softmax'}));

মডেলটির ইনপুট শেপ হলো [NUM_FRAMES, 232, 1] যেখানে প্রতিটি ফ্রেম হলো ২৩ মিলিসেকেন্ডের অডিও, যাতে বিভিন্ন ফ্রিকোয়েন্সি নির্দেশকারী ২৩২টি সংখ্যা থাকে (২৩২ সংখ্যাটি বেছে নেওয়া হয়েছে কারণ মানুষের কণ্ঠস্বর ধারণ করার জন্য এই পরিমাণ ফ্রিকোয়েন্সি বাকেট প্রয়োজন)। এই কোডল্যাবে, আমরা ৩ ফ্রেম দীর্ঘ স্যাম্পল (~৭০ মিলিসেকেন্ডের স্যাম্পল) ব্যবহার করছি, কারণ স্লাইডারটি নিয়ন্ত্রণ করার জন্য আমরা পুরো শব্দ বলার পরিবর্তে ধ্বনি তৈরি করছি।

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

const optimizer = tf.train.adam(0.01);
 model.compile({
   optimizer,
   loss: 'categoricalCrossentropy',
   metrics: ['accuracy']
 });

আমরা অ্যাডাম অপটিমাইজার ব্যবহার করি, যা ডিপ লার্নিং-এ ব্যবহৃত একটি সাধারণ অপটিমাইজার, এবং লস হিসেবে categoricalCrossEntropy করি, যা ক্লাসিফিকেশনের জন্য ব্যবহৃত একটি স্ট্যান্ডার্ড লস ফাংশন। সংক্ষেপে, এটি পরিমাপ করে যে পূর্বাভাসিত সম্ভাবনাগুলো (প্রতিটি ক্লাসের জন্য একটি সম্ভাবনা) প্রকৃত ক্লাসে ১০০% সম্ভাবনা এবং অন্য সব ক্লাসের জন্য ০% সম্ভাবনা থেকে কতটা দূরে রয়েছে। আমরা নিরীক্ষণের জন্য একটি মেট্রিক হিসেবে accuracy প্রদান করি, যা প্রশিক্ষণের প্রতিটি ইপোকের পরে মডেলটি কত শতাংশ উদাহরণ সঠিকভাবে সমাধান করেছে তা আমাদের জানাবে।

প্রশিক্ষণ

প্রশিক্ষণটি ১৬-এর ব্যাচ সাইজ ব্যবহার করে ডেটার উপর ১০ বার (ইপক) চলে (একবারে ১৬টি উদাহরণ প্রসেস করা হয়) এবং UI-তে বর্তমান অ্যাকুরেসি দেখায়:

await model.fit(xs, ys, {
   batchSize: 16,
   epochs: 10,
   callbacks: {
     onEpochEnd: (epoch, logs) => {
       document.querySelector('#console').textContent =
           `Accuracy: ${(logs.acc * 100).toFixed(1)}% Epoch: ${epoch + 1}`;
     }
   }
 });

৯. রিয়েল-টাইমে স্লাইডারটি আপডেট করুন

এখন যেহেতু আমরা আমাদের মডেলকে প্রশিক্ষণ দিতে পারি, চলুন রিয়েল-টাইমে প্রেডিকশন করার এবং স্লাইডারটি সরানোর জন্য কোড যোগ করি। index.html- এ " Train " বাটনের ঠিক পরেই এটি যোগ করুন:

<br/><br/>
<button id="listen" onclick="listen()">Listen</button>
<input type="range" id="output" min="0" max="10" step="0.1">

এবং index.js- এ নিম্নলিখিত বিষয়গুলো রয়েছে:

async function moveSlider(labelTensor) {
 const label = (await labelTensor.data())[0];
 document.getElementById('console').textContent = label;
 if (label == 2) {
   return;
 }
 let delta = 0.1;
 const prevValue = +document.getElementById('output').value;
 document.getElementById('output').value =
     prevValue + (label === 0 ? -delta : delta);
}

function listen() {
 if (recognizer.isListening()) {
   recognizer.stopListening();
   toggleButtons(true);
   document.getElementById('listen').textContent = 'Listen';
   return;
 }
 toggleButtons(false);
 document.getElementById('listen').textContent = 'Stop';
 document.getElementById('listen').disabled = false;

 recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
   const vals = normalize(data.subarray(-frameSize * NUM_FRAMES));
   const input = tf.tensor(vals, [1, ...INPUT_SHAPE]);
   const probs = model.predict(input);
   const predLabel = probs.argMax(1);
   await moveSlider(predLabel);
   tf.dispose([input, probs, predLabel]);
 }, {
   overlapFactor: 0.999,
   includeSpectrogram: true,
   invokeCallbackOnNoiseAndUnknown: true
 });
}

ভেঙে বিশ্লেষণ করা

রিয়েল-টাইম পূর্বাভাস

listen() ফাংশনটি মাইক্রোফোন শোনে এবং রিয়েল-টাইম প্রেডিকশন দেয়। কোডটি collect() মেথডের মতোই, যা র স্পেকট্রোগ্রামকে নর্মালাইজ করে এবং শেষ NUM_FRAMES ফ্রেম ছাড়া বাকি সব ফ্রেম বাদ দিয়ে দেয়। একমাত্র পার্থক্য হলো, প্রেডিকশন পাওয়ার জন্য আমরা ট্রেইনড মডেলটিকেও কল করি:

const probs = model.predict(input);
const predLabel = probs.argMax(1);
await moveSlider(predLabel);

model.predict(input) এর আউটপুট হলো [1, numClasses] আকারের একটি টেনসর, যা ক্লাস সংখ্যার উপর একটি সম্ভাব্যতা বিন্যাসকে উপস্থাপন করে। আরও সহজভাবে বললে, এটি হলো প্রতিটি সম্ভাব্য আউটপুট ক্লাসের জন্য কনফিডেন্সের একটি সেট, যেগুলোর যোগফল ১ হয়। টেনসরটির বাইরের ডাইমেনশন ১, কারণ এটিই হলো ব্যাচের (একটিমাত্র উদাহরণ) আকার।

সম্ভাব্যতা বিন্যাসকে সর্বাধিক সম্ভাব্য শ্রেণীকে প্রতিনিধিত্বকারী একটি একক পূর্ণসংখ্যায় রূপান্তর করতে, আমরা probs.argMax(1) কল করি, যা সর্বোচ্চ সম্ভাব্যতা সহ শ্রেণীর সূচকটি ফেরত দেয়। আমরা axis প্যারামিটার হিসাবে একটি "1" পাস করি কারণ আমরা শেষ ডাইমেনশন, numClasses উপর argMax গণনা করতে চাই।

স্লাইডার আপডেট করা হচ্ছে

moveSlider() ফাংশনটি স্লাইডারের মান কমায় যদি লেবেল 0 ("Left") হয়, বাড়ায় যদি লেবেল 1 ("Right") হয় এবং উপেক্ষা করে যদি লেবেল 2 ("Noise") হয়।

টেনসর নিষ্পত্তি করা

GPU মেমরি পরিষ্কার করার জন্য আউটপুট টেনসরগুলিতে ম্যানুয়ালি tf.dispose() কল করা গুরুত্বপূর্ণ। ম্যানুয়াল tf.dispose() এর বিকল্প হলো ফাংশন কলগুলিকে tf.tidy() এর মধ্যে মোড়ানো, কিন্তু এটি অ্যাসিঙ্ক ফাংশনের সাথে ব্যবহার করা যায় না।

   tf.dispose([input, probs, predLabel]);

১০. চূড়ান্ত অ্যাপটি পরীক্ষা করুন

আপনার ব্রাউজারে index.html খুলুন এবং আগের অংশের মতো করে ৩টি কমান্ডের জন্য নির্ধারিত ৩টি বাটন ব্যবহার করে ডেটা সংগ্রহ করুন। মনে রাখবেন, ডেটা সংগ্রহের সময় প্রতিটি বাটন ৩-৪ সেকেন্ড ধরে চেপে রাখতে হবে

একবার উদাহরণগুলো সংগ্রহ করা হয়ে গেলে, "Train" বোতামটি চাপুন। এটি মডেলের প্রশিক্ষণ শুরু করবে এবং আপনি দেখবেন মডেলটির নির্ভুলতা ৯০%-এর উপরে চলে গেছে। যদি মডেলটি ভালো পারফরম্যান্স না দেয়, তবে আরও ডেটা সংগ্রহ করার চেষ্টা করুন।

প্রশিক্ষণটি সম্পন্ন হলে, মাইক্রোফোন থেকে পূর্বাভাস পেতে এবং স্লাইডারটি নিয়ন্ত্রণ করতে "শুনুন" বোতামটি চাপুন!

আরও টিউটোরিয়ালের জন্য http://js.tensorflow.org/ দেখুন।