Feature Extraction এবং Fine-tuning

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

426

PyTorch-এ Feature Extraction এবং Fine-tuning দুটি পদ্ধতি ব্যবহার করা হয় প্রি-ট্রেইন্ড মডেলকে নতুন ডেটাসেটে পুনরায় প্রয়োগ করার জন্য। এটি সাধারণত কম্পিউটার ভিশন, NLP এবং অন্যান্য ডিপ লার্নিং কাজে ব্যবহার করা হয়। PyTorch এর torchvision লাইব্রেরিতে বিভিন্ন প্রি-ট্রেইন্ড মডেল আছে, যেমন: ResNet, VGG, AlexNet, ইত্যাদি, যেগুলো ব্যবহার করা যায়। নিচে উদাহরণসহ এই দুটি পদ্ধতির ব্যাখ্যা দেওয়া হল।

১. Feature Extraction

Feature Extraction-এ প্রি-ট্রেইন্ড মডেলের ওজন (weights) ফ্রিজ করে রাখা হয় এবং নতুন ডেটাসেটের উপর শুধু ক্লাসিফিকেশন লেয়ারগুলো ট্রেনিং করা হয়। মডেলের বাকি অংশগুলো ফিচার এক্সট্রাক্টর হিসেবে কাজ করে।

উদাহরণ: ResNet ব্যবহার করে Feature Extraction

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

# ডিভাইস সেট করা
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# প্রি-ট্রেইন্ড ResNet মডেল লোড করা
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)  # উদাহরণস্বরূপ, এখানে ১০টি ক্লাস ধরেছি

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

# মডেল আউটপুট চেক করা
print(model)

ব্যাখ্যা:

প্রি-ট্রেইন্ড মডেল লোড করা:

  • models.resnet18(pretrained=True) দিয়ে ResNet-18 মডেল লোড করা হয়েছে। pretrained=True দ্বারা ইমেজনেট (ImageNet) ডেটাসেটে প্রি-ট্রেইন্ড ওজন লোড করা হয়েছে।

ওজন ফ্রিজ করা:

  • param.requires_grad = False করে মডেলের সমস্ত লেয়ারের গ্রেডিয়েন্ট ফ্রিজ করা হয়েছে। এর ফলে শুধু নতুন অ্যাডেড লেয়ার ট্রেনিং হবে।

ক্লাসিফিকেশন লেয়ার পরিবর্তন:

  • model.fc = nn.Linear(num_features, 10) দ্বারা ক্লাসিফিকেশন লেয়ার পরিবর্তন করা হয়েছে যাতে এটি নতুন ডেটাসেটের সাথে মিলিয়ে ফাইন-টিউন করা যায়।

২. Fine-tuning

Fine-tuning-এ পুরো মডেল (বা কিছু অংশ) ট্রেনিংয়ে অংশ নেয়। এটি সাধারণত তখনই করা হয় যখন নতুন ডেটাসেট প্রি-ট্রেইন্ড ডেটাসেটের (যেমন ImageNet) থেকে খুব আলাদা হয় এবং মডেলের আরও স্পেসিফিক ফিচার প্রয়োজন হয়।

উদাহরণ: ResNet ব্যবহার করে Fine-tuning

# সমস্ত লেয়ারের গ্রেডিয়েন্ট চালু রাখা (ডিফল্ট)
model = models.resnet18(pretrained=True)

# শেষের ফুলি কানেক্টেড লেয়ার পরিবর্তন করা
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)

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

# অপ্টিমাইজার সেট করা
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# লস ফাংশন সেট করা
criterion = nn.CrossEntropyLoss()

ব্যাখ্যা:

গ্রেডিয়েন্ট চালু রাখা:

  • এই ক্ষেত্রে, মডেলের সব লেয়ারের গ্রেডিয়েন্ট চালু রাখা হয়েছে যাতে মডেলের প্রতিটি লেয়ার ট্রেনিং প্রক্রিয়ায় অংশগ্রহণ করতে পারে।

অপ্টিমাইজার সেট করা:

  • torch.optim.SGD ব্যবহার করে SGD অপ্টিমাইজার তৈরি করা হয়েছে, যা মডেলের সব লেয়ারের ওজন আপডেট করবে।

টিপস:

  • Feature Extraction দ্রুত এবং কম্পিউটেশনালি সস্তা কারণ এটি কম ওজন ট্রেন করে। যখন আপনার ডেটাসেট ছোট হয় এবং মূল ডেটাসেটের (যেমন ImageNet) সাথে মিলে, তখন এটি ব্যবহার করা ভালো।
  • Fine-tuning মডেলের ক্ষমতা বাড়াতে পারে, কিন্তু বেশি সময় নেয়। যদি আপনার ডেটাসেট বড় হয় বা আলাদা হয়, তাহলে Fine-tuning ব্যবহার করা যায়।

ট্রেনিং লুপ উদাহরণ

num_epochs = 5
for epoch in range(num_epochs):
    model.train()  # ট্রেনিং মোডে সেট করা
    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()
        
    print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")

এইভাবে, Feature Extraction এবং Fine-tuning এর মাধ্যমে প্রি-ট্রেইন্ড মডেলকে কাস্টম ডেটাসেটের উপর কাস্টমাইজ এবং ট্রেনিং করা যায়।

Promotion

Are you sure to start over?

Loading...