Created
September 20, 2019 06:06
-
-
Save PulkitS01/4b467252bbe0fbf520d91f3608e2284d to your computer and use it in GitHub Desktop.
CNNs using PyTorch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Net(Module): | |
def __init__(self): | |
super(Net, self).__init__() | |
self.cnn_layers = Sequential( | |
# Defining a 2D convolution layer | |
Conv2d(1, 4, kernel_size=3, stride=1, padding=1), | |
BatchNorm2d(4), | |
ReLU(inplace=True), | |
MaxPool2d(kernel_size=2, stride=2), | |
# Defining another 2D convolution layer | |
Conv2d(4, 4, kernel_size=3, stride=1, padding=1), | |
BatchNorm2d(4), | |
ReLU(inplace=True), | |
MaxPool2d(kernel_size=2, stride=2), | |
) | |
self.linear_layers = Sequential( | |
Linear(4 * 7 * 7, 10) | |
) | |
# Defining the forward pass | |
def forward(self, x): | |
x = self.cnn_layers(x) | |
x = x.view(x.size(0), -1) | |
x = self.linear_layers(x) | |
return x |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# loading dataset | |
train = pd.read_csv('train_LbELtWX/train.csv') | |
test = pd.read_csv('test_ScVgIM0/test.csv') | |
sample_submission = pd.read_csv('sample_submission_I5njJSF.csv') | |
train.head() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# importing the libraries | |
import pandas as pd | |
import numpy as np | |
# for reading and displaying images | |
from skimage.io import imread | |
import matplotlib.pyplot as plt | |
%matplotlib inline | |
# for creating validation set | |
from sklearn.model_selection import train_test_split | |
# for evaluating the model | |
from sklearn.metrics import accuracy_score | |
from tqdm import tqdm | |
# PyTorch libraries and modules | |
import torch | |
from torch.autograd import Variable | |
from torch.nn import Linear, ReLU, CrossEntropyLoss, Sequential, Conv2d, MaxPool2d, Module, Softmax, BatchNorm2d, Dropout | |
from torch.optim import Adam, SGD |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# plotting the training and validation loss | |
plt.plot(train_losses, label='Training loss') | |
plt.plot(val_losses, label='Validation loss') | |
plt.legend() | |
plt.show() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# defining the model | |
model = Net() | |
# defining the optimizer | |
optimizer = Adam(model.parameters(), lr=0.07) | |
# defining the loss function | |
criterion = CrossEntropyLoss() | |
# checking if GPU is available | |
if torch.cuda.is_available(): | |
model = model.cuda() | |
criterion = criterion.cuda() | |
print(model) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# replacing the label with prediction | |
sample_submission['label'] = predictions | |
sample_submission.head() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# saving the file | |
sample_submission.to_csv('submission.csv', index=False) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# loading test images | |
test_img = [] | |
for img_name in tqdm(test['id']): | |
# defining the image path | |
image_path = 'test_ScVgIM0/test/' + str(img_name) + '.png' | |
# reading the image | |
img = imread(image_path, as_gray=True) | |
# normalizing the pixel values | |
img /= 255.0 | |
# converting the type of pixel to float 32 | |
img = img.astype('float32') | |
# appending the image into the list | |
test_img.append(img) | |
# converting the list to numpy array | |
test_x = np.array(test_img) | |
test_x.shape |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# generating predictions for test set | |
with torch.no_grad(): | |
output = model(test_x.cuda()) | |
softmax = torch.exp(output).cpu() | |
prob = list(softmax.numpy()) | |
predictions = np.argmax(prob, axis=1) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# converting training images into torch format | |
test_x = test_x.reshape(10000, 1, 28, 28) | |
test_x = torch.from_numpy(test_x) | |
test_x.shape |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# defining the number of epochs | |
n_epochs = 25 | |
# empty list to store training losses | |
train_losses = [] | |
# empty list to store validation losses | |
val_losses = [] | |
# training the model | |
for epoch in range(n_epochs): | |
train(epoch) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# prediction for training set | |
with torch.no_grad(): | |
output = model(train_x.cuda()) | |
softmax = torch.exp(output).cpu() | |
prob = list(softmax.numpy()) | |
predictions = np.argmax(prob, axis=1) | |
# accuracy on training set | |
accuracy_score(train_y, predictions) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# loading training images | |
train_img = [] | |
for img_name in tqdm(train['id']): | |
# defining the image path | |
image_path = 'train_LbELtWX/train/' + str(img_name) + '.png' | |
# reading the image | |
img = imread(image_path, as_gray=True) | |
# normalizing the pixel values | |
img /= 255.0 | |
# converting the type of pixel to float 32 | |
img = img.astype('float32') | |
# appending the image into the list | |
train_img.append(img) | |
# converting the list to numpy array | |
train_x = np.array(train_img) | |
# defining the target | |
train_y = train['label'].values | |
train_x.shape |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def train(epoch): | |
model.train() | |
tr_loss = 0 | |
# getting the training set | |
x_train, y_train = Variable(train_x), Variable(train_y) | |
# getting the validation set | |
x_val, y_val = Variable(val_x), Variable(val_y) | |
# converting the data into GPU format | |
if torch.cuda.is_available(): | |
x_train = x_train.cuda() | |
y_train = y_train.cuda() | |
x_val = x_val.cuda() | |
y_val = y_val.cuda() | |
# clearing the Gradients of the model parameters | |
optimizer.zero_grad() | |
# prediction for training and validation set | |
output_train = model(x_train) | |
output_val = model(x_val) | |
# computing the training and validation loss | |
loss_train = criterion(output_train, y_train) | |
loss_val = criterion(output_val, y_val) | |
train_losses.append(loss_train) | |
val_losses.append(loss_val) | |
# computing the updated weights of all the model parameters | |
loss_train.backward() | |
optimizer.step() | |
tr_loss = loss_train.item() | |
if epoch%2 == 0: | |
# printing the validation loss | |
print('Epoch : ',epoch+1, '\t', 'loss :', loss_val) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# converting training images into torch format | |
train_x = train_x.reshape(54000, 1, 28, 28) | |
train_x = torch.from_numpy(train_x) | |
# converting the target into torch format | |
train_y = train_y.astype(int); | |
train_y = torch.from_numpy(train_y) | |
# shape of training data | |
train_x.shape, train_y.shape |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# prediction for validation set | |
with torch.no_grad(): | |
output = model(val_x.cuda()) | |
softmax = torch.exp(output).cpu() | |
prob = list(softmax.numpy()) | |
predictions = np.argmax(prob, axis=1) | |
# accuracy on validation set | |
accuracy_score(val_y, predictions) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# create validation set | |
train_x, val_x, train_y, val_y = train_test_split(train_x, train_y, test_size = 0.1) | |
(train_x.shape, train_y.shape), (val_x.shape, val_y.shape) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# converting validation images into torch format | |
val_x = val_x.reshape(6000, 1, 28, 28) | |
val_x = torch.from_numpy(val_x) | |
# converting the target into torch format | |
val_y = val_y.astype(int); | |
val_y = torch.from_numpy(val_y) | |
# shape of validation data | |
val_x.shape, val_y.shape |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# visualizing images | |
i = 0 | |
plt.figure(figsize=(10,10)) | |
plt.subplot(221), plt.imshow(train_x[i], cmap='gray') | |
plt.subplot(222), plt.imshow(train_x[i+25], cmap='gray') | |
plt.subplot(223), plt.imshow(train_x[i+50], cmap='gray') | |
plt.subplot(224), plt.imshow(train_x[i+75], cmap='gray') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I believe visualize.py requires a plt.show() at the end to work.