ফ্যাশন MNIST ডেটাসেটের ক্লাসিফিকেশন

(পুরো চ্যাপ্টার একটা নোটবুক)

লাইফস্টাইল প্রোডাক্টের ক্লাসিফিকেশন

আমরা বই পড়ছি, নোটবুক কেন পড়বো?

যেহেতু গিটবুকে নোটবুক ঠিকমতো রেন্ডার হয়না, সেকারণে "এনবি ভিউয়ার", গুগল কোলাব এবং গিটহাবে দেখা উচিৎ। গিটহাব লিংক: https://github.com/raqueeb/TensorFlow2/blob/master/classification_book.ipynb অথবা https://nbviewer.jupyter.org/github/raqueeb/TensorFlow2/blob/master/classification_book.ipynb এবং গুগল কোলাব লিংক: https://colab.research.google.com/github/raqueeb/TensorFlow2/blob/master/classification_book.ipynb

ফ্যাশন MNIST ডেটাসেট

(ছবিগুলো আপডেট হবে বাংলায় - ধন্যবাদ উডাসিটি, কোর্সেরা, ডিপমাইন্ড, টেন্সর-ফ্লো সাইট)

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

আমাদের এই এক্সারসাইজটা ব্যবহার ব্যবহার করছে কেরাস tf.keras, একটা হাই-লেভেল এপিআই যা টেন্সর-ফ্লোএর কমপ্লেক্সিটি লুকিয়ে রাখে।

try:
  # %tensorflow_version only exists in Colab.
  # শুধুমাত্র কোলাবে চেষ্টা করবো টেন্সর-ফ্লো ২.০ এর জন্য
  %tensorflow_version 2.x
except Exception:
  pass
TensorFlow 2.x selected.
# টেন্সর-ফ্লো এবং কেরাসকে ইমপোর্ট করছি
import tensorflow as tf
from tensorflow import keras

# কিছু হেলপার লাইব্রেরি
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)

ফ্যাশন MNIST ডেটাসেট ইমপোর্ট করছি

এখন আমরা পুরোদস্তুর লাইফস্টাইল ব্যবসায়ী হয়ে গেছি। আমাদের কাছে হাজারো হাজারো কাপড়চোপড়, টিশার্ট, জুতা, স্নিকার্স, আরো বেশ কিছু জিনিস চলে এসেছে শোরুমে দেবার জন্য। কিন্তু আপনি নাছোড়বান্দা,বললেন ক্যাটালগিং ছাড়া এগুলো শোরুমে উঠানোটা ঠিক হবে না। আর এই ক্যাটালগিং আমরা হাতেকলমে করতে চাইনা। এক একটা জিনিস ধরবো ক্যামেরার সামনে, সে নিজে থেকেই ঠিকমতো ক্লাসিফাই করবে কোনটা কি জিনিস। মেশিনে ঠিকমতো আইডেন্টিফাই করতে পারলে আমাদের সমস্যা মিটে যাবে। আপনার দরকার একটা ডিপ লার্নিং মডেল। আপনার উর্দ্ধতন কর্মকর্তা বললেন, আমি ব্যাপারটা ঠিক বুঝি না, আমাকে কি একটা ডেমো দেখানো যাবে? অবশ্যই দেখানো যাবে। ৭০,০০০ গ্রে-স্কেল স্যাম্পল আছে আমাদের Fashion MNIST ডেটাসেটে।

২৮ X ২৮ পিক্সেল = ৭৬৮ বাইট

১০টা ক্যাটেগরি

Fashion MNIST sprite

Figure 1. Fashion-MNIST samples (by Zalando, MIT License).

