Skill

প্র্যাকটিস প্রোজেক্টস

Latest Technologies - টর্চ (Torch)
73
73

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

১. কুকুর এবং বিড়াল শ্রেণীবিভাজন

বিবরণ: কুকুর এবং বিড়ালের ছবি নিয়ে একটি প্রি-ট্রেইন্ড মডেল (যেমন ResNet) ব্যবহার করে ট্রান্সফার লার্নিং প্রয়োগ করে কুকুর এবং বিড়াল শ্রেণীবিভাজন করুন।

  • ডেটাসেট: Kaggle-এ “Dogs vs. Cats” ডেটাসেট ব্যবহার করুন।
  • কাজ: প্রি-ট্রেইন্ড ResNet-50 মডেল ব্যবহার করে শেষ লেয়ার পরিবর্তন করুন এবং নতুন ডেটাসেটে প্রশিক্ষণ দিন।
  • চ্যালেঞ্জ: মডেলটি ওভারফিটিং করছে কিনা তা চেক করতে ড্রপআউট এবং ডেটা অগমেন্টেশন ব্যবহার করুন।

২. হাতের লেখা ডিজিট শ্রেণীবিভাজন (MNIST)

বিবরণ: MNIST ডেটাসেট ব্যবহার করে প্রি-ট্রেইন্ড মডেল দিয়ে হাতের লেখা ডিজিট শনাক্ত করুন।

  • ডেটাসেট: PyTorch-এর torchvision থেকে MNIST ডেটাসেট ব্যবহার করুন।
  • কাজ: একটি সাধারণ Convolutional Neural Network (CNN) ব্যবহার করে মডেল ট্রেনিং করুন, এবং তারপর প্রি-ট্রেইন্ড মডেল ব্যবহার করে এটি ট্রান্সফার লার্নিংয়ের মাধ্যমে আরও উন্নত করুন।
  • চ্যালেঞ্জ: মডেলটির লার্নিং রেট টিউন করুন এবং হাইপারপ্যারামিটার অপ্টিমাইজেশন প্রয়োগ করুন।

৩. ফলের শ্রেণীবিভাজন (Fruit Image Classification)

বিবরণ: ফলের বিভিন্ন প্রকার (যেমন আপেল, কলা, কমলা) শনাক্ত করতে ট্রান্সফার লার্নিং প্রয়োগ করুন।

  • ডেটাসেট: Kaggle-এ “Fruits 360” ডেটাসেট।
  • কাজ: প্রি-ট্রেইন্ড MobileNet বা VGG মডেল ব্যবহার করে ট্রান্সফার লার্নিং প্রয়োগ করুন।
  • চ্যালেঞ্জ: নতুন ফিচার লেয়ার যুক্ত করুন এবং ফাইন-টিউনিং প্রয়োগ করুন।

৪. মুখ শনাক্তকরণ (Facial Expression Recognition)

বিবরণ: মানুষের মুখের বিভিন্ন অভিব্যক্তি (যেমন হাসি, দুঃখ, রাগ) শনাক্ত করার জন্য মডেল তৈরি করুন।

  • ডেটাসেট: Kaggle-এর “FER2013” (Facial Expression Recognition) ডেটাসেট।
  • কাজ: প্রি-ট্রেইন্ড VGG বা ResNet মডেল ব্যবহার করে ট্রান্সফার লার্নিং প্রয়োগ করুন।
  • চ্যালেঞ্জ: মডেল ট্রেনিংয়ে ডেটা অগমেন্টেশন এবং রেগুলারাইজেশন ব্যবহার করে মডেলের পারফরম্যান্স বাড়ান।

৫. ফুলের প্রজাতি শনাক্তকরণ (Flower Classification)

