কম্পিউটার ভিশন টিউটোরিয়ালের জন্য স্থানান্তর শিক্ষা
এই টিউটোরিয়ালে, আপনি শিখবেন কীভাবে স্থানান্তর শিখন ব্যবহার করে চিত্রের শ্রেণিবিন্যাসের জন্য একটি কনভোলশনাল নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দেওয়া যায়। আপনি সিএস 231 এন নোটে ট্রান্সফার শেখার বিষয়ে আরও পড়তে পারেন
এই নোটগুলি উদ্ধৃত করে,
অনুশীলনে, খুব কম লোকই স্ক্র্যাচ থেকে একটি সম্পূর্ণ কনভলিউশনাল নেটওয়ার্ককে প্রশিক্ষণ দেয় (এলোমেলো সূচনা সহ), কারণ পর্যাপ্ত আকারের ডেটাসেট তুলনামূলকভাবে বিরল। পরিবর্তে, একটি খুব বড় ডেটাসেটে (যেমন ইমেজনেট, যেখানে 1000 টি বিভাগ সহ 1.2 মিলিয়ন চিত্র রয়েছে) একটি কনভনেটকে প্রিট্রেইন করা সাধারণ, এবং তারপরে আগ্রহের কাজটির জন্য কনভনেটটিকে আরম্ভ বা নির্দিষ্ট বৈশিষ্ট্য এক্সট্র্যাক্টর হিসাবে ব্যবহার করুন।
এই দুটি প্রধান স্থানান্তর শিখনের পরিস্থিতি নীচে দেখুন:
- কনফিটকে শেষ করা : এলোমেলো ইনিশিয়ালইয়নটির পরিবর্তে, আমরা ইমেজনেট 1000 ডেটাসেটের প্রশিক্ষণপ্রাপ্ত নেটওয়ার্কের মতো একটি পূর্বনির্ধারিত নেটওয়ার্ক দিয়ে নেটওয়ার্কটি সূচনা করি। বাকি প্রশিক্ষণ যথারীতি দেখায়।
- কনভনেট স্থির বৈশিষ্ট্য নিষ্কর্ষক হিসাবে : এখানে, আমরা চূড়ান্তভাবে সম্পূর্ণরূপে সংযুক্ত স্তর ব্যতীত সমস্ত নেটওয়ার্কের জন্য ওজন হিম করে দেব। এই শেষটি সম্পূর্ণরূপে সংযুক্ত স্তরটি এলোমেলো ওজনের সাথে একটি নতুনের সাথে প্রতিস্থাপন করা হয়েছে এবং কেবল এই স্তরটি প্রশিক্ষিত trained
# License: BSD
# Author: Sasank Chilamkurthy
from __future__ import print_function, division
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy
plt.ion() # interactive mode
লোড তথ্য
ডেটা লোড করার জন্য আমরা টর্চভিশন এবং টর্চ.ইটিলস.ডাটা প্যাকেজ ব্যবহার করব।
আমরা আজ যে সমস্যার সমাধান করতে যাচ্ছি তা হ'ল পিঁপড়া এবং মৌমাছিদের শ্রেণিবদ্ধ করার জন্য একটি মডেলকে প্রশিক্ষণ দেওয়া । আমাদের পিঁপড়া এবং মৌমাছিদের জন্য প্রায় 120 টি প্রশিক্ষণ চিত্র রয়েছে। প্রতিটি শ্রেণীর জন্য 75 টি বৈধতা চিত্র রয়েছে। সাধারণত, স্ক্র্যাচ থেকে প্রশিক্ষিত হলে এটি সাধারণকরণের জন্য খুব ছোট একটি ডেটাসেট। যেহেতু আমরা স্থানান্তর শেখা ব্যবহার করছি, আমাদের যুক্তিসঙ্গতভাবে ভাল করতে সক্ষম হওয়া উচিত।
এই ডেটাসেটটি ইমেজনেটের একটি খুব ছোট উপসেট।
# Data augmentation and normalization for training
# Just normalization for validation
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
data_dir = 'data/hymenoptera_data'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
data_transforms[x])
for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
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
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
কয়েকটি চিত্র ভিজ্যুয়ালাইজ করুন
আসুন কয়েকটি প্রশিক্ষণ চিত্রটি ভিজ্যুয়ালাইজ করা যাক যাতে ডেটা বৃদ্ধিগুলি বোঝা যায়।
def imshow(inp, title=None):
"""Imshow for Tensor."""
inp = inp.numpy().transpose((1, 2, 0))
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
inp = std * inp + mean
inp = np.clip(inp, 0, 1)
plt.imshow(inp)
if title is not None:
plt.title(title)
plt.pause(0.001) # pause a bit so that plots are updated
# Get a batch of training data
inputs, classes = next(iter(dataloaders['train']))
# Make a grid from batch
out = torchvision.utils.make_grid(inputs)
imshow(out, title=[class_names[x] for x in classes])