আর সে কারণেই আমরা দ্বারস্থ হলাম ফ্যাশন MNIST ডাটাসেটের কাছে। ব্যাপারটা সাধারণ MNIST এর সকল কোড সাপোর্ট করে, তবে ফ্যাশন MNIST বেশকিছু কমপ্লেক্স। এখানে প্রায় ৭০ হাজার স্যাম্পল আছে, তার মধ্যে দশ হাজার ইমেজকে ব্যবহার করব টেস্টসেট হিসেবে, আমাদের নেটওয়ার্ক কতটুকু শিখেছে ইমেজকে ঠিকমতো ক্লাসিফাই করার জন্য। এই ইমেজগুলোর রেজুলেশন ২৮x২৮ পিক্সেল। ছবিতে দেখুন শুরুতেই টি-শার্ট টপ, মাঝখানে স্যান্ডেল, শেষের দিকে এঙ্কেল বুটস। নিচের ছবিতে দেখুন যে দশটা আইটেম আছে আমাদের এই ডাটাসেটে। এর পাশাপাশি আমরা সংখ্যায় লেবেল দিয়েছি ০ থেকে ৯ পর্যন্ত। আপনি বুঝে গেছেন যে আমাদের ডিপ লার্নিং নেটওয়ার্ককে ট্রেইন করার জন্য ইমেজ আছে ৬০০০০। যেহেতু প্রতিটা ইমেজ ২৮x২৮ গ্রেস্কেল ইমেজ, এর সাইজ হচ্ছে ৭৮৪ বাইট (দুটোকে গুন দিলে যা হয়)। তার মানে হচ্ছে এর পিক্সএল ইনটেনসিটি শূন্য থেকে ২৫৫ পর্যন্ত। ইনপুট হিসেবে থাকবে এই ২৮x২৮ পিক্সেলের ছবি, মাঝখানে থাকবে আমাদের ডিপ নিউরাল নেটওয়ার্ক। এখন আমাদের নিউরাল নেটওয়ার্ক ইনপুট হিসেবে ৭৮৪ বাইটকে নেবে, মাঝখানে সে জাদুর ছড়ি ঘুরিয়ে শেষে ক্লাসিফাই করে দেবে একেকটা ইমেজ - যা আসলে যেকোন দশটা আইটেমের একটা আইটেম হবে। ## ছবিতে কি কি আছে? ভালো করে নিচের ছবিটা দেখি। ছবিতে আলাদা করতে পারবেন এলিমেন্টগুলোকে? Fashion MNIST sprite ## ডেটাসেট আছে tf.keras.datasets এ fashion_mnist হিসেবে আমরা লোড ডাটাকে কল করলে নিয়ে আসবে দুই সেটের দুটো লিস্ট। ট্রেনিং এবং টেস্ট সেট। তার ভেতরে একটা কাপড় চোপড়ের ছবি, আরেকটা তার লেবেল মানে কোনটা কি?

fashion_mnist = tf.keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() ``` Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz 32768/29515 [=================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz 26427392/26421880 [==============================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz 8192/5148 [===============================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz 4423680/4422102 [==============================] - 0s 0us/step

আমরা আমরা এভাবেও চেষ্টা করতে পারি, টেন্সর-ফ্লো এর ডেটাসেট এপিআই দিয়ে

# dataset, metadata = tfds.load('fashion_mnist', as_supervised=True, with_info=True) # train_dataset, test_dataset = dataset['train'], dataset['test'] # ডেটা ভাগ করে ফেলি # num_train_examples = metadata.splits['train'].num_examples # num_test_examples = metadata.splits['test'].num_examples # print("Number of training examples: {}".format(num_train_examples)) # print("Number of test examples: {}".format(num_test_examples)) ```