বিবরণ: বিভিন্ন ধরনের ফুল শনাক্ত করতে প্রি-ট্রেইন্ড মডেল ব্যবহার করে মডেল তৈরি করুন।

  • ডেটাসেট: “Oxford 102 Flower Dataset” ব্যবহার করতে পারেন।
  • কাজ: EfficientNet বা ResNet ব্যবহার করে মডেল ট্রেনিং করুন এবং নতুন ফুলের প্রজাতি শনাক্ত করুন।
  • চ্যালেঞ্জ: মডেলের ট্রেনিং গতি বাড়াতে এবং পারফরম্যান্স বাড়াতে GPU এবং CUDA ব্যবহার করুন।

৬. ফ্যাশন আইটেম শ্রেণীবিভাজন (Fashion MNIST)

বিবরণ: ফ্যাশন MNIST ডেটাসেট ব্যবহার করে কাপড়ের বিভিন্ন প্রকার (যেমন জুতো, জামা, ব্যাগ) শ্রেণীবিভাজন করুন।

  • ডেটাসেট: PyTorch-এর torchvision থেকে Fashion MNIST ডেটাসেট ব্যবহার করুন।
  • কাজ: একটি CNN মডেল তৈরি করুন এবং ফাইন-টিউনিং করে মডেলের পারফরম্যান্স বাড়ান।
  • চ্যালেঞ্জ: মডেলটি প্রি-ট্রেইন্ড মডেল ব্যবহার করে ট্রান্সফার লার্নিং প্রয়োগ করুন।

৭. বস্তুর শনাক্তকরণ (Object Detection using YOLO or SSD)

বিবরণ: PyTorch এবং ট্রান্সফার লার্নিং ব্যবহার করে ছবি থেকে বিভিন্ন বস্তু শনাক্ত করার মডেল তৈরি করুন।

  • ডেটাসেট: COCO ডেটাসেট বা Pascal VOC ডেটাসেট।
  • কাজ: প্রি-ট্রেইন্ড YOLO বা SSD মডেল ব্যবহার করে নতুন বস্তুর শনাক্তকরণ প্রশিক্ষণ দিন।
  • চ্যালেঞ্জ: মডেলের পারফরম্যান্স মেট্রিক (যেমন mAP) বিশ্লেষণ করুন এবং ইমেজ অগমেন্টেশন ব্যবহার করে পারফরম্যান্স উন্নত করুন।

৮. ট্রান্সফার লার্নিং ব্যবহার করে ফলের পাকাভাব শনাক্ত করা

বিবরণ: ফলের পাকাভাব (যেমন কাঁচা, আধা-পাকা, পাকা) শনাক্ত করতে মডেল তৈরি করুন।

  • ডেটাসেট: আপনার তৈরি করা কাস্টম ডেটাসেট।
  • কাজ: প্রি-ট্রেইন্ড EfficientNet বা MobileNet মডেল ব্যবহার করে মডেল ট্রেনিং করুন।
  • চ্যালেঞ্জ: ডেটা অগমেন্টেশন এবং টেকনিক্যাল টিউনিং ব্যবহার করে মডেলের দক্ষতা বৃদ্ধি করুন।

৯. ল্যান্ডমার্ক শনাক্তকরণ (Landmark Recognition)

বিবরণ: বিভিন্ন প্রাকৃতিক এবং কৃত্রিম ল্যান্ডমার্ক শনাক্ত করার মডেল তৈরি করুন।

  • ডেটাসেট: Google Landmark Dataset।
  • কাজ: প্রি-ট্রেইন্ড ResNet ব্যবহার করে মডেল ট্রেনিং করুন এবং নতুন টাস্কে ট্রান্সফার লার্নিং প্রয়োগ করুন।
  • চ্যালেঞ্জ: মডেলের ওভারফিটিং প্রতিরোধ করতে বিভিন্ন রেগুলারাইজেশন টেকনিক ব্যবহার করুন।

১০. ইমেজ স্টাইল ট্রান্সফার