মডেল প্রশিক্ষণ
এখন, একটি মডেল প্রশিক্ষণ জন্য একটি সাধারণ ফাংশন লিখুন। এখানে, আমরা বর্ণনা করব:
- শেখার হার নির্ধারণ
- সেরা মডেল সংরক্ষণ করা
নিম্নলিখিতটিতে, প্যারামিটারটি
scheduler
একটি এলআর শিডিয়ুলার অবজেক্ট torch.optim.lr_scheduler
।def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
since = time.time()
best_model_wts = copy.deepcopy(model.state_dict())
best_acc = 0.0
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)
# Each epoch has a training and validation phase
for phase in ['train', 'val']:
if phase == 'train':
model.train() # Set model to training mode
else:
model.eval() # Set model to evaluate mode
running_loss = 0.0
running_corrects = 0
# Iterate over data.
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(device)
# zero the parameter gradients
optimizer.zero_grad()
# forward
# track history if only in train
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = criterion(outputs, labels)
# backward + optimize only if in training phase
if phase == 'train':
loss.backward()
optimizer.step()
# statistics
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
if phase == 'train':
scheduler.step()
epoch_loss = running_loss / dataset_sizes[phase]
epoch_acc = running_corrects.double() / dataset_sizes[phase]
print('{} Loss: {:.4f} Acc: {:.4f}'.format(
phase, epoch_loss, epoch_acc))
# deep copy the model
if phase == 'val' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict())
print()
time_elapsed = time.time() - since
print('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60))
print('Best val Acc: {:4f}'.format(best_acc))
# load best model weights
model.load_state_dict(best_model_wts)
return model
মডেল পূর্বাভাস ভিজ্যুয়ালাইজিং
কয়েকটি চিত্রের জন্য পূর্বাভাস প্রদর্শন করার জন্য জেনেরিক ফাংশন
def visualize_model(model, num_images=6):
was_training = model.training
model.eval()
images_so_far = 0
fig = plt.figure()
with torch.no_grad():
for i, (inputs, labels) in enumerate(dataloaders['val']):
inputs = inputs.to(device)
labels = labels.to(device)
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
for j in range(inputs.size()[0]):
images_so_far += 1
ax = plt.subplot(num_images//2, 2, images_so_far)
ax.axis('off')
ax.set_title('predicted: {}'.format(class_names[preds[j]]))
imshow(inputs.cpu().data[j])
if images_so_far == num_images:
model.train(mode=was_training)
return
model.train(mode=was_training)
কনফেটটি শেষ করা হচ্ছে
একটি পূর্বনির্ধারিত মডেল লোড করুন এবং চূড়ান্তভাবে সংযুক্ত স্তরটিকে পুনরায় সেট করুন।
model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
# Here the size of each output sample is set to 2.
# Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)).
model_ft.fc = nn.Linear(num_ftrs, 2)
model_ft = model_ft.to(device)
criterion = nn.CrossEntropyLoss()
# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
প্রশিক্ষণ এবং মূল্যায়ন
এটি সিপিইউতে প্রায় 15-25 মিনিট সময় নেয়। জিপিইউতে যদিও এটি এক মিনিটেরও কম সময় নেয়।
model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
num_epochs=25)
বাইরে:
Epoch 0/24
----------
train Loss: 0.6058 Acc: 0.6926
val Loss: 0.3300 Acc: 0.8562
Epoch 1/24
----------
train Loss: 0.5581 Acc: 0.7951
val Loss: 0.2182 Acc: 0.9216
Epoch 2/24
----------
train Loss: 0.6139 Acc: 0.7746
val Loss: 0.2058 Acc: 0.8954
Epoch 3/24
----------
train Loss: 0.7887 Acc: 0.7295
val Loss: 0.5233 Acc: 0.8235
Epoch 4/24
----------
train Loss: 0.6316 Acc: 0.7459
val Loss: 0.3267 Acc: 0.8758
Epoch 5/24
----------
train Loss: 0.4477 Acc: 0.8320
val Loss: 0.7233 Acc: 0.7059
Epoch 6/24
----------
train Loss: 0.4509 Acc: 0.8074
val Loss: 0.2602 Acc: 0.8954
Epoch 7/24
----------
train Loss: 0.4134 Acc: 0.8320
val Loss: 0.2239 Acc: 0.9020
Epoch 8/24
----------
train Loss: 0.3443 Acc: 0.8770
val Loss: 0.2326 Acc: 0.9216
Epoch 9/24
----------
train Loss: 0.4378 Acc: 0.8033
val Loss: 0.2433 Acc: 0.9085
Epoch 10/24
----------
train Loss: 0.3246 Acc: 0.8648
val Loss: 0.2168 Acc: 0.9020
Epoch 11/24
----------
train Loss: 0.3238 Acc: 0.8402
val Loss: 0.2147 Acc: 0.9150
Epoch 12/24
----------
train Loss: 0.3138 Acc: 0.8607
val Loss: 0.2342 Acc: 0.9085
Epoch 13/24
----------
train Loss: 0.3591 Acc: 0.8361
val Loss: 0.2313 Acc: 0.9150
Epoch 14/24
----------
train Loss: 0.2950 Acc: 0.8689
val Loss: 0.2180 Acc: 0.9216
Epoch 15/24
----------
train Loss: 0.3117 Acc: 0.8566
val Loss: 0.2403 Acc: 0.9085
Epoch 16/24
----------
train Loss: 0.2750 Acc: 0.8975
val Loss: 0.2439 Acc: 0.8954
Epoch 17/24
----------
train Loss: 0.2291 Acc: 0.8934
val Loss: 0.2247 Acc: 0.9150
Epoch 18/24
----------
train Loss: 0.2931 Acc: 0.8811
val Loss: 0.2230 Acc: 0.9085
Epoch 19/24
----------
train Loss: 0.2643 Acc: 0.8852
val Loss: 0.2153 Acc: 0.9150
Epoch 20/24
----------
train Loss: 0.3548 Acc: 0.8238
val Loss: 0.2357 Acc: 0.9020
Epoch 21/24
----------
train Loss: 0.2801 Acc: 0.8811
val Loss: 0.2185 Acc: 0.9216
Epoch 22/24
----------
train Loss: 0.2805 Acc: 0.8770
val Loss: 0.2149 Acc: 0.9150
Epoch 23/24
----------
train Loss: 0.3842 Acc: 0.8115
val Loss: 0.2762 Acc: 0.8824
Epoch 24/24
----------
train Loss: 0.2845 Acc: 0.9057
val Loss: 0.2607 Acc: 0.8889
Training complete in 1m 7s
Best val Acc: 0.921569
visualize_model(model_ft)

স্থির বৈশিষ্ট্য নিষ্কর্ষক হিসাবে কনভনেট
এখানে, আমাদের চূড়ান্ত স্তর বাদে সমস্ত নেটওয়ার্ক হিমায়িত করা দরকার। আমাদের পরামিতিগুলি হিমায়িত করা দরকার যাতে গ্রেডিয়েন্টগুলি গণনা করা যায় না ।
requires_grad == False
backward()
model_conv = torchvision.models.resnet18(pretrained=True)
for param in model_conv.parameters():
param.requires_grad = False
# Parameters of newly constructed modules have requires_grad=True by default
num_ftrs = model_conv.fc.in_features
model_conv.fc = nn.Linear(num_ftrs, 2)
model_conv = model_conv.to(device)
criterion = nn.CrossEntropyLoss()
# Observe that only parameters of final layer are being optimized as
# opposed to before.
optimizer_conv = optim.SGD(model_conv.fc.parameters(), lr=0.001, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)
প্রশিক্ষণ এবং মূল্যায়ন
সিপিইউতে এটি পূর্বের দৃশ্যের তুলনায় প্রায় অর্ধেক সময় নেবে। নেটওয়ার্কের বেশিরভাগ ক্ষেত্রে গ্রেডিয়েন্টগুলি গণনা করার প্রয়োজন নেই বলে এটি প্রত্যাশিত। তবে ফরওয়ার্ডকে গণনা করা দরকার।
model_conv = train_model(model_conv, criterion, optimizer_conv,
exp_lr_scheduler, num_epochs=25)
বাইরে:
Epoch 0/24
----------
train Loss: 0.6016 Acc: 0.6762
val Loss: 0.2380 Acc: 0.9346
Epoch 1/24
----------
train Loss: 0.4235 Acc: 0.8074
val Loss: 0.2046 Acc: 0.9412
Epoch 2/24
----------
train Loss: 0.4564 Acc: 0.7787
val Loss: 0.1783 Acc: 0.9412
Epoch 3/24
----------
train Loss: 0.4698 Acc: 0.7951
val Loss: 0.5537 Acc: 0.8105
Epoch 4/24
----------
train Loss: 0.7760 Acc: 0.7049
val Loss: 0.3698 Acc: 0.8693
Epoch 5/24
----------
train Loss: 0.4807 Acc: 0.8279
val Loss: 0.2668 Acc: 0.9216
Epoch 6/24
----------
train Loss: 0.5025 Acc: 0.7992
val Loss: 0.2190 Acc: 0.9346
Epoch 7/24
----------
train Loss: 0.3814 Acc: 0.8484
val Loss: 0.2321 Acc: 0.9281
Epoch 8/24
----------
train Loss: 0.3904 Acc: 0.8279
val Loss: 0.2060 Acc: 0.9346
Epoch 9/24
----------
train Loss: 0.3969 Acc: 0.8361
val Loss: 0.2436 Acc: 0.9216
Epoch 10/24
----------
train Loss: 0.4967 Acc: 0.7828
val Loss: 0.2125 Acc: 0.9281
Epoch 11/24
----------
train Loss: 0.4055 Acc: 0.8033
val Loss: 0.2194 Acc: 0.9346
Epoch 12/24
----------
train Loss: 0.3649 Acc: 0.8197
val Loss: 0.2244 Acc: 0.9281
Epoch 13/24
----------
train Loss: 0.3417 Acc: 0.8361
val Loss: 0.2407 Acc: 0.9216
Epoch 14/24
----------
train Loss: 0.3859 Acc: 0.8238
val Loss: 0.2343 Acc: 0.9281
Epoch 15/24
----------
train Loss: 0.3363 Acc: 0.8361
val Loss: 0.2485 Acc: 0.9216
Epoch 16/24
----------
train Loss: 0.3739 Acc: 0.8402
val Loss: 0.2638 Acc: 0.9085
Epoch 17/24
----------
train Loss: 0.3253 Acc: 0.8607
val Loss: 0.2151 Acc: 0.9346
Epoch 18/24
----------
train Loss: 0.4170 Acc: 0.8156
val Loss: 0.2205 Acc: 0.9346
Epoch 19/24
----------
train Loss: 0.3054 Acc: 0.8689
val Loss: 0.2296 Acc: 0.9281
Epoch 20/24
----------
train Loss: 0.4219 Acc: 0.8238
val Loss: 0.2101 Acc: 0.9412
Epoch 21/24
----------
train Loss: 0.3205 Acc: 0.8484
val Loss: 0.2517 Acc: 0.9216
Epoch 22/24
----------
train Loss: 0.3488 Acc: 0.8402
val Loss: 0.2266 Acc: 0.9281
Epoch 23/24
----------
train Loss: 0.3217 Acc: 0.8484
val Loss: 0.2160 Acc: 0.9412
Epoch 24/24
----------
train Loss: 0.3245 Acc: 0.8689
val Loss: 0.2256 Acc: 0.9281
Training complete in 0m 34s
Best val Acc: 0.941176
visualize_model(model_conv)
plt.ioff()
plt.show()

স্ক্রিপ্টের মোট চলমান সময়: (1 মিনিট 54.673 সেকেন্ড)
0 comments:
Post a Comment