## ডেটাসেট লোড করে কি পাবো? ডেটাসেট লোড করতে গিয়ে চারটা নামপাই অ্যারে পাচ্ছি। * এখানে `train_images` এবং `train_labels` অ্যারে দুটো আমাদের ট্রেনিং সেট — এগুলোকে আমরা ব্যবহার করবো মডেলকে ট্রেনিং করানোর জন্য। * মডেলকে টেস্ট করবো টেস্ট সেট দিয়ে। এই দুটো অ্যারে হিসেবে `test_images`, এবং `test_labels`। আমাদের ছবিগুলো ২৮x২৮ নামপাই অ্যারে যার পিক্সেল ভ্যালু ০ থেকে ২৫৫ এর মধ্যে। এখানে লেবেলগুলো ইন্টেজারের অ্যারে, ০ থেকে ৯ পর্যন্ত। তার করেসপন্ডিং ছবিগুলোর নাম দেখুন এখানে।

Label

Class

0

T-shirt/top

1

Trouser

2

Pullover

3

Dress

4

Coat

5

Sandal

6

Shirt

7

Sneaker

8

Bag

9

Ankle boot

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

এক্সপ্লোরেটরি ডেটা অ্যানালাইসিস

ডেটাগুলোকে একটু নেড়েচেড়ে দেখি। এটা একটা ভালো প্র্যাকটিস - ডেটাকে চিনতে। এখানে দেখছি ৬০,০০০ ছবি, ট্রেনিং সেটে। ২৮x২৮ পিক্সেল, ০ থেকে ৯ লেবেল। বাকি ১০,০০০ টেস্ট ছবি, পরীক্ষা করার জন্য।

Fashion MNIST sprite

৬০,০০০ লেবেলও আছে সঙ্গে।

০ থেকে ৯ লেবেল সব ইন্টেজার ভ্যালু।

১০,০০০ টেস্ট ছবি। ২৮x২৮ পিক্সেল আছে এখানেও।

আছে ১০,০০০ লেবেলও।

ট্রেনিং ছবি এবং তার লেবেল

আচ্ছা, এর ভেতরের ডেটাগুলো কেমন দেখতে? আমরা একটা ট্রেনিং ছবি দেখি। তার সাথে তার লেবেল।

ডেটার প্রি-প্রসেসিং

মনে আছে ডেটা নরমালাইজ করার কথা? যখন ডেটা বেশি ডিস্ট্রিবিউটেড থাকে তখন সেটা কাজ করানো সমস্যা হয়। আমরা যদি প্রথম ছবিটা দেখি, তাহলে বুঝবো সেটার পিক্সেল রেঞ্জ ০ থেকে ২৫৫ পর্যন্ত।

ছবিটা দেখি কালারবার সহ।

png

আমাদের ডাটাগুলোকে এমনভাবে প্রি-প্রসেস করতে হবে যাতে সেটা ঠিকমতো কাজ করতে পারে। যেহেতু আমাদের ইনপুট ভ্যারিয়েবলব্গুলো গ্রেস্কেল মানে ০ থেকে ২৫৫ পর্যন্ত রেঞ্জ, সে কারণে আমরা সেটাকে ০ থেকে ১ এর মধ্যে নিয়ে আসব। আমাদের ট্রেনিং এবং টেস্ট সেট দুটোকেই এই নরমালাইজেশন এর মধ্যে নিয়ে আসতে হবে। এটা করার জন্য আমাদেরকে প্রতিটা ইমেজকে ২৫৫ দিয়ে ভাগ করতে হবে। তাহলে সেটা ০ থেকে ১ এর মধ্যে চলে আসবে।

পাইথনে সুবিধা হচ্ছে একটা লিস্টকে নর্মালাইজ করতে লুপিং করতে হবে না।

আমরা দেখতে চাচ্ছি ডেটাগুলো ঠিকমতো ফরম্যাটে আছে কিনা? যেহেতু আমরা এই ডাটাগুলোকে ট্রেনিংয়ে ব্যবহার করবো, সেকারণে প্রথম ২৫টা ছবিকে ডিসপ্লে করি। যেহেতু আমরা আগেই ক্লাস ডিক্লেয়ার করেছিলাম সেকারণে নিচে সেটার নাম দেখা যাবে।

png

মডেলকে বিল্ড করি

আগেও দেখেছি একটা নিউরাল নেটওয়ার্ক তৈরি করতে প্রথমে মডেলের লেয়ার বানাতে হবে। এরপর আসবে কম্পাইলিং। মডেলের কাজ হচ্ছে ইনপুট থেকে ২৮ x ২৮ পিক্সেল মানে ৭৮৪ পিক্সেল থেকে এই নিউরাল নেটওয়ার্কের লেয়ারগুলো শার্ট/ব্যাগ এর মতো আইটেমগুলোকে ক্লাসিফাই করবো।

Fashion MNIST sprite

লেয়ারগুলোকে সেট করি

একটা নিউরাল নেটওয়ার্কের বেসিক বিল্ডিং ব্লক হচ্ছে তার লেয়ার। এই লেয়ারগুলো বিভিন্ন ফিচার এক্সট্রাক্ট করে রিপ্রেজেন্টেশন এর মাধ্যমে। ইনপুট ডাটা থেকে। যেহেতু একেকটার লেয়ার আরেকটা লেয়ারের সাথে সিকুয়েন্সিয়াল, সে কারণেই ডেন্স tf.keras.layers.Dense ব্যবহার করছি। এর ভেতরের ইন্টারনাল প্যারামিটারগুলো নিজে থেকেই এডজাস্ট হয় মানে শেখে এই ট্রেনিং এর সময়।

আমাদের এই নেটওয়ার্কটা তিনটা লেয়ারের, ছবি দেখুন।

Fashion MNIST: প্রতিটা ক্লাসের যোগফল হচ্ছে ১
  • ইনপুট লেয়ার - প্রথম লেয়ারটার কাজ বেশ মজার। এর কাজ হচ্ছে ইনপুটকে ফ্ল্যাট করে দেয়া - tf.keras.layers.Flatten। আমাদের ইনপুট হিসেবে যে ইমেজ আছে সেটা কিন্তু একটা ২ ডাইমেনশনের অ্যারে মানে ২৮ x ২৮ পিক্সেল। বেসিক মডেলগুলোতে ডাইমেনশনের অ্যারের লাইনগুলোকে একসাথে প্রসেস করা কঠিন, তাই সেগুলোকে আমরা পাশাপাশি খুলে এক লাইনে দাঁড় করাবো। এই ২৮ x ২৮ পিক্সেলকে এক লাইনে দাঁড় করালে ৭৮৪ পিক্সেল হয়। এই লেয়ারের কোন লার্নিং প্যারামিটার নেই, তার কাজ হচ্ছে এটাকে রিফর্মেট মানে নতুন ফরম্যাটে ট্রান্সফরম করে দেয়।

  • "হিডেন লেয়ার" — এটা 'ডেন্স' লেয়ার, একটার সাথে আরেকটা 'ডেন্সলি কানেক্টেড' মানে tf.keras.layers.Dense। ইনপুট লেয়ারের পর থেকে আমরা হিডেন লেয়ার বলতে পারি। এই লেয়ারটাকে আমরা কনফিগার করেছি ১২৮টা নিউরন দিয়ে। আরো কম বেশি করতে পারতাম। প্রতিটা নিউরন যাকে আমরা নোড বলছি সেটা কিন্তু ৭৮৪টা নোডকে কানেক্ট করছে আগের লেয়ার থেকে নতুন লেয়ারে। ইনপুট এর ওয়েট এর উপর ভিত্তি করে এই হিডেন প্যারামিটারগুলো শেখে ট্রেনিং এর সময়। তবে তাদের আউটপুটের যে সিঙ্গেল ভ্যালু সেটাকে সে পাঠায় পরবর্তী লেয়ারে। এখানে আমরা ইচ্ছা করলে আরো কয়েকটা লেয়ার দিতে পারতাম, তবে শেখার জন্য আমরা এটাকে একটু সিম্প্লিস্টিক রাখছি। আমাদের অ্যাক্টিভেশন ফাংশন হিসেবে এখানে ব্যবহার করেছি রেলু, যা আসলে নন লিনিয়ার ফাংশনকে ভালোভাবে সামনে এগিয়ে দিতে পারে।

  • আমাদের এখানে activation='relu' এর কাজ হচ্ছে "যদি X>0 তাহলে রিটার্ন X, নাহলে রিটার্ন 0"। এর মানে হচ্ছে এই অ্যাক্টিভেশন ফাংশন লেয়ারে X শূন্য এর বড়ো হলে সামনের লেয়ারে X এর ভ্যালু পাঠাবে।

  • আউটপুট লেয়ার tf.keras.layers.Dense — এর কনফিগারেশন আগের মতো। ডেন্স। আউটপুট লেয়ারে আপনাদের অবশ্যই মনে আছে আমাদেরকে ক্লাসিফাই করতে হবে দশটা অবজেক্ট। ১০ ধরনের কাপড়, চোপড়, জুতা এগুলোকে যখন ক্লাসিফাই করব তখন অ্যাক্টিভেশন লেয়ার হিসাবে ব্যবহার করব 'সফটম্যাক্স'। 'সফটম্যাক্স' এর কাজ হচ্ছে তাকে যদি দশটা ভ্যালু দেয়া হয় সে সবার ম্যাক্সিমাম ভ্যালু, সবচেয়ে বড় ভ্যালুটা পিক করবে পরের লেয়ারে পাঠাতে। এই ফাংশন আমাদের অনেক কোডিং বাঁচায়।

Fashion MNIST sprite
  • প্রথম লেয়ারে ইনপুট ছিল ৭৮৪ বাইট, এরপরের লেয়ার থেকে শেষ লেয়ারে আমাদের ইনপুট হবে ১২৮ নোড থেকে। প্রতিটা নোডের ওয়েট ইনপুট এর সাথে যুক্ত হয়ে সেটা একটা শেখানো প্যারামিটার হিসেবে দাঁড়াবে। আমাদের আউটপুট ভ্যালু কিন্তু ০ থেকে ১ এর মধ্যে, আমরা যেটাকে বলি প্রবাবিলিটি ডিস্ট্রিবিউশন যেটা আমাদেরকে ওই ছবিটা কে কোন ক্লাসে পড়বে সেটা দেখাবে। এর মধ্যে সবচেয়ে বড়োটা পিক করবে সফটম্যাক্স। ছবি দেখুন, এই দশটা নোটের সবগুলোর ভ্যালু যোগ করলে এক হবে।

মডেলকে কম্পাইল করা

ট্রেনিং করানোর আগে আমাদেরকে কিছু সেটিং বুঝতে হবে। এগুলোকে আমরা যোগ করবো মডেল কম্পাইলিং স্টেজে।

  • লস ফাংশন — আগেও আলাপ করেছিলাম, তবে মডেলকে ঠিক জায়গায় মানে ঠিক অ্যাক্যুরেসিতে পৌঁছাতে হলে এই ফাংশন দরকার। আমাদের এখানে আউটপুট ১০ টা ক্যাটেগরীতে একটা আরেকটার সাথে মিউচুয়ালি এক্সক্লুসিভ (যেখানে একেকটা স্যাম্পল একদম একটা ক্লাসেই থাকবে), সেকারণে ব্যবহার করছি 'sparse_categorical_crossentropy' ব্যবহার করছি লস হিসেবে।

  • অপটিমাইজার — লস ক্যালকুলেট করে সেটার কারেকশন/আপডেট পাঠানোই এর কাজ।

  • মেট্রিকস — আমরা যখন ট্রেনিং এবং টেস্ট একসাথে মনিটর করবো, তখন অ্যাক্যুরেসির দরকার পড়বে। আমাদের এখানে যখন কিছু ছবি ঠিকমতো ক্লাসিফাই হয়েছে, তখন অ্যাক্যুরেসিটা কার্যকরী।

মডেলকে ট্রেনিং করাই

