
এই টিউটোরিয়ালে, আপনি শিখবেন কীভাবে স্থানিক ট্রান্সফরমার নেটওয়ার্ক নামে একটি ভিজ্যুয়াল মনোযোগ ব্যবস্থা ব্যবহার করে আপনার নেটওয়ার্ককে বাড়ানো যায়। আপনি ডিপমাইন্ড পেপারে স্থানিক ট্রান্সফরমার নেটওয়ার্কগুলি সম্পর্কে আরও পড়তে পারেন
স্পেসিয়াল ট্রান্সফরমার নেটওয়ার্কগুলি কোনও স্থানিক রূপান্তরের দিকে স্বতন্ত্র মনোযোগের একটি সাধারণীকরণ। স্পেসিয়াল ট্রান্সফর্মার নেটওয়ার্কগুলি (সংক্ষেপে এসটিএন) মডেলটির জ্যামিতিক আগ্রাসন বাড়ানোর জন্য একটি নিউরাল নেটওয়ার্ককে কীভাবে ইনপুট চিত্রটিতে স্থানিক রূপান্তর করতে হয় তা শিখতে দেয়। উদাহরণস্বরূপ, এটি আগ্রহের একটি অঞ্চল ক্রপ করতে পারে, কোনও চিত্রের অভিযোজনকে স্কেল করে এবং সংশোধন করতে পারে। এটি একটি কার্যকর প্রক্রিয়া হতে পারে কারণ সিএনএনগুলি ঘূর্ণন এবং স্কেল এবং আরও সাধারণ সাধারণ অ্যাফাইন ট্রান্সফর্মেশনগুলিতে অদ্বিতীয় নয়।
এসটিএন সম্পর্কে সেরা জিনিসগুলির মধ্যে একটি হ'ল খুব অল্প সংশোধন করে কেবল যে কোনও বিদ্যমান সিএনএন-এ এটি প্লাগ করার ক্ষমতা।
# License: BSD
# Author: Ghassen Hamrouni
from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
import numpy as np
plt.ion() # interactive mode
ডেটা লোড হচ্ছে
এই পোস্টে আমরা ক্লাসিক এমএনআইএসটি ডেটাসেট নিয়ে পরীক্ষা করি। একটি স্থানিক ট্রান্সফরমার নেটওয়ার্কের সাথে বাড়ানো একটি মানক কনভোলশনাল নেটওয়ার্ক ব্যবহার করা।
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Training dataset
train_loader = torch.utils.data.DataLoader(
datasets.MNIST(root='.', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])), batch_size=64, shuffle=True, num_workers=4)
# Test dataset
test_loader = torch.utils.data.DataLoader(
datasets.MNIST(root='.', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])), batch_size=64, shuffle=True, num_workers=4)
বাইরে:
Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to ./MNIST/raw/train-images-idx3-ubyte.gz
Extracting ./MNIST/raw/train-images-idx3-ubyte.gz to ./MNIST/raw
Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to ./MNIST/raw/train-labels-idx1-ubyte.gz
Extracting ./MNIST/raw/train-labels-idx1-ubyte.gz to ./MNIST/raw
Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to ./MNIST/raw/t10k-images-idx3-ubyte.gz
Extracting ./MNIST/raw/t10k-images-idx3-ubyte.gz to ./MNIST/raw
Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to ./MNIST/raw/t10k-labels-idx1-ubyte.gz
Extracting ./MNIST/raw/t10k-labels-idx1-ubyte.gz to ./MNIST/raw
Processing...
Done!
স্থানিক ট্রান্সফরমার নেটওয়ার্কগুলি চিত্রিত করা হচ্ছে
স্থানিক ট্রান্সফর্মার নেটওয়ার্কগুলি তিনটি প্রধান উপাদান থেকে ফোটে:
- স্থানীয়করণ নেটওয়ার্ক হ'ল একটি নিয়মিত সিএনএন যা রূপান্তরের পরামিতিগুলিকে সরিয়ে দেয়। রূপান্তরটি এই ডেটাসেট থেকে কখনই স্পষ্টভাবে শিখে নেওয়া যায় না, পরিবর্তে নেটওয়ার্ক স্বয়ংক্রিয়ভাবে স্থানিক রূপান্তরগুলি শিখবে যা বিশ্বব্যাপী নির্ভুলতা বাড়ায়।
- গ্রিড জেনারেটর আউটপুট চিত্র থেকে প্রতিটি পিক্সেলের সাথে সম্পর্কিত ইনপুট চিত্রের স্থানাঙ্কের একটি গ্রিড উত্পন্ন করে।
- স্যাম্পলারটি রূপান্তরটির পরামিতিগুলি ব্যবহার করে এবং এটি ইনপুট চিত্রটিতে প্রয়োগ করে।

