Machine Learning Image Classification প্রজেক্ট তৈরি গাইড ও নোট

343

Image Classification হল একটি মৌলিক ডিপ লার্নিং টাস্ক যেখানে একটি মডেল ইমেজ ইনপুট হিসেবে গ্রহণ করে এবং এটি যে শ্রেণির অন্তর্গত তা চিহ্নিত করে। এই প্রজেক্টে, আমরা MXNet ব্যবহার করে একটি সিম্পল Image Classification মডেল তৈরি করব যা MNIST ডেটাসেট ব্যবহার করবে। MNIST ডেটাসেটটি ৭০,০০০ হাতের লেখা ডিজিটের ইমেজ নিয়ে গঠিত।

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


প্রজেক্টে ব্যবহৃত উপাদানসমূহ:

  • ডেটাসেট: MNIST ডেটাসেট (যেখানে ইমেজগুলি 28x28 পিক্সেল আকারের এবং 10টি শ্রেণি রয়েছে, 0-9 ডিজিট)
  • মডেল: কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNN)
  • লাইব্রেরি: MXNet, GluonCV, NumPy, Matplotlib

ধাপ ১: পরিবেশ সেটআপ

  1. পাইথন এবং পিপ ইনস্টলেশন: যদি আপনি এখনও MXNet ইনস্টল না করে থাকেন, তাহলে প্রথমে এটি ইনস্টল করুন:

    pip install mxnet
    
  2. অন্যান্য ডিপেনডেন্সি ইনস্টলেশন: ইমেজ প্রক্রিয়াকরণের জন্য কিছু অতিরিক্ত লাইব্রেরি ইনস্টল করতে হবে:

    pip install gluoncv matplotlib numpy
    

ধাপ ২: ডেটা লোডিং

MNIST ডেটাসেট GluonCV লাইব্রেরির মাধ্যমে সরাসরি লোড করা যায়। নিচে ডেটা লোড করার কোড দেওয়া হলো।

import mxnet as mx
from mxnet.gluon.data import DataLoader
from mxnet.gluon.data.vision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt

# MNIST ডেটাসেট লোড করুন
train_data = datasets.MNIST(train=True)
test_data = datasets.MNIST(train=False)

# ডেটার ট্রান্সফর্মেশন সেটআপ করুন
transform = transforms.Compose([
    transforms.ToTensor(),  # টেনসর ফরম্যাটে রূপান্তর
    transforms.Normalize(mean=[0.13], std=[0.31])  # নরমালাইজেশন
])

# ডেটা ট্রান্সফর্ম করুন
train_data = train_data.transform_first(transform)
test_data = test_data.transform_first(transform)

# DataLoader তৈরি করুন
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = DataLoader(test_data, batch_size=64, shuffle=False)

# প্রথম ব্যাচ দেখুন
for data, label in train_loader:
    print(f"Data shape: {data.shape}, Label shape: {label.shape}")
    break

ব্যাখ্যা:

  • MNIST ডেটাসেট datasets.MNIST() এর মাধ্যমে লোড করা হয়েছে।
  • Transform এর মধ্যে ToTensor() এবং Normalize() ট্রান্সফর্মেশন যুক্ত করা হয়েছে, যা ডেটাকে টেনসর ফরম্যাটে রূপান্তরিত করে এবং ইমেজের মান নরমালাইজ করে।

ধাপ ৩: মডেল তৈরি

এখানে আমরা একটি Convolutional Neural Network (CNN) তৈরি করব।

from mxnet.gluon import nn

# CNN মডেল তৈরি করুন
class CNNModel(nn.Block):
    def __init__(self, **kwargs):
        super(CNNModel, self).__init__(**kwargs)
        self.conv1 = nn.Conv2D(32, kernel_size=3, padding=1, activation='relu')
        self.pool1 = nn.MaxPool2D(pool_size=2, strides=2)
        self.conv2 = nn.Conv2D(64, kernel_size=3, padding=1, activation='relu')
        self.pool2 = nn.MaxPool2D(pool_size=2, strides=2)
        self.flatten = nn.Flatten()
        self.fc1 = nn.Dense(128, activation='relu')
        self.fc2 = nn.Dense(10)  # 10 ক্লাসের জন্য আউটপুট

    def forward(self, x):
        x = self.pool1(self.conv1(x))
        x = self.pool2(self.conv2(x))
        x = self.flatten(x)
        x = self.fc1(x)
        return self.fc2(x)