আমাদের এই নিউরাল নেটওয়ার্ককে ট্রেনিং করাতে সামনের কয়েকটা স্টেপ দরকার পড়বে;

১. শুরতেই ডেটাকে ফিড করতে হবে মডেলকে। আমাদের এখানে ট্রেনিং ডেটা আছে train_images এবং train_labels অ্যারেগুলোতে। ২. মডেল শেখে তার ছবি আর লেবেলের মধ্যে সম্পর্ক থেকে। ৩. এখন আমাদের মডেল টেস্ট করার পালা। train_images থেকে প্রেডিকশন করাবো? ভুলেও না। তাহলে পরীক্ষায় প্রশ্ন ফাঁস হয়ে যাবে। বরং আমরা ব্যবহার করবো আনকোরা টেস্ট সেট থেকে যাদের আলাদা করে রেখেছিলাম। আমরা ব্যবহার করবো test_images অ্যারে। আমাদেরকে ভেরিফাই করতে হবে test_images অ্যারে ম্যাচ করে কিনা test_labelsকে। ৪. epochs=10 মানে পুরো ট্রেনিংসেটের ওপর ১০ বার পুরো আইটারেশন চালাবে, মানে সর্বমোট ১০ * ৬০০০০ = ৬০০০০০ এক্সাম্পল।

ট্রেনিং শুরুতেই কল করবো model.fit মেথডকে — এর কাজ হচ্ছে train_images এবং train_labels এর ভেতরের সম্পর্ককে শেখা।

এই প্রসেসটা ভালো করে লক্ষ্য করুন। মডেল ট্রেনিং এর পাশাপাশি তার লস এবং অ্যাক্যুরেসির দিকে নজর রাখুন। লস কমার সাথে সাথে অ্যাক্যুরেসি বাড়ছে। এই মডেলের অ্যাক্যুরেসি বেড়ে চলে এসেছে ০.৮৮ মানে ৮৮% ট্রেনিং ডেটার ওপর।

অ্যাক্যুরেসিকে টেস্ট ডেটা দিয়ে ইভাল্যুয়েট করানো

ট্রেনিং দেখলাম, এখন দেখতে হবে কেমন কাজ করে টেস্ট ডেটার ওপর?

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

তবে এই অ্যাক্যুরেসি বাড়ানোর উপায় নিয়ে আলাপ করবো সামনে।

এখন প্রেডিকশনের পালা

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

প্রেডিকশন শেষ। আমাদের মডেল প্রতিটা ছবিকে ঠিকমতো লেবেল করেছে কিনা, সেটা দেখা দরকার। শুরুতেই প্রথম প্রেডিকশনটা দেখি।

ভালো করে লক্ষ্য করুন। আমাদের আউটপুট লেয়ারে যে ১০টা প্রোবাবিলিটি ডিস্ট্রিবিউশন দিচ্ছে, সেখানে সবচেয়ে বেশি সংখ্যাটাই হচ্ছে তার লেবেলের কনফিডেন্স। সবচেয়ে বেশি সংখ্যাটা কি হতে পারে? এখানে একটা ছবি দেখতে পারেন বোঝার সুবিধার জন্য।

আমাদের মডেল সবচেয়ে বেশি কনফিডেন্ট অ্যাঙ্কেল বুট হিসেবে যার ক্লাস নাম হচ্ছে class_names[9]. আমরা যখন চেক করলাম, তখন বোঝা গেল আমাদের ক্লাসিফিকেশন ঠিক আছে।

এই কোড দেখে ভয় পাবেন না। এই মুহূর্তে আপনার এটা জানতে হবে না। দশটা স্যাম্পলকে আমরা গ্রাফে দেখতে চাচ্ছি ১০টা আলাদা আলাদা ক্লাস প্রেডিকশনে।