বিবরণ: একটি ছবির স্টাইল (যেমন পেইন্টিং বা ফটোগ্রাফ) ট্রান্সফার করে অন্য ছবিতে প্রয়োগ করুন।

  • কাজ: VGG মডেল ব্যবহার করে ইমেজ স্টাইল ট্রান্সফার ইমপ্লিমেন্ট করুন।
  • চ্যালেঞ্জ: বিভিন্ন স্টাইল এবং কন্টেন্ট ওজন সেটিং করে ফলাফল তুলনা করুন।

এই প্রোজেক্টগুলো PyTorch, ট্রান্সফার লার্নিং, এবং প্রি-ট্রেইন্ড মডেলের কনসেপ্ট শেখার জন্য খুবই উপযোগী। এগুলোর মাধ্যমে আপনি মডেল তৈরি, ট্রেনিং, ফাইন-টিউনিং, এবং অপ্টিমাইজেশন সম্পর্কে গভীর জ্ঞান অর্জন করতে পারবেন।

Torch ব্যবহার করে একটি Basic Image Classification মডেল তৈরি করা

69
69

Torch (PyTorch) ব্যবহার করে একটি Basic Image Classification মডেল তৈরি করা সহজ এবং কার্যকর। এখানে আমরা একটি সহজ CNN (Convolutional Neural Network) মডেল তৈরি করব, যা MNIST ডেটাসেট ব্যবহার করে হ্যান্ডরিটেন ডিজিট ক্লাসিফিকেশন করতে সক্ষম হবে।

ধাপসমূহ

লাইব্রেরি ইনস্টল এবং ইম্পোর্ট করা: প্রথমে, PyTorch এবং torchvision লাইব্রেরি ইনস্টল করতে হবে (যদি আগে ইনস্টল না থাকে)।

pip install torch torchvision

MNIST ডেটাসেট লোড করা: torchvision লাইব্রেরি ব্যবহার করে MNIST ডেটাসেট ডাউনলোড এবং লোড করা।

মডেল ডিজাইন করা: একটি সরল CNN মডেল তৈরি করা, যা ইমেজ ফিচার এক্সট্র্যাক্ট করতে এবং ক্লাসিফিকেশন করতে পারবে।

মডেল ট্রেনিং করা: মডেল ট্রেনিং করার জন্য ট্রেনিং লুপ তৈরি করা এবং ভ্যালিডেশন ডেটা ব্যবহার করে মডেলের পারফরম্যান্স যাচাই করা।

পুরো কোড

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# ডিভাইস চেক করা (GPU থাকলে CUDA ব্যবহার করা)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# MNIST ডেটাসেট লোড করার জন্য ট্রান্সফর্মেশন তৈরি
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# ট্রেনিং এবং টেস্ট ডেটাসেট লোড করা
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# CNN মডেল ডিজাইন
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, 10)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.25)
        
    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = self.pool(self.relu(self.conv2(x)))
        x = x.view(-1, 64 * 7 * 7)  # ফ্ল্যাট করা
        x = self.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

# মডেল ইনস্ট্যান্স তৈরি এবং ডিভাইসে সরানো
model = SimpleCNN().to(device)

# লস ফাংশন এবং অপ্টিমাইজার নির্ধারণ
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# ট্রেনিং ফাংশন
def train(model, train_loader, criterion, optimizer, device):
    model.train()
    running_loss = 0.0
    for images, labels in train_loader:
        images, labels = images.to(device), labels.to(device)
        
        optimizer.zero_grad()  # গ্রেডিয়েন্ট রিসেট করা
        outputs = model(images)  # মডেলে ইনপুট প্রয়োগ
        loss = criterion(outputs, labels)  # লস গণনা
        loss.backward()  # ব্যাকপ্রোপাগেশন
        optimizer.step()  # অপ্টিমাইজেশন
        
        running_loss += loss.item()
    return running_loss / len(train_loader)

# এভালুয়েশন ফাংশন
def evaluate(model, test_loader, criterion, device):
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for images, labels in test_loader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    
    accuracy = 100 * correct / total
    return accuracy

