Machine Learning Custom Dataset তৈরির পদ্ধতি গাইড ও নোট

383

Custom Dataset তৈরির পদ্ধতি আপনার ডিপ লার্নিং মডেল তৈরির একটি গুরুত্বপূর্ণ অংশ, যেখানে আপনার নিজস্ব ডেটাসেট ব্যবহার করে মডেল প্রশিক্ষণ করা হয়। MXNet একটি সহজ এবং কার্যকরী উপায়ে কাস্টম ডেটাসেট তৈরি এবং তার উপর কাজ করার সুবিধা প্রদান করে। এখানে, Custom Dataset তৈরি এবং তা MXNet ব্যবহার করে প্রশিক্ষণ করার জন্য একটি বিস্তারিত গাইড দেওয়া হলো।


১. Custom Dataset তৈরির জন্য প্রস্তুতি

প্রথমেই, আপনার ডেটাসেটের জন্য একটি কাঠামো তৈরি করতে হবে। আপনি সাধারণত ইমেজ ডেটাসেট, টেক্সট ডেটাসেট, অথবা নমেরিক ডেটাসেট ব্যবহার করতে পারেন।

  1. ইমেজ ডেটাসেট: ইমেজ ক্লাসিফিকেশন, অবজেক্ট ডিটেকশন, সেগমেন্টেশন ইত্যাদি কাজের জন্য।
  2. টেক্সট ডেটাসেট: ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং (NLP) কাজের জন্য।
  3. নমেরিক ডেটাসেট: রিগ্রেশন এবং ক্লাসিফিকেশন কাজে ব্যবহার করা হয়।

ধরা যাক, আপনি একটি ইমেজ ক্লাসিফিকেশন ডেটাসেট তৈরি করতে চান, যেখানে ডেটা বিভিন্ন ফোল্ডারে শ্রেণীভুক্ত করা থাকবে। যেমন:

/data
    /train
        /class_1
            image1.jpg
            image2.jpg
            ...
        /class_2
            image1.jpg
            image2.jpg
            ...
    /test
        /class_1
            image1.jpg
            image2.jpg
            ...
        /class_2
            image1.jpg
            image2.jpg
            ...

২. MXNet-এর ImageRecordDataset ব্যবহার

MXNet-এর ImageRecordDataset ক্লাসটি কাস্টম ডেটাসেট লোড করার জন্য ব্যবহার করা যেতে পারে, তবে প্রথমে আপনাকে ডেটাসেটটিকে RecordIO ফরম্যাটে রূপান্তর করতে হবে।

2.1 RecordIO ফরম্যাটে ডেটাসেট রূপান্তর

MXNet ডেটাসেট লোড করার জন্য RecordIO ফরম্যাট ব্যবহার করে থাকে, যা একটি দ্রুত ডেটা লোডিং মেথড। এর মাধ্যমে আপনি দ্রুত বড় ডেটাসেট ট্রেনিং করতে পারেন।

RecordIO ফরম্যাটে ডেটাসেট রূপান্তর করতে:

  1. mx.io.ImageRecordIter ব্যবহার করে ইমেজ ডেটাসেট লোড করুন।
  2. ডেটাসেটটি *.rec ফাইল ফরম্যাটে সংরক্ষণ করুন।
import mxnet as mx
from mxnet import image
import os

def create_recordio_from_image_folder(image_folder, rec_file):
    img_list = []
    for class_name in os.listdir(image_folder):
        class_folder = os.path.join(image_folder, class_name)
        if os.path.isdir(class_folder):
            for img_name in os.listdir(class_folder):
                if img_name.endswith(".jpg"):
                    img_path = os.path.join(class_folder, img_name)
                    img_list.append((img_path, class_name))
    
    # Write to RecordIO format
    writer = mx.recordio.MXRecordIO(rec_file, 'w')
    for img_path, label in img_list:
        img = image.imread(img_path)
        label = int(label)
        writer.write(mx.recordio.pack_img(img, label))
    writer.close()
    
create_recordio_from_image_folder("/data/train", "/data/train.rec")

2.2 ImageRecordDataset ক্লাস ব্যবহার করে ডেটাসেট লোড

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

from mxnet import io

# RecordIO ফাইল লোড
train_iter = mx.io.ImageRecordIter(
    path_imgrec = '/data/train.rec',
    data_shape = (3, 224, 224),  # RGB ইমেজ এবং 224x224 সাইজ
    batch_size = 32,
    shuffle = True,
    label_width = 1  # লেবেল একমাত্র কলামে
)

এখানে, data_shape নির্ধারণ করছে ইমেজের আকার এবং চ্যানেল সংখ্যা (এটি RGB চিত্রের জন্য (3, 224, 224) হতে পারে)। batch_size হলো এক্সিকিউশনের জন্য নির্বাচিত ব্যাচের আকার এবং label_width লেবেলটির আকার।


৩. কাস্টম Dataset ক্লাস তৈরি