ভালো করে লক্ষ্য করুন, ০তম ছবিটা, তার প্রেডিকশনএবং তার প্রেডিকশন অ্যারে। ঠিক প্রেডিকশন লেবেলগুলো নীল (মানে হালকা কালো) আর যেগুলো ঠিক প্রেডিকশন নয়, সেগুলোর লেবেল লাল (হালকা গ্রে)। শেষে ১০০ এর মধ্যে শতাংশ আকারে প্রেডিক্টেড লেবেলের ভ্যালু।

png
png

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

png

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

tf.keras মডেল ব্যাচে প্রেডিকশন করার জন্য অপ্টিমাইজ। মানে একটা একটা করে না। এইজন্য ব্যাচে প্রেডিকশন সবসময় সময় বাঁচায়। এখন আমরা যদি একটা ছবিকে ব্যবহার করি সেটাকেও একটা লিস্টে ফেলতে হবে।

সঠিক লেবেলের জন্য প্রেডিক্ট করি -

png

model.predict আমাদেরকে একটা লিস্টের লিস্ট দেয়, যেখানে প্রতিটা ছবি ওই ব্যাচে আছে। এখন ওই ব্যাচের একটা ছবির জন্য প্রেডিকশন দেখি।

কি বোঝা গেলো? মডেল ঠিকমতো প্রেডিক্ট করতে পেরেছে বলতে হবে।

কেন কলব্যাক?

মডেলকে ট্রেইন করতে সময় লাগে। বিশেষ করে আমরা যখন বিভিন্ন ইপক সংখ্যা নিয়ে কাজ করি। একেকটা ইপক চালাতে যেরকম কম্পিউটিং রিসোর্স ব্যবহার হয়, সেখানে আমাদেরকে পয়সা গুনতে হয় ক্লাউডএর জন্য। এমন যদি হতো আমরা একটা ট্রেনিং বন্ধ করতে পারতাম যখন আমরা একটা দরকারি অ্যাক্যুরেসি পয়েন্টে পৌঁছে গেছি। এই মুহূর্তে আমাদের প্রতিবারই একটা ইপক সংখ্যা পর্যন্ত যেতে হচ্ছে। ভালো খবর হচ্ছে, আমাদের একটা কলব্যাক ফাংশন আছে যেটা এই ট্রেনিং লুপকে দরকারি অ্যাক্যুরেসি এলেই আপনা আপনি বন্ধ করতে পারে। আমরা আসলে ওই পর্যন্ত পৌঁছাতে চাই ওই লেভেলের অ্যাক্যুরেসি পৌঁছে গেলে ট্রেনিং বন্ধ করে দিতে পারি।

এখন ফ্যাশন MNIST এর মধ্যে কলব্যাক ফিচারটা চালাই। আমাদের 'মডেল.ফিট' ফাংশনটা যখন ট্রেনিং লুপের উপর কাজ করে তখন আমরা লক্ষ্য রাখি সেটার আউটপুটে। পাইথনে কাজটা করা বেশ সোজা। যদিও জিনিসটা ইমপ্লিমেন্ট করা হচ্ছে একটা আলাদা ক্লাস হিসেবে তবে সেটা ইনলাইনে থাকছে আমাদের সেই একই কোডে। ধরা যাক, আমরা চাইছি যখন লস ০.২ এর নিচে থাকতে হবে, তাহলে সেই ট্রেনিংটা এমনিতেই ক্যান্সেল হয়ে যাবে।

দেখি কখন আমাদের ট্রেনিং লুপ থামে!

মডেলের একটা সামারি

কি মনে হচ্ছে? এখানে ৩ লেয়ারের একটা ছোট্ট সামারি টেবিল দিয়েছে টাইপ, শেপ এবং প্যারামিটার দিয়ে। ট্রেনিং এর জন্য প্যারামিটার সংখ্যা ৪০৭০৫০, মানে ৪ লক্ষ। একটা ছোট ডেটাসেট অথচ অনেক প্যারামিটার।

Last updated

Was this helpful?