# মডেল ট্রেনিং
num_epochs = 10
for epoch in range(num_epochs):
    train_loss = train(model, train_loader, criterion, optimizer, device)
    accuracy = evaluate(model, test_loader, criterion, device)
    print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {train_loss:.4f}, Accuracy: {accuracy:.2f}%")

# মডেল সংরক্ষণ করা
torch.save(model.state_dict(), 'simple_cnn_mnist.pth')

ব্যাখ্যা:

  1. ডেটাসেট এবং ট্রান্সফর্মেশন: MNIST ডেটাসেট লোড করার সময়, আমরা ইমেজগুলোকে টেনসর এবং নর্মালাইজড ফরম্যাটে রূপান্তর করেছি।
  2. মডেল আর্কিটেকচার:
    • মডেলে দুটি কনভোলিউশন লেয়ার (conv1 এবং conv2), একটি ম্যাক্সপুল লেয়ার, এবং দুটি ফFully connected লেয়ার (fc1 এবং fc2) রয়েছে।
    • Dropout লেয়ার ব্যবহার করে ওভারফিটিং কমানো হয়েছে।
  3. ট্রেনিং এবং এভালুয়েশন ফাংশন: মডেল ট্রেনিং করার জন্য আমরা একটি train ফাংশন এবং মডেলের পারফরম্যান্স যাচাই করার জন্য একটি evaluate ফাংশন তৈরি করেছি।
  4. মডেল সংরক্ষণ: ট্রেনিং শেষে মডেলটি 'simple_cnn_mnist.pth' নামে সংরক্ষণ করা হয়েছে।

এই পদ্ধতিতে, আপনি PyTorch ব্যবহার করে একটি Basic Image Classification মডেল তৈরি করতে পারেন। মডেলের আর্কিটেকচার এবং ডেটাসেট পরিবর্তন করে আপনার প্রয়োজন অনুযায়ী আরও উন্নত মডেল তৈরি করা সম্ভব।

Transfer Learning ব্যবহার করে মডেল ট্রেনিং

75
75

Transfer Learning ব্যবহার করে মডেল ট্রেনিং করার জন্য প্রি-ট্রেইন্ড মডেল (যেমন ResNet, VGG, বা MobileNet) ব্যবহার করা হয় এবং এটি নতুন ডেটাসেটে ফাইন-টিউন করা হয়। Transfer Learning মূলত প্রি-ট্রেইন্ড মডেলের ফিচারগুলোকে পুনরায় ব্যবহার করে নতুন ডেটাসেটে মডেলকে ট্রেনিং করে, যা ট্রেনিং টাইম এবং কম্পিউটেশন কমায়। নিচে PyTorch ব্যবহার করে Transfer Learning এর উদাহরণ দেওয়া হয়েছে।

উদাহরণ: Transfer Learning ব্যবহার করে ResNet মডেল ট্রেনিং

১. প্রয়োজনীয় লাইব্রেরি ইম্পোর্ট করা

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, models, transforms
from torch.utils.data import DataLoader

২. ডেটা প্রসেসিং এবং DataLoader তৈরি করা

# ডেটা ট্রান্সফর্মেশন ডিফাইন করা (ইমেজ রিসাইজ এবং নরমালাইজেশন)
transform = transforms.Compose([
    transforms.Resize((224, 224)),  # ইমেজকে 224x224 রিসাইজ করা
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # ImageNet এর জন্য স্ট্যান্ডার্ড নরমালাইজেশন
])

# ট্রেনিং এবং ভ্যালিডেশন ডেটাসেট লোড করা
train_dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
val_dataset = datasets.CIFAR10(root='./data', train=False, transform=transform, download=True)

# DataLoader তৈরি করা
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

৩. প্রি-ট্রেইন্ড মডেল লোড এবং মডিফাই করা

# ডিভাইস সেট করা (GPU থাকলে CUDA, নাহলে CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# প্রি-ট্রেইন্ড ResNet18 মডেল লোড করা
model = models.resnet18(pretrained=True)

