In [1]:
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as dsets
from torch.autograd import Variable
In [2]:
#LOADING DATASET
train_dataset = dsets.MNIST(root='./data',
train=True,
transform=transforms.ToTensor(),
download=True)
test_dataset = dsets.MNIST(root='./data',
train=False,
transform=transforms.ToTensor())
In [3]:
#MAKING DATASET ITERABLE
batch_size = 100
n_iters = 3000
num_epochs = n_iters // (len(train_dataset) // batch_size)
all_loss = []
all_accuracy = []
## From The Docs...
In [4]:
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)
In [5]:
#CREATE THE CLASS
class LogisticRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
super(LogisticRegressionModel, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
out = self.linear(x)
return out
In [6]:
input_dim = 28*28
output_dim = 10
model = LogisticRegressionModel(input_dim, output_dim)
# USE GPU FOR MODEL
if torch.cuda.is_available():
model.cuda()
print("Running On GPU")
#LOSS CLASS
criterion = nn.CrossEntropyLoss()
#OPTIMIZER CLASS
learning_rate = 0.001
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
In [7]:
#TRAIN THE MODEL
iter = 0
%timeit
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# USE GPU FOR MODEL
if torch.cuda.is_available():
images = Variable(images.view(-1, 28*28).cuda())
labels = Variable(labels.cuda())
else:
images = Variable(images.view(-1, 28*28))
labels = Variable(labels)
# Clear gradients w.r.t. parameters
optimizer.zero_grad()
# Forward pass to get output/logits
outputs = model(images)
# Calculate Loss: softmax --> cross entropy loss
loss = criterion(outputs, labels)
# Getting gradients w.r.t. parameters
loss.backward()
# Updating parameters
optimizer.step()
iter += 1
if iter % 500 == 0:
# Calculate Accuracy
correct = 0
total = 0
# Iterate through test dataset
for images, labels in test_loader:
# USE GPU FOR MODEL #
images = Variable(images.view(-1, 28*28).cuda())
# Forward pass only to get logits/output
outputs = model(images)
# Get predictions from the maximum value
_, predicted = torch.max(outputs.data, 1)
# Total number of labels
total += labels.size(0)
# USE GPU FOR MODEL #
# Total correct predictions
correct += (predicted.cpu() == labels.cpu()).sum()
accuracy = 100 * correct / total
all_loss.append(loss.data[0])
all_accuracy.append(accuracy)
# Print Loss
print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.data[0], accuracy))
In [8]:
all_loss , all_accuracy
Out[8]:
In [9]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.title(s = 'Loss And Accuracy')
plt.xlabel('Accuracy')
plt.ylabel('Loss')
plt.plot(all_accuracy, all_loss)
Out[9]:
In [10]:
class FeedforwardNeuralNetModel(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(FeedforwardNeuralNetModel, self).__init__()
# Linear function 1: 784 --> 100
self.fc1 = nn.Linear(input_dim, hidden_dim)
# Non-linearity 1
self.relu1 = nn.ReLU()
# Linear function 2: 100 --> 100
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
# Non-linearity 2
self.relu2 = nn.ReLU()
# Linear function 3: 100 --> 64
self.fc3 = nn.Linear(hidden_dim, 64)
# Non-linearity 3
self.relu3 = nn.ReLU()
# Linear function 4 (readout): 64 --> 10
self.fc4 = nn.Linear(64, output_dim)
def forward(self, x):
# Linear function 1
out = self.fc1(x)
# Non-linearity 1
out = self.relu1(out)
# Linear function 2
out = self.fc2(out)
# Non-linearity 2
out = self.relu2(out)
# Linear function 2
out = self.fc3(out)
# Non-linearity 2
out = self.relu3(out)
# Linear function 4 (readout)
out = self.fc4(out)
return out
In [11]:
input_dim = 28*28
hidden_dim = 100
output_dim = 10
model_nn = FeedforwardNeuralNetModel(input_dim, hidden_dim, output_dim)
In [12]:
model_nn.parameters
Out[12]:
In [13]:
if torch.cuda.is_available():
model_nn.cuda()
criterion = nn.CrossEntropyLoss()
learning_rate = 0.1
optimizer = torch.optim.SGD(model_nn.parameters(), lr=learning_rate)
In [14]:
iter = 0
all_accuracy = []
all_loss = []
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
if torch.cuda.is_available():
images = Variable(images.view(-1, 28*28).cuda())
labels = Variable(labels.cuda())
else:
images = Variable(images.view(-1, 28*28))
labels = Variable(labels)
# Clear gradients w.r.t. parameters
optimizer.zero_grad()
# Forward pass to get output/logits
outputs = model_nn(images)
# Calculate Loss: softmax --> cross entropy loss
loss = criterion(outputs, labels)
# Getting gradients w.r.t. parameters
loss.backward()
# Updating parameters
optimizer.step()
iter += 1
if iter % 500 == 0:
# Calculate Accuracy
correct = 0
total = 0
# Iterate through test dataset
for images, labels in test_loader:
images = Variable(images.view(-1, 28*28).cuda())
# Forward pass only to get logits/output
outputs = model_nn(images)
# Get predictions from the maximum value
_, predicted = torch.max(outputs.data, 1)
# Total number of labels
total += labels.size(0)
# Total correct predictions
correct += (predicted.cpu() == labels.cpu()).sum()
accuracy = 100 * correct / total
all_loss.append(loss.data[0])
all_accuracy.append(accuracy)
# Print Loss
print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.data[0], accuracy))
In [16]:
plt.figure(figsize=(8,8))
plt.title(s = 'Loss And Accuracy')
plt.xlabel('Accuracy')
plt.ylabel('Loss')
plt.plot(all_accuracy, all_loss)
Out[16]: