Pre-trained মডেল ব্যবহার করে Custom মডেল তৈরি

ট্রান্সফার লার্নিং এবং প্রি-ট্রেইন্ড মডেল - টর্চ (Torch) - Latest Technologies

334

Pre-trained মডেল ব্যবহার করে Custom মডেল তৈরি করা একটি জনপ্রিয় কৌশল যা Transfer Learning নামে পরিচিত। PyTorch-এ Transfer Learning করতে আমরা একটি প্রি-ট্রেইনড মডেল ব্যবহার করি এবং তার উপর ভিত্তি করে নতুন একটি মডেল তৈরি করি। এই পদ্ধতিতে মডেলটি দ্রুত ট্রেনিং হয় এবং সাধারণত ভালো পারফরমেন্স প্রদান করে। নিচে উদাহরণসহ ব্যাখ্যা করা হয়েছে কীভাবে প্রি-ট্রেইনড মডেল ব্যবহার করে Custom মডেল তৈরি করা যায়।

উদাহরণ: ResNet18 ব্যবহার করে Custom মডেল তৈরি করা

আমরা ResNet18 মডেল ব্যবহার করবো, যা ImageNet ডেটাসেটে প্রি-ট্রেইন করা হয়েছে। আমরা এই মডেলের শেষ লেয়ারগুলো কাস্টমাইজ করবো, যাতে এটি আমাদের ডেটাসেট অনুযায়ী কাজ করতে পারে।

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

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}')

ধাপ ৩: ডেটাসেট লোড করা

আমরা একটি কাস্টম ডেটাসেট ব্যবহার করবো (এখানে উদাহরণ হিসেবে CIFAR-10 ডেটাসেট নেওয়া হয়েছে):

transform = transforms.Compose([
    transforms.Resize((224, 224)),  # প্রি-ট্রেইনড মডেল অনুযায়ী ইমেজ রিসাইজ করা
    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(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(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=5):
    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(), 'custom_resnet18_cifar10.pth')

ধাপ ৯: মডেল লোড করা

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

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

  1. প্রি-ট্রেইনড মডেল লোড করা: models.resnet18(pretrained=True) ব্যবহার করে ResNet18 লোড করা হয়েছে।
  2. ফিচার লেয়ারগুলো ফ্রিজ করা: মডেলের পূর্ববর্তী লেয়ারগুলোর ওজন আপডেট করা হবে না।
  3. কাস্টমাইজড লেয়ার: আমরা শেষ (ফুলি কানেক্টেড) লেয়ার পরিবর্তন করেছি যাতে এটি ১০টি ক্লাস প্রেডিক্ট করতে পারে।
  4. ট্রেনিং: শুধুমাত্র কাস্টমাইজড লেয়ার (classifier) ট্রেনিং হয়েছে।
  5. ভ্যালিডেশন: মডেলের পারফরমেন্স ভ্যালিডেশন ডেটাসেটে যাচাই করা হয়েছে।

উপসংহার

Pre-trained মডেল ব্যবহার করে Custom মডেল তৈরি করলে মডেল দ্রুত ট্রেনিং হয় এবং কম ডেটাসেটেও ভালো পারফরমেন্স পাওয়া যায়। Transfer Learning ব্যবহার করে আপনি সহজেই Image Classification, Object Detection, বা অন্যান্য কাজের জন্য কাস্টম মডেল তৈরি করতে পারেন।

Promotion

Are you sure to start over?

Loading...