# সমস্ত লেয়ারের গ্রেডিয়েন্ট ফ্রিজ করা (Feature Extraction)
for param in model.parameters():
    param.requires_grad = False

# আউটপুট লেয়ার পরিবর্তন করা (CIFAR-10 এ ১০টি ক্লাস আছে)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)

# মডেলকে ডিভাইসে মুভ করা
model = model.to(device)

৪. অপ্টিমাইজার এবং লস ফাংশন সেট করা

# শুধুমাত্র ফাইনাল লেয়ারের প্যারামিটার ট্রেনিং হবে
optimizer = optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9)

# ক্রস এন্ট্রপি লস ফাংশন ব্যবহার করা
criterion = nn.CrossEntropyLoss()

৫. ট্রেনিং লুপ

num_epochs = 5
for epoch in range(num_epochs):
    model.train()  # ট্রেনিং মোডে সেট করা
    running_loss = 0.0
    for images, labels in train_loader:
        images, labels = images.to(device), labels.to(device)
        
        # ফরওয়ার্ড পাস
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # ব্যাকওয়ার্ড পাস এবং অপ্টিমাইজেশন
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
    
    print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}")

৬. ভ্যালিডেশন লুপ

model.eval()  # ইভালুয়েশন মোডে সেট করা
correct = 0
total = 0
with torch.no_grad():
    for images, labels in val_loader:
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

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

ব্যাখ্যা:

প্রি-ট্রেইন্ড মডেল লোড এবং মডিফাই:

  • models.resnet18(pretrained=True) দিয়ে প্রি-ট্রেইন্ড ResNet-18 মডেল লোড করা হয়েছে।
  • মডেলের সব লেয়ারের গ্রেডিয়েন্ট ফ্রিজ করা হয়েছে যাতে শুধু ফাইনাল ক্লাসিফিকেশন লেয়ারটি ট্রেনিং হয়।
  • নতুন ডেটাসেটের সাথে মিলিয়ে ফাইনাল লেয়ারটি পরিবর্তন করা হয়েছে।

অপ্টিমাইজার এবং লস ফাংশন:

  • শুধুমাত্র ফাইনাল লেয়ার ট্রেনিং হচ্ছে, তাই model.fc.parameters() ব্যবহার করে ফাইনাল লেয়ারের প্যারামিটারগুলো অপ্টিমাইজারের সাথে যুক্ত করা হয়েছে।
  • nn.CrossEntropyLoss() ব্যবহার করে লস ফাংশন সেট করা হয়েছে।

ট্রেনিং এবং ভ্যালিডেশন লুপ:

  • ট্রেনিং লুপে মডেলের ফিচার এক্সট্রাকশন লেয়ারগুলো লক থাকছে এবং শুধু ফাইনাল লেয়ার আপডেট হচ্ছে।
  • ভ্যালিডেশন লুপে মডেলকে ইভালুয়েশন মোডে (model.eval()) সেট করা হয় এবং আউটপুটের সাথে আসল লেবেলের মিল চেক করা হয়।

টিপস:

  • Feature Extraction এবং Fine-tuning এর মাধ্যমে মডেল ট্রেনিং দ্রুত করা যায় কারণ প্রি-ট্রেইন্ড মডেলের ফিচারগুলো পুনরায় ব্যবহার করা হয়।
  • মডেল ফাইন-টিউন করতে চাইলে মডেলের নির্দিষ্ট লেয়ারগুলো আনফ্রিজ করা যায়, যেমন: শেষের কিছু কনভলিউশন লেয়ার।

এইভাবে, Transfer Learning ব্যবহার করে দ্রুত এবং কার্যকরভাবে নতুন ডেটাসেটে মডেল ট্রেনিং করা যায়।

Custom Dataset ব্যবহার করে মডেল তৈরি এবং ট্রেনিং

66
66