MXNet-এর Dataset ক্লাসের মাধ্যমে আপনি কাস্টম ডেটাসেটও তৈরি করতে পারেন। এটি অনেক বেশি নমনীয় এবং ব্যবহারকারী নির্ধারিত পদ্ধতিতে ডেটা লোড করার সুবিধা দেয়।

এখানে একটি কাস্টম Dataset ক্লাস তৈরি করার উদাহরণ দেওয়া হলো:

import mxnet as mx
from mxnet.gluon.data import Dataset
import os
from PIL import Image
import numpy as np

class CustomDataset(Dataset):
    def __init__(self, data_dir, transform=None):
        self.data_dir = data_dir
        self.transform = transform
        self.img_paths = []
        self.labels = []
        
        # ডেটাসেট থেকে ছবি এবং লেবেল গুলো লোড করা
        for label, class_name in enumerate(os.listdir(data_dir)):
            class_folder = os.path.join(data_dir, class_name)
            if os.path.isdir(class_folder):
                for img_name in os.listdir(class_folder):
                    if img_name.endswith('.jpg'):
                        self.img_paths.append(os.path.join(class_folder, img_name))
                        self.labels.append(label)

    def __len__(self):
        return len(self.img_paths)

    def __getitem__(self, idx):
        img_path = self.img_paths[idx]
        label = self.labels[idx]
        
        # ইমেজ লোড করা
        img = Image.open(img_path)
        img = img.convert('RGB')
        
        # ট্রান্সফর্ম প্রয়োগ করা (যদি থাকে)
        if self.transform:
            img = self.transform(img)
        
        return np.array(img), label

# কাস্টম ডেটাসেট তৈরি করা
dataset = CustomDataset("/data/train")

# ডেটাসেট থেকে এক্সাম্পল নেওয়া
img, label = dataset[0]
print(img.shape, label)

এখানে CustomDataset একটি কাস্টম ডেটাসেট ক্লাস যা ইমেজ ফোল্ডার থেকে ছবি এবং লেবেল লোড করবে। আপনি চাইলে transform প্যারামিটার ব্যবহার করে ডেটাসেটের উপর যেকোনো প্রি-প্রসেসিং বা ট্রান্সফর্মেশন প্রয়োগ করতে পারেন।


৪. DataLoader (Batching) এবং প্রশিক্ষণ

MXNet-এর Gluon API ব্যবহার করে ডেটাসেটের উপর ব্যাচিং করতে পারেন এবং মডেল ট্রেনিং শুরু করতে পারেন:

from mxnet.gluon.data import DataLoader
from mxnet.gluon import nn
from mxnet import autograd, gluon, nd
import mxnet as mx

# ডেটাসেটের জন্য DataLoader তৈরি
batch_size = 32
train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# মডেল নির্মাণ
net = nn.Sequential()
net.add(nn.Conv2D(32, kernel_size=3, activation='relu'))
net.add(nn.MaxPool2D(pool_size=2))
net.add(nn.Dense(64, activation='relu'))
net.add(nn.Dense(10))  # 10 ক্লাসের জন্য

# প্রশিক্ষণের জন্য প্রস্তুতি
net.initialize(mx.init.Xavier(), ctx=mx.cpu())
trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate': 0.001})
loss_fn = gluon.loss.SoftmaxCrossEntropyLoss()

# প্রশিক্ষণ লুপ
for epoch in range(10):
    for data, label in train_loader:
        data = nd.array(data)
        label = nd.array(label)
        
        with autograd.record():
            output = net(data)
            loss = loss_fn(output, label)
        
        loss.backward()
        trainer.step(batch_size)
    print(f"Epoch {epoch + 1}, Loss: {loss.mean().asscalar()}")

এখানে:

  • DataLoader: ব্যাচের আকারে ডেটা লোড করে।
  • Trainer: মডেল প্রশিক্ষণ পরিচালনা করে।
  • Loss Function: SoftmaxCrossEntropyLoss ব্যবহৃত হয়েছে ক্লাসিফিকেশন সমস্যা সমাধানের জন্য।

সারাংশ

  • Custom Dataset তৈরি করার জন্য প্রথমে আপনার ডেটাকে সঠিক ফরম্যাটে সাজানো প্রয়োজন। সাধারণত, ইমেজ ডেটাসেটের জন্য ফোল্ডার ভিত্তিক শ্রেণীবিভাগ করা হয়।
  • MXNet-এর ImageRecordIter বা CustomDataset ক্লাস ব্যবহার করে আপনি কাস্টম ডেটাসেট তৈরি করতে পারেন এবং তা ট্রেনিংয়ের জন্য ব্যবহার করতে পারেন।
  • Gluon DataLoader ব্যবহার করে আপনি ব্যাচিং এবং প্রশিক্ষণের জন্য ডেটাসেট ল

োড করতে পারেন।

এই পদ্ধতিগুলি আপনাকে আপনার নিজস্ব ডেটাসেট তৈরি এবং প্রশিক্ষণ করার জন্য একটি শক্তিশালী টুলসেট প্রদান করে।

Content added By
Promotion

Are you sure to start over?

Loading...