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 এর মাধ্যমে প্রি-ট্রেইন্ড মডেলকে কাস্টম ডেটাসেটের উপর কাস্টমাইজ এবং ট্রেনিং করা যায়।
Read more