PyTorch-এ Custom Dataset ব্যবহার করে মডেল তৈরি এবং ট্রেনিং করতে হলে, আমাদের torch.utils.data.Dataset ক্লাসটি ইনহেরিট করে একটি কাস্টম ডেটাসেট ক্লাস তৈরি করতে হবে। এটি আমাদের ডেটাসেটের জন্য ডেটা লোডিং এবং প্রিপ্রসেসিং কাস্টমাইজ করার সুবিধা দেয়। এরপর, DataLoader ব্যবহার করে সেই ডেটাসেটকে ব্যাচ হিসেবে লোড করা যায় এবং মডেল ট্রেনিং করা যায়। নিচে একটি পূর্ণাঙ্গ উদাহরণ দেখানো হলো।

ধাপ ১: Custom Dataset ক্লাস তৈরি করা

আমরা torch.utils.data.Dataset ক্লাস ইনহেরিট করে একটি কাস্টম ডেটাসেট তৈরি করবো, যা ইমেজ ডেটাসেট লোড করবে।

import torch
from torch.utils.data import Dataset
from torchvision import transforms
from PIL import Image
import os

class CustomImageDataset(Dataset):
    def __init__(self, image_dir, transform=None):
        self.image_dir = image_dir
        self.transform = transform
        self.image_names = os.listdir(image_dir)

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

    def __getitem__(self, idx):
        img_name = os.path.join(self.image_dir, self.image_names[idx])
        image = Image.open(img_name).convert('RGB')

        label = 0 if 'cat' in img_name else 1  # ফাইলের নাম দেখে লেবেল নির্ধারণ

        if self.transform:
            image = self.transform(image)

        return image, label

ব্যাখ্যা:

  • __init__: ডেটাসেটের ডিরেক্টরি এবং ট্রান্সফর্ম প্যারামিটার হিসেবে নেওয়া হয়েছে।
  • __len__: ডেটাসেটের সাইজ রিটার্ন করে।
  • __getitem__: ইমেজ এবং লেবেল লোড করে এবং রিটার্ন করে।

ধাপ ২: ডেটা ট্রান্সফর্মেশন এবং DataLoader সেটআপ করা

from torch.utils.data import DataLoader

# ডেটা ট্রান্সফর্ম সেট করা
data_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

# Custom Dataset তৈরি করা
train_dataset = CustomImageDataset(image_dir='data/train', transform=data_transform)
val_dataset = CustomImageDataset(image_dir='data/val', transform=data_transform)

# DataLoader তৈরি করা
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)

ধাপ ৩: মডেল তৈরি এবং GPU তে স্থানান্তর করা

import torch.nn as nn
import torchvision.models as models

# প্রি-ট্রেইনড মডেল লোড করা (ResNet18)
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)  # Cat এবং Dog, দুটি ক্লাস

# মডেলকে GPU তে স্থানান্তর করা
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)

ধাপ ৪: Loss Function এবং Optimizer সেট করা

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

ধাপ ৫: Training এবং Validation Loop

num_epochs = 10

for epoch in range(num_epochs):
    print(f'Epoch {epoch+1}/{num_epochs}')
    print('-' * 10)

    # Training Loop
    model.train()  # মডেলকে ট্রেনিং মোডে সেট করা
    running_loss = 0.0
    running_corrects = 0

    for inputs, labels in train_loader:
        inputs = inputs.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()  # গ্রেডিয়েন্ট রিসেট করা

        # Forward Pass
        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)
        loss = criterion(outputs, labels)

        # Backward Pass এবং Optimizer Step
        loss.backward()
        optimizer.step()

        running_loss += loss.item() * inputs.size(0)
        running_corrects += torch.sum(preds == labels.data)

    epoch_loss = running_loss / len(train_dataset)
    epoch_acc = running_corrects.double() / len(train_dataset)

    print(f'Training Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')

    # Validation Loop
    model.eval()  # মডেলকে ইভ্যালুয়েশন মোডে সেট করা
    val_running_loss = 0.0
    val_running_corrects = 0

    with torch.no_grad():
        for inputs, labels in val_loader:
            inputs = inputs.to(device)
            labels = labels.to(device)

            outputs = model(inputs)
            _, preds = torch.max(outputs, 1)
            loss = criterion(outputs, labels)

            val_running_loss += loss.item() * inputs.size(0)
            val_running_corrects += torch.sum(preds == labels.data)

    val_loss = val_running_loss / len(val_dataset)
    val_acc = val_running_corrects.double() / len(val_dataset)

    print(f'Validation Loss: {val_loss:.4f} Acc: {val_acc:.4f}')