বিঃদ্রঃ
আমাদের পাইটর্চের সর্বশেষতম সংস্করণ দরকার যাটিতে affine_grid এবং grid_sample মডিউল রয়েছে।
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
# Spatial transformer localization-network
self.localization = nn.Sequential(
nn.Conv2d(1, 8, kernel_size=7),
nn.MaxPool2d(2, stride=2),
nn.ReLU(True),
nn.Conv2d(8, 10, kernel_size=5),
nn.MaxPool2d(2, stride=2),
nn.ReLU(True)
)
# Regressor for the 3 * 2 affine matrix
self.fc_loc = nn.Sequential(
nn.Linear(10 * 3 * 3, 32),
nn.ReLU(True),
nn.Linear(32, 3 * 2)
)
# Initialize the weights/bias with identity transformation
self.fc_loc[2].weight.data.zero_()
self.fc_loc[2].bias.data.copy_(torch.tensor([1, 0, 0, 0, 1, 0], dtype=torch.float))
# Spatial transformer network forward function
def stn(self, x):
xs = self.localization(x)
xs = xs.view(-1, 10 * 3 * 3)
theta = self.fc_loc(xs)
theta = theta.view(-1, 2, 3)
grid = F.affine_grid(theta, x.size())
x = F.grid_sample(x, grid)
return x
def forward(self, x):
# transform the input
x = self.stn(x)
# Perform the usual forward pass
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x, dim=1)
model = Net().to(device)
মডেল প্রশিক্ষণ
এখন, মডেলটি প্রশিক্ষণের জন্য এসজিডি অ্যালগরিদম ব্যবহার করা যাক। নেটওয়ার্কটি তদারকি করা উপায়ে শ্রেণিবিন্যাসের কাজটি শিখছে। একই সময়ে মডেলটি একটি শেষ থেকে শেষ ফ্যাশনে স্বয়ংক্রিয়ভাবে এসটিএন শিখছে।
optimizer = optim.SGD(model.parameters(), lr=0.01)
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % 500 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
#
# A simple test procedure to measure STN the performances on MNIST.
#
def test():
with torch.no_grad():
model.eval()
test_loss = 0
correct = 0
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
# sum up batch loss
test_loss += F.nll_loss(output, target, size_average=False).item()
# get the index of the max log-probability
pred = output.max(1, keepdim=True)[1]
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'
.format(test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
এসটিএন ফলাফল দেখার জন্য
এখন, আমরা আমাদের শিখে নেওয়া চাক্ষুষ মনোযোগ ব্যবস্থাটির ফলাফলগুলি পরিদর্শন করব।
প্রশিক্ষণের সময় রূপান্তরগুলি কল্পনা করতে আমরা একটি ছোট সহায়ক সাহায্যকারী ফাংশন সংজ্ঞায়িত করি।
def convert_image_np(inp):
"""Convert a Tensor to numpy image."""
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)
return inp
# We want to visualize the output of the spatial transformers layer
# after the training, we visualize a batch of input images and
# the corresponding transformed batch using STN.
def visualize_stn():
with torch.no_grad():
# Get a batch of training data
data = next(iter(test_loader))[0].to(device)
input_tensor = data.cpu()
transformed_input_tensor = model.stn(data).cpu()
in_grid = convert_image_np(
torchvision.utils.make_grid(input_tensor))
out_grid = convert_image_np(
torchvision.utils.make_grid(transformed_input_tensor))
# Plot the results side-by-side
f, axarr = plt.subplots(1, 2)
axarr[0].imshow(in_grid)
axarr[0].set_title('Dataset Images')
axarr[1].imshow(out_grid)
axarr[1].set_title('Transformed Images')
for epoch in range(1, 20 + 1):
train(epoch)
test()
# Visualize the STN transformation on some input batch
visualize_stn()
plt.ioff()
plt.show()

