উদাহরণসহ Transfer Learning প্রয়োগ

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

214

Transfer Learning হলো একটি টেকনিক যেখানে একটি প্রি-ট্রেইনড মডেল ব্যবহার করে নতুন ডেটাসেটে মডেলকে ফাইন-টিউন করা হয়। এটি বিশেষ করে সেই পরিস্থিতিতে কার্যকরী যেখানে আমাদের কাছে ডেটা সীমিত পরিমাণে থাকে। PyTorch-এ Transfer Learning সহজে প্রয়োগ করা যায় এবং এটি Image Classification-এর মতো কাজে ব্যাপকভাবে ব্যবহৃত হয়।

উদাহরণ: PyTorch-এ Transfer Learning (Image Classification)

এখানে আমরা PyTorch-এর ResNet18 মডেল ব্যবহার করবো, যা ImageNet ডেটাসেটে প্রি-ট্রেইনড হয়েছে। এরপর আমরা আমাদের নিজস্ব ডেটাসেটে (উদাহরণস্বরূপ, Cats vs. Dogs) ফাইন-টিউন করবো।

1. PyTorch এবং torchvision লাইব্রেরি ইম্পোর্ট করা

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

2. ডেটাসেট প্রস্তুত করা

আমরা torchvision.transforms ব্যবহার করে ডেটা ট্রান্সফর্ম করবো এবং ডেটাসেট লোড করবো:

# ট্রেনিং এবং ভ্যালিডেশন ডেটার জন্য ট্রান্সফর্ম তৈরি করা
data_transforms = {
    'train': transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

# ডেটাসেট লোড করা (উদাহরণস্বরূপ, একটি লোকাল ফোল্ডার থেকে)
data_dir = 'data/cats_and_dogs'
image_datasets = {x: datasets.ImageFolder(root=f'{data_dir}/{x}', transform=data_transforms[x])
                  for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=32, shuffle=True, num_workers=4)
               for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
class_names = image_datasets['train'].classes

3. মডেল লোড করা এবং ফাইন-টিউন করা

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

# লাস্ট লেয়ার পরিবর্তন করা যাতে এটি আমাদের ক্লাস নম্বরের সাথে মিলায় (এখানে ২টি ক্লাস: Cat এবং Dog)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, len(class_names))

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

4. Loss Function এবং Optimizer সেট করা

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

5. Training এবং Validation Loop

num_epochs = 10

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

    # প্রতিটি epoch এর জন্য ট্রেনিং এবং ভ্যালিডেশন লুপ
    for phase in ['train', 'val']:
        if phase == 'train':
            model.train()  # মডেলকে ট্রেনিং মোডে সেট করা
        else:
            model.eval()   # মডেলকে ইভ্যালুয়েশন মোডে সেট করা

        running_loss = 0.0
        running_corrects = 0

        for inputs, labels in dataloaders[phase]:
            inputs = inputs.to(device)
            labels = labels.to(device)

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

            with torch.set_grad_enabled(phase == 'train'):
                outputs = model(inputs)
                _, preds = torch.max(outputs, 1)
                loss = criterion(outputs, labels)

                if phase == 'train':
                    loss.backward()
                    optimizer.step()

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

        epoch_loss = running_loss / dataset_sizes[phase]
        epoch_acc = running_corrects.double() / dataset_sizes[phase]

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

print('Training complete')

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

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

ব্যাখ্যা:

  1. Data Transformation: আমরা ডেটাকে রিসাইজ এবং নরমালাইজ করেছি, কারণ ResNet মডেলটি নির্দিষ্ট সাইজ এবং রেঞ্জের ডেটা আশা করে।
  2. Model Modification: প্রি-ট্রেইনড ResNet18 মডেলের লাস্ট ফুলি কানেক্টেড লেয়ার পরিবর্তন করা হয়েছে যাতে এটি আমাদের ক্লাসের সাথে মিলে যায়।
  3. Training and Validation Loop: প্রতিটি epoch-এ মডেল ট্রেনিং এবং ভ্যালিডেশন করা হয়েছে।
  4. Model Save: ফাইন-টিউন করা মডেল সংরক্ষণ করা হয়েছে।

এভাবে Transfer Learning PyTorch-এ সহজে প্রয়োগ করা যায় এবং এটি সময় বাঁচাতে এবং মডেল পারফর্ম্যান্স উন্নত করতে সহায়ক।

Promotion

Are you sure to start over?

Loading...