কোডের ব্যাখ্যা:

  1. Custom Dataset: CustomImageDataset ক্লাস ব্যবহার করে ট্রেনিং এবং ভ্যালিডেশন ডেটাসেট লোড করা হয়েছে।
  2. DataLoader: DataLoader দিয়ে ডেটা ব্যাচ আকারে লোড করা হয়েছে।
  3. Model Setup: ResNet18 প্রি-ট্রেইনড মডেল ব্যবহার করে শেষ লেয়ার পরিবর্তন করা হয়েছে।
  4. Training এবং Validation Loop: প্রতিটি epoch-এ ট্রেনিং এবং ভ্যালিডেশন ডেটাসেট দিয়ে মডেল ট্রেনিং এবং মূল্যায়ন করা হয়েছে।

৬. মডেল সংরক্ষণ

torch.save(model.state_dict(), 'custom_model.pth')

এভাবে PyTorch-এ Custom Dataset ব্যবহার করে মডেল তৈরি এবং ট্রেনিং করা যায়। Custom Dataset ক্লাস ব্যবহার করে আমরা যে কোনো ধরনের ডেটা সহজেই লোড এবং প্রিপ্রসেস করতে পারি।

GPU ব্যবহার করে মডেল ট্রেনিং প্রজেক্ট

83
83

GPU ব্যবহার করে মডেল ট্রেনিং প্রজেক্টে আমরা দ্রুত এবং কার্যকরীভাবে মডেল ট্রেনিং করতে পারি, যা বড় ডেটাসেট এবং কমপ্লেক্স মডেলগুলির জন্য গুরুত্বপূর্ণ। এখানে আমরা একটি প্রকল্পের মাধ্যমে GPU ব্যবহার করে একটি মডেল ট্রেনিং এর ধাপ দেখাবো। এই প্রকল্পে, আমরা CIFAR-10 ডেটাসেট ব্যবহার করবো এবং ResNet18 মডেলের মাধ্যমে ইমেজ ক্লাসিফিকেশন করবো।

প্রকল্পের বিবরণ

  • ডেটাসেট: CIFAR-10 (ইমেজ ক্লাসিফিকেশন ডেটাসেট যার ১০টি ক্লাস আছে)
  • প্রি-ট্রেইনড মডেল: ResNet18
  • লক্ষ্য: GPU ব্যবহার করে মডেল ট্রেনিং করা এবং মডেলের পারফরমেন্স যাচাই করা।

ধাপ ১: প্যাকেজ ইমপোর্ট করা

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torchvision import models

ধাপ ২: CUDA ডিভাইস চেক করা

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'Using device: {device}')

ধাপ ৩: ডেটাসেট লোড এবং প্রিপ্রসেসিং

transform = transforms.Compose([
    transforms.Resize((224, 224)),  # ResNet এর জন্য ইমেজ রিসাইজ
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)

test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, transform=transform, download=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

ধাপ ৪: প্রি-ট্রেইনড মডেল লোড এবং কাস্টমাইজ করা

# ResNet18 প্রি-ট্রেইনড মডেল লোড করা
model = models.resnet18(pretrained=True)

# ফিচার লেয়ারগুলো ফ্রিজ করা
for param in model.parameters():
    param.requires_grad = False

# মডেলের শেষ লেয়ার কাস্টমাইজ করা
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)  # CIFAR-10 এর জন্য আউটপুট ক্লাস সংখ্যা ১০