# মডেল ইনস্ট্যান্স তৈরি করুন
net = CNNModel()
net.initialize(mx.init.Xavier())

ব্যাখ্যা:

  • Conv2D: কনভোলিউশনাল লেয়ার যা ইমেজের ফিচার চিহ্নিত করতে সহায়তা করে।
  • MaxPool2D: পুলিং লেয়ার যা ইমেজের আকার ছোট করে ফিচারকে আরও শক্তিশালী করে।
  • Flatten: লেয়ারের আউটপুটকে একক ভেক্টরে রূপান্তরিত করে।
  • Dense: পূর্ণসংযোগিত (fully connected) লেয়ার, আউটপুটে 10টি ক্লাস থাকবে (MNIST এর 0-9 ডিজিটের জন্য)।

ধাপ ৪: প্রশিক্ষণ

এখন আমরা মডেলটি প্রশিক্ষণ করব।

from mxnet import gluon, autograd, nd
from mxnet.gluon import loss as gloss, Trainer

# ক্ষতি (Loss) এবং প্রশিক্ষক (Trainer) সেটআপ
loss_fn = gloss.SoftmaxCrossEntropyLoss()
trainer = Trainer(net.collect_params(), 'adam', {'learning_rate': 0.001})

# প্রশিক্ষণ ফাংশন
epochs = 10
for epoch in range(epochs):
    total_loss = 0
    for data, label in train_loader:
        with autograd.record():
            output = net(data)
            loss = loss_fn(output, label)
        loss.backward()
        trainer.step(data.shape[0])
        total_loss += loss.mean().asscalar()
    
    print(f"Epoch {epoch + 1}, Loss: {total_loss / len(train_loader)}")

ব্যাখ্যা:

  • SoftmaxCrossEntropyLoss ব্যবহার করে লস (loss) গণনা করা হচ্ছে।
  • Trainer ব্যবহার করে Adam অপটিমাইজার ব্যবহার করা হয়েছে।
  • autograd.record() ব্লকের মধ্যে গ্র্যাডিয়েন্ট গণনা করা হয়, এবং trainer.step() এর মাধ্যমে প্যারামিটার আপডেট করা হয়।

ধাপ ৫: মডেল মূল্যায়ন

প্রশিক্ষণ শেষে, আমরা মডেলটি টেস্ট ডেটাসেট দিয়ে মূল্যায়ন করব।

# মডেল মূল্যায়ন
correct = 0
total = 0
for data, label in test_loader:
    output = net(data)
    predictions = nd.argmax(output, axis=1)
    correct += (predictions == label).sum().asscalar()
    total += label.shape[0]

accuracy = correct / total
print(f"Test Accuracy: {accuracy * 100:.2f}%")

ব্যাখ্যা:

  • nd.argmax() ব্যবহার করে আউটপুট থেকে সর্বোচ্চ মান (প্রেডিকশন) নির্বাচন করা হচ্ছে।
  • সঠিক এবং মোট নম্বর গুণে অ্যাকিউরেসি গণনা করা হচ্ছে।

ধাপ ৬: মডেল সংরক্ষণ

প্রশিক্ষিত মডেল সংরক্ষণ করা:

net.save_parameters('mnist_cnn.params')

এবং পরে মডেল পুনরায় লোড করা:

net.load_parameters('mnist_cnn.params')

সারাংশ

এই প্রজেক্টে আমরা MXNet ব্যবহার করে Image Classification তৈরি করেছি। এখানে আমরা:

  • MNIST ডেটাসেট ব্যবহার করেছি।
  • একটি Convolutional Neural Network (CNN) তৈরি করেছি।
  • মডেলটি প্রশিক্ষণ করেছি এবং মূল্যায়ন করেছি।

এই মডেলটি একটি সাধারণ Image Classification প্রজেক্টের উদাহরণ এবং এটি MXNet এর শক্তিশালী Gluon API ব্যবহার করে তৈরি করা হয়েছে।

Content added By
Promotion

Are you sure to start over?

Loading...