বাইরে:
Train Epoch: 1 [0/60000 (0%)] Loss: 2.319473
Train Epoch: 1 [32000/60000 (53%)] Loss: 0.717421
Test set: Average loss: 0.2221, Accuracy: 9353/10000 (94%)
Train Epoch: 2 [0/60000 (0%)] Loss: 0.519983
Train Epoch: 2 [32000/60000 (53%)] Loss: 0.342855
Test set: Average loss: 0.0885, Accuracy: 9735/10000 (97%)
Train Epoch: 3 [0/60000 (0%)] Loss: 0.282961
Train Epoch: 3 [32000/60000 (53%)] Loss: 0.348369
Test set: Average loss: 0.0897, Accuracy: 9724/10000 (97%)
Train Epoch: 4 [0/60000 (0%)] Loss: 0.240569
Train Epoch: 4 [32000/60000 (53%)] Loss: 0.165905
Test set: Average loss: 0.0590, Accuracy: 9821/10000 (98%)
Train Epoch: 5 [0/60000 (0%)] Loss: 0.132893
Train Epoch: 5 [32000/60000 (53%)] Loss: 0.090726
Test set: Average loss: 0.0673, Accuracy: 9797/10000 (98%)
Train Epoch: 6 [0/60000 (0%)] Loss: 0.395699
Train Epoch: 6 [32000/60000 (53%)] Loss: 0.126218
Test set: Average loss: 0.0867, Accuracy: 9725/10000 (97%)
Train Epoch: 7 [0/60000 (0%)] Loss: 0.299036
Train Epoch: 7 [32000/60000 (53%)] Loss: 0.291607
Test set: Average loss: 0.0443, Accuracy: 9856/10000 (99%)
Train Epoch: 8 [0/60000 (0%)] Loss: 0.139137
Train Epoch: 8 [32000/60000 (53%)] Loss: 0.159663
Test set: Average loss: 0.0407, Accuracy: 9866/10000 (99%)
Train Epoch: 9 [0/60000 (0%)] Loss: 0.170520
Train Epoch: 9 [32000/60000 (53%)] Loss: 0.152838
Test set: Average loss: 0.0425, Accuracy: 9867/10000 (99%)
Train Epoch: 10 [0/60000 (0%)] Loss: 0.135774
Train Epoch: 10 [32000/60000 (53%)] Loss: 0.163002
Test set: Average loss: 0.0513, Accuracy: 9856/10000 (99%)
Train Epoch: 11 [0/60000 (0%)] Loss: 0.083965
Train Epoch: 11 [32000/60000 (53%)] Loss: 0.056999
Test set: Average loss: 0.0442, Accuracy: 9861/10000 (99%)
Train Epoch: 12 [0/60000 (0%)] Loss: 0.118292
Train Epoch: 12 [32000/60000 (53%)] Loss: 0.068524
Test set: Average loss: 0.0459, Accuracy: 9873/10000 (99%)
Train Epoch: 13 [0/60000 (0%)] Loss: 0.269368
Train Epoch: 13 [32000/60000 (53%)] Loss: 0.092706
Test set: Average loss: 0.0390, Accuracy: 9879/10000 (99%)
Train Epoch: 14 [0/60000 (0%)] Loss: 0.143967
Train Epoch: 14 [32000/60000 (53%)] Loss: 0.063184
Test set: Average loss: 0.0373, Accuracy: 9887/10000 (99%)
Train Epoch: 15 [0/60000 (0%)] Loss: 0.040783
Train Epoch: 15 [32000/60000 (53%)] Loss: 0.123315
Test set: Average loss: 0.0443, Accuracy: 9854/10000 (99%)
Train Epoch: 16 [0/60000 (0%)] Loss: 0.125811
Train Epoch: 16 [32000/60000 (53%)] Loss: 0.020368
Test set: Average loss: 0.0341, Accuracy: 9900/10000 (99%)
Train Epoch: 17 [0/60000 (0%)] Loss: 0.101430
Train Epoch: 17 [32000/60000 (53%)] Loss: 0.614333
Test set: Average loss: 0.0367, Accuracy: 9878/10000 (99%)
Train Epoch: 18 [0/60000 (0%)] Loss: 0.191310
Train Epoch: 18 [32000/60000 (53%)] Loss: 0.049821
Test set: Average loss: 0.0301, Accuracy: 9907/10000 (99%)
Train Epoch: 19 [0/60000 (0%)] Loss: 0.114177
Train Epoch: 19 [32000/60000 (53%)] Loss: 0.069911
Test set: Average loss: 0.0339, Accuracy: 9898/10000 (99%)
Train Epoch: 20 [0/60000 (0%)] Loss: 0.068934
Train Epoch: 20 [32000/60000 (53%)] Loss: 0.055552
Test set: Average loss: 0.0385, Accuracy: 9886/10000 (99%)
স্ক্রিপ্টের মোট চলমান সময়: (2 মিনিট 38.504 সেকেন্ড)
0 comments:
Post a Comment