# মডেলকে GPU তে স্থানান্তর করা
model = model.to(device)

ধাপ ৫: লস ফাংশন এবং অপ্টিমাইজার সেট করা

criterion = nn.CrossEntropyLoss()

# শুধুমাত্র শেষ লেয়ার (classifier) ট্রেনিং হবে
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)

ধাপ ৬: মডেল ট্রেনিং ফাংশন তৈরি করা

def train_model(model, train_loader, criterion, optimizer, device, num_epochs=10):
    model.train()
    for epoch in range(num_epochs):
        running_loss = 0.0
        for images, labels in train_loader:
            images, labels = images.to(device), labels.to(device)

            outputs = model(images)
            loss = criterion(outputs, labels)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            running_loss += loss.item()

        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss / len(train_loader):.4f}')

# মডেল ট্রেনিং চালানো
train_model(model, train_loader, criterion, optimizer, device)

ধাপ ৭: মডেল ভ্যালিডেশন ফাংশন তৈরি করা

def validate_model(model, test_loader, criterion, device):
    model.eval()
    correct = 0
    total = 0
    val_loss = 0.0

    with torch.no_grad():
        for images, labels in test_loader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            loss = criterion(outputs, labels)
            val_loss += loss.item()

            _, predicted = torch.max(outputs, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

    accuracy = 100 * correct / total
    print(f'Validation Loss: {val_loss / len(test_loader):.4f}, Accuracy: {accuracy:.2f}%')

# মডেল ভ্যালিডেশন চালানো
validate_model(model, test_loader, criterion, device)

ধাপ ৮: মডেল সেভ করা

torch.save(model.state_dict(), 'resnet18_cifar10_gpu.pth')

ধাপ ৯: মডেল লোড করা এবং ইনফারেন্স

# মডেলের নতুন ইনস্ট্যান্স তৈরি এবং GPU তে স্থানান্তর করা
loaded_model = models.resnet18(pretrained=False)
loaded_model.fc = nn.Linear(num_features, 10)
loaded_model.load_state_dict(torch.load('resnet18_cifar10_gpu.pth'))
loaded_model = loaded_model.to(device)
loaded_model.eval()

# একটি ইমেজে প্রেডিকশন করা
images, labels = next(iter(test_loader))
image = images[0].unsqueeze(0).to(device)

with torch.no_grad():
    output = loaded_model(image)
    _, predicted = torch.max(output, 1)
    print(f'Predicted: {predicted.item()}, Actual: {labels[0].item()}')

প্রকল্পের সংক্ষিপ্ত বিবরণ

  1. ডেটাসেট লোড করা: CIFAR-10 ডেটাসেট ট্রেনিং এবং ভ্যালিডেশন ডেটাসেটে লোড করা হয়েছে।
  2. মডেল কাস্টমাইজেশন: ResNet18 মডেল ব্যবহার করে শেষ লেয়ার কাস্টমাইজ করা হয়েছে যাতে এটি CIFAR-10 ডেটাসেটের জন্য কাজ করে।
  3. ট্রেনিং: GPU তে মডেল ট্রেনিং করা হয়েছে এবং প্রতিটি এপক শেষে ট্রেনিং লস প্রিন্ট করা হয়েছে।
  4. ভ্যালিডেশন: মডেল ভ্যালিডেশন ডেটাসেটে পরীক্ষা করা হয়েছে এবং এক্যুরেসি এবং লস প্রিন্ট করা হয়েছে।
  5. মডেল সেভ এবং লোড: মডেল সংরক্ষণ এবং পুনরায় লোড করা হয়েছে ইনফারেন্সের জন্য।

এই প্রকল্পের মাধ্যমে, আপনি GPU ব্যবহার করে PyTorch-এ কিভাবে মডেল ট্রেনিং করতে হয় তা শিখতে পারবেন এবং মডেলের পারফরমেন্স উন্নত করতে পারবেন।

টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion