Merge
Merge
February 6, 2024
[ ]: # name = "schirmerchad/bostonhoustingmlnd"
# dataset = name.split("/")[1] + ".zip"
# # Mount your Google Drive.
# from google.colab import drive
# drive.mount("/content/drive")
# kaggle_creds_path = "kaggle_token/kaggle.json"
# ! mkdir ~/.kaggle
# ! cp "/content/drive/MyDrive/kaggle_token/kaggle.json" ~/.kaggle/
# ! chmod 600 ~/.kaggle/kaggle.json
# ! mkdir kaggle_data
# ! unzip {dataset} -d kaggle_data
Mounted at /content/drive
mkdir: cannot create directory ‘/root/.kaggle’: File exists
Downloading bostonhoustingmlnd.zip to /content
0% 0.00/4.35k [00:00<?, ?B/s]
100% 4.35k/4.35k [00:00<00:00, 10.8MB/s]
mkdir: cannot create directory ‘kaggle_data’: File exists
Archive: bostonhoustingmlnd.zip
inflating: kaggle_data/housing.csv
[ ]: import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from tqdm.auto import tqdm
[ ]: df = pd.read_csv("kaggle_data/housing.csv")
1
[ ]: device = "cuda" if torch.cuda.is_available() else "cpu"
[ ]: df
[ ]: df.isna().sum()
[ ]: RM 0
LSTAT 0
PTRATIO 0
MEDV 0
dtype: int64
[ ]:
[ ]: X = df.drop('MEDV', axis=1)
y = df['MEDV']
X = np.array(X)
y = np.array(y)
scaler = StandardScaler()
X = scaler.fit_transform(X)
y = scaler.fit_transform(y.reshape(-1, 1))
2
print(f"X_train shape: {X_train.shape}")
print(f"y_train shape: {y_train.shape}")
print(f"X_test shape: {X_test.shape}")
print(f"y_test shape: {y_test.shape}")
[ ]:
[ ]: def␣
↪plot(train_data=X_train,train_labels=y_train,test_data=X_test,test_labels=y_test,predictions
plt.figure(figsize=(10,7))
plt.scatter(train_data,train_labels,c="b",s=4,label="Training data")
plt.scatter(test_data,test_labels,c="r",s=4,label="Testing Data")
plt.legend(prop={"size":14})
[ ]: plot(train_data=X_train.T[0], test_data=X_test.T[0])
3
[ ]: class Model(torch.nn.Module):
def __init__(self):
super().__init__()
self.linear_layer = torch.nn.Linear(in_features=3,out_features=1)
[ ]: torch.manual_seed(42)
[ ]: <torch._C.Generator at 0x7ea8f1b79630>
[ ]: model = Model()
[ ]: opt = torch.optim.SGD(lr=0.01,params=model.parameters())
↪tensor(y_train,dtype=torch.float),torch.tensor(y_test,dtype=torch.float)
4
tensor, it is recommended to use sourceTensor.clone().detach() or
sourceTensor.clone().detach().requires_grad_(True), rather than
torch.tensor(sourceTensor).
X_train, X_test, y_train, y_test = torch.tensor(X_train, dtype=torch.float),to
rch.tensor(X_test,dtype=torch.float),torch.tensor(y_train,dtype=torch.float),tor
ch.tensor(y_test,dtype=torch.float)
[ ]:
[ ]: epochs = 200
for epoch in tqdm(range(epochs)):
model.train()
# fw pass
y_pred = model(X_train)
lossval = loss(y_pred,y_train)
opt.zero_grad()
# back prop
lossval.backward()
# optimizer
opt.step()
# TEST
model.eval()
with torch.inference_mode():
test_pred = model(X_test)
test_loss = loss(test_pred,y_test)
if epoch % 10 == 0:
print(f"epoch {epoch}, loss {lossval}, test_loss {test_loss}")
5
epoch 50, loss 0.6047266125679016, test_loss 0.6513829231262207
epoch 60, loss 0.5723316073417664, test_loss 0.6149174571037292
epoch 70, loss 0.543216347694397, test_loss 0.58405601978302
epoch 80, loss 0.5205875635147095, test_loss 0.5580319166183472
epoch 90, loss 0.5055828094482422, test_loss 0.5371074676513672
epoch 100, loss 0.4923928380012512, test_loss 0.5179988145828247
epoch 110, loss 0.48150429129600525, test_loss 0.5013106465339661
epoch 120, loss 0.472374826669693, test_loss 0.4893476665019989
epoch 130, loss 0.46420061588287354, test_loss 0.4796214699745178
epoch 140, loss 0.45730704069137573, test_loss 0.4711703956127167
epoch 150, loss 0.450693279504776, test_loss 0.46309569478034973
epoch 160, loss 0.4443809688091278, test_loss 0.4567875862121582
epoch 170, loss 0.4393230974674225, test_loss 0.45154622197151184
epoch 180, loss 0.4351387619972229, test_loss 0.4470271170139313
epoch 190, loss 0.43130671977996826, test_loss 0.4429181218147278
[ ]: y_preds = []
model.eval()
with torch.inference_mode():
test_pred = model(X_test)
y_preds.append(test_pred.numpy())
[ ]:
[ ]: model.state_dict()
[ ]: #y = weight * X + bias
[ ]: weight = model.state_dict()["linear_layer.weight"][0][0]
[ ]: bias = model.state_dict()["linear_layer.bias"][0]
[ ]: plot(train_data=X_train.T[0], test_data=X_test.
↪T[0],predictions=y_preds,weight=weight.item(),bias=bias.item())
6
[ ]:
[ ]:
[ ]:
7
practical_2
February 6, 2024
[ ]: name = "lakshmi25npathi/imdb-dataset-of-50k-movie-reviews"
dataset = name.split("/")[1] + ".zip"
# Mount your Google Drive.
from google.colab import drive
drive.mount("/content/drive")
kaggle_creds_path = "kaggle_token/kaggle.json"
! mkdir ~/.kaggle
! cp "/content/drive/MyDrive/kaggle_token/kaggle.json" ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json
! mkdir kaggle_data
! unzip {dataset} -d kaggle_data
Mounted at /content/drive
Downloading imdb-dataset-of-50k-movie-reviews.zip to /content
66% 17.0M/25.7M [00:00<00:00, 69.4MB/s]
100% 25.7M/25.7M [00:00<00:00, 85.5MB/s]
Archive: imdb-dataset-of-50k-movie-reviews.zip
inflating: kaggle_data/IMDB Dataset.csv
[ ]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re
import nltk
from nltk.tokenize import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer
nltk.download('stopwords')
1
nltk.download('wordnet')
nltk.download('punkt')
stopwords = set(stopwords.words('english'))
[ ]: import os
from tqdm.auto import tqdm
from collections import Counter
[ ]: df = pd.read_csv("kaggle_data/IMDB Dataset.csv")
[ ]: def transform_label(label):
return 1 if label == 'positive' else 0
x = []
for i in df["sentiment"]:
x.append(transform_label(i))
df["label"] = x
df.head()
[ ]: data_pos = df[df['label'] == 1]
data_pos['token_length'].describe()
[ ]: count 25000.000000
mean 232.849320
std 177.497046
min 10.000000
25% 125.000000
50% 172.000000
75% 284.000000
max 2470.000000
Name: token_length, dtype: float64
2
[ ]: def process_text(text):
text = word_tokenize(text)
text = [i for i in text if i not in stopwords]
lemmatizer = WordNetLemmatizer()
text = [lemmatizer.lemmatize(t) for t in text]
text = [i for i in text if i not in stopwords]
return ' '.join(text)
[ ]: #df['clean'] = df['review'].apply(process_text)
df['processed'] = df['review'].apply(process_text)
df.head()
token_length processed
0 307 One reviewer mentioned watching 1 Oz episode '…
1 162 A wonderful little production . < br / > < br …
2 166 I thought wonderful way spend time hot summer …
3 138 Basically 's family little boy ( Jake ) think …
4 230 Petter Mattei 's `` Love Time Money '' visuall…
[ ]: reviews = df.processed.values
words = ' '.join(reviews)
words = words.split()
words[:10]
[ ]: ['One',
'reviewer',
'mentioned',
'watching',
'1',
'Oz',
'episode',
"'ll",
'hooked',
'.']
[ ]: counter = Counter(words)
vocab = sorted(counter, key=counter.get, reverse=True)
int2word = dict(enumerate(vocab, 1))
int2word[0] = '<PAD>'
word2int = {word: id for id, word in int2word.items()}
3
[ ]: reviews_enc = [[word2int[word] for word in review.split()] for review in␣
↪tqdm(reviews)]
return features
seq_length = 256
features = pad_features(reviews_enc, pad_id=word2int['<PAD>'],␣
↪seq_length=seq_length)
features[:10, :10]
[ ]: array([[ 212, 1097, 970, 97, 409, 3810, 204, 161, 3069,
2],
[ 66, 341, 74, 268, 2, 5, 6, 3, 4,
5],
[ 7, 116, 341, 44, 1036, 23, 923, 1794, 2653,
1],
[ 2376, 8, 160, 74, 269, 13, 3233, 12, 50,
8],
[87832, 11029, 8, 16, 1122, 2011, 7681, 14, 2255,
1321],
[ 2788, 3730, 386, 9, 1, 28, 47677, 1, 3106,
7808],
[ 7, 220, 26, 19, 30, 13224, 1925, 65527, 151,
8291],
4
[ 22, 43, 448, 1, 1367, 107, 4044, 186, 891,
8],
[54585, 1000, 376, 10, 7, 217, 853, 97, 10,
2],
[ 78, 19, 141, 2602, 9168, 2087, 19, 9, 2,
78]])
[ ]: labels = df.label.to_numpy()
labels
[ ]: array([1, 1, 1, …, 0, 0, 0])
[ ]: train_size = .7
val_size = .5
print('Feature Shapes:')
print('===============')
print('Train set: {}'.format(train_x.shape))
print('Validation set: {}'.format(val_x.shape))
print('Test set: {}'.format(test_x.shape))
Feature Shapes:
===============
Train set: (35000, 256)
Validation set: (7500, 256)
Test set: (7500, 256)
17510 17490
3753 3747
3737 3763
[ ]: import torch
from torch.utils.data import TensorDataset, DataLoader
from torch import nn
from torch.optim import Adam
5
[ ]: batch_size = 128
[ ]: class SentimentModel(nn.Module):
def __init__(self, vocab_size, output_size, hidden_size=128,␣
↪embedding_size=400, n_layers=2, dropout=0.2):
super(SentimentModel, self).__init__()
# dropout layer
self.dropout = nn.Dropout(0.3)
6
o = self.fc(o)
# sigmoid
o = self.sigmoid(o)
return o
cuda
[ ]: vocab_size = len(word2int)
output_size = 1
embedding_size = 256
hidden_size = 512
n_layers = 2
dropout=0.25
print(model)
SentimentModel(
(embedding): Embedding(186157, 256)
(lstm): LSTM(256, 512, num_layers=2, batch_first=True, dropout=0.25)
(dropout): Dropout(p=0.3, inplace=False)
(fc): Linear(in_features=512, out_features=1, bias=True)
(sigmoid): Sigmoid()
)
[ ]: lr = 0.001
criterion = nn.BCELoss() # we use BCELoss cz we have binary classification␣
↪problem
7
[ ]: model = model.to(device)
for e in epochloop:
model.train()
train_loss = 0
train_acc = 0
optim.zero_grad()
out = model(feature)
# clip grad
# nn.utils.clip_grad_norm_(model.parameters(), grad_clip)
optim.step()
history['train_loss'].append(train_loss / len(trainloader))
history['train_acc'].append(train_acc / len(trainloader))
model.eval()
8
val_loss = 0
val_acc = 0
with torch.inference_mode():
for id, (feature, target) in enumerate(valloader):
epochloop.set_postfix_str(f'Validation batch {id}/{len(valloader)}')
out = model(feature)
history['val_loss'].append(val_loss / len(valloader))
history['val_acc'].append(val_acc / len(valloader))
# print epoch
if (e+1) % print_every == 0:
epochloop.write(f'Epoch {e+1}/{epochs} | Train Loss: {train_loss /␣
↪len(trainloader):.3f} Train Acc: {train_acc / len(trainloader):.3f} | Val␣
↪3f}')
epochloop.update()
9
epochloop.write(f'[WARNING] Validation loss did not improved␣
↪({val_loss_min:.3f} --> {val_loss / len(valloader):.3f})')
es_trigger += 1
[ ]: model.eval()
# metrics
test_loss = 0
test_acc = 0
all_target = []
all_predicted = []
out = model(feature)
10
test_loss += loss.item()
all_target.extend(target.cpu().numpy())
all_predicted.extend(predicted.cpu().numpy())
[ ]: print(classification_report(all_predicted, all_target))
[ ]: cm = confusion_matrix(all_predicted, all_target)
plt.figure(figsize=(5,5))
sns.heatmap(cm, annot=True, fmt='g')
plt.title('Confusion Matrix')
plt.show()
11
12
practical_3_fashionMNIST
February 6, 2024
[ ]: import torch
from torch import nn
import torchvision
from torchvision import datasets
from torchvision import transforms
from torchvision.transforms import ToTensor
[ ]: torch.__version__
[ ]: '2.1.0+cu121'
[ ]: torchvision.__version__
[ ]: '0.16.0+cu121'
[ ]: train_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor(),
target_transform=None
)
test_data = datasets.FashionMNIST(
root="data",
train=False,
download=True,
transform=ToTensor(),
target_transform=None
)
[ ]: train_data,test_data
1
[ ]: (Dataset FashionMNIST
Number of datapoints: 60000
Root location: data
Split: Train
StandardTransform
Transform: ToTensor(),
Dataset FashionMNIST
Number of datapoints: 10000
Root location: data
Split: Test
StandardTransform
Transform: ToTensor())
[ ]: class_names = train_data.classes
[ ]: fig = plt.figure(figsize=(10,10))
rows,cols = 4,4
for i in range(1,rows*cols+1):
random_idx = torch.randint(0,len(train_data),size=[1]).item()
img,label = train_data[random_idx]
fig.add_subplot(rows,cols,i)
plt.imshow(img.squeeze(),cmap="gray")
plt.title(class_names[label])
2
[ ]: from torch.utils.data import DataLoader
[ ]: BATCH_SIZE = 32
train_dataloader =␣
↪DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True)
test_dataloader =␣
↪DataLoader(dataset=test_data,batch_size=BATCH_SIZE,shuffle=False)
train_dataloader,test_dataloader
3
[ ]: (<torch.utils.data.dataloader.DataLoader at 0x79cace64b460>,
<torch.utils.data.dataloader.DataLoader at 0x79cace64b7c0>)
[ ]: # torch.manual_seed(42)
random_idx = torch.randint(0,len(train_features_batch),size=[1]).item()
img,label = train_features_batch[random_idx],train_labels_batch[random_idx]
plt.imshow(img.squeeze(),cmap="gray")
plt.title(class_names[label])
plt.axis(False)
[ ]: flatten_model = nn.Flatten()
x = train_features_batch[0]
output = flatten_model(x)
4
[ ]: output.squeeze().shape
[ ]: torch.Size([784])
[ ]: import requests
from pathlib import Path
if Path("helper_functions.py").is_file():
print("Helper Functions exists, no download required")
else:
print()
req = requests.get("https://raw.githubusercontent.com/mrdbourke/
↪pytorch-deep-learning/main/helper_functions.py")
with open("helper_functions.py","wb") as f:
f.write(req.content)
import helper_functions
def print_train_time(start:float,end:float,device:torch.device=None):
total = end-start
print(f"Train time on {device}: {total:.3f} secs")
[ ]: import torch
device = 'cuda' if torch.cuda.is_available() else "cpu"
[ ]: device
[ ]: 'cuda'
[ ]: def train_step(
model:torch.nn.Module,
data_loader:torch.utils.data.DataLoader,
loss_fn:torch.nn.Module,
optimizer:torch.optim.Optimizer,
accuracy_fn,
device:torch.device):
train_loss,train_acc = 0,0
model.train()
5
for batch,(X,y) in enumerate(data_loader):
X, y = X.to(device),y.to(device)
y_pred = model(X)
loss = loss_fn(y_pred,y)
train_loss += loss
train_acc += accuracy_fn(y_true=y,y_pred=y_pred.argmax(dim=1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss /= len(data_loader)
train_acc /= len(data_loader)
print(f"Train loss:{train_loss:.5f} | train acc:{train_acc:.2f}%")
def test_step(
model:torch.nn.Module,
data_loader:torch.utils.data.DataLoader,
loss_fn:torch.nn.Module,
accuracy_fn,
device:torch.device
):
## test loop
test_loss,test_acc = 0,0
model.eval()
with torch.inference_mode():
for X,y in data_loader:
X, y = X.to(device),y.to(device)
test_pred = model(X)
test_loss += loss_fn(test_pred,y)
test_acc += accuracy_fn(y_true=y,y_pred=test_pred.argmax(dim=1))
test_loss /= len(test_dataloader)
test_acc /= len(test_dataloader)
6
print(f"test loss: {test_loss:.5f} test_acc: {test_acc:.2f}")
[ ]: torch.manual_seed(42)
def eval_model(model:nn.Module,data_loader:torch.utils.data.DataLoader,loss_fn:
↪torch.nn.Module,accuracy_fn,device):
loss,acc = 0,0
model.eval()
with torch.inference_mode():
for X,y in tqdm(data_loader):
X,y = X.to(device),y.to(device)
y_pred = model(X)
loss += loss_fn(y_pred,y)
acc += accuracy_fn(y_true=y,y_pred=y_pred.argmax(dim=1))
loss /= len(data_loader)
acc /= len(data_loader)
[ ]: class FashionMNISTModelV2CNN(nn.Module):
"""
TinyVGG architecture
"""
def __init__(self,input_shape:int,hidden_units:int,output_shape:int):
super().__init__()
self.conv_block_1 = nn.Sequential(
nn.Conv2d(in_channels=input_shape,
out_channels=hidden_units,
kernel_size=3,
stride=1,
padding=1),
nn.ReLU(),
nn.Conv2d(in_channels=hidden_units,
out_channels=hidden_units,
kernel_size=3,
stride=1,
padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2)
7
)
self.conv_block_2 = nn.Sequential(
nn.Conv2d(in_channels=hidden_units,
out_channels=hidden_units,
kernel_size=3,
stride=1,
padding=1),
nn.ReLU(),
nn.Conv2d(in_channels=hidden_units,
out_channels=hidden_units,
kernel_size=3,
stride=1,
padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2)
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(in_features=hidden_units*49,out_features=output_shape)
)
def forward(self,x):
x = self.conv_block_1(x)
# print(x.shape)
x = self.conv_block_2(x)
# print(x.shape)
x = self.classifier(x)
return x
[ ]: torch.manual_seed(42)
model2 = FashionMNISTModelV2CNN(
input_shape=1,
hidden_units=10,
output_shape=len(class_names)
).to(device)
loss_fn = nn.CrossEntropyLoss()
8
optimizer = torch.optim.SGD(params=model2.parameters(),lr=0.1)
torch.manual_seed(42)
torch.cuda.manual_seed(42)
epochs = 3
train_step(
model=model2,
data_loader=train_dataloader,
loss_fn=loss_fn,
optimizer=optimizer,
accuracy_fn=accuracy_fn,
device=device
)
test_step(
model=model2,
data_loader=test_dataloader,
loss_fn=loss_fn,
accuracy_fn=accuracy_fn,
device=device
)
train_end_time = timer()
total_time_train = print_train_time(
start = train_time_start,
end = train_end_time,
device=device
)
Epoch: 0
9
----------------
Train loss:0.59443 | train acc:78.32%
test loss: 0.39969 test_acc: 86.04
Epoch: 1
----------------
Train loss:0.35867 | train acc:87.27%
test loss: 0.35115 test_acc: 87.08
Epoch: 2
----------------
Train loss:0.31848 | train acc:88.45%
test loss: 0.31587 test_acc: 88.79
Train time on cuda: 37.646 secs
[ ]: model2_results = eval_model(
model=model2,
data_loader=test_dataloader,
accuracy_fn=accuracy_fn,
loss_fn=loss_fn,
device=device
)
[ ]: model2_results
[ ]: {'model': 'FashionMNISTModelV2CNN',
'model_loss': 0.3158661723136902,
'model_acc': 88.7879392971246}
[ ]: def make_predictions(
model,
data,
device,
):
pred_probs = []
model.eval()
with torch.inference_mode():
for sample in data:
sample = torch.unsqueeze(sample,dim=0).to(device)
pred_logit = model(sample)
pred_prob = torch.softmax(pred_logit.squeeze(),dim=0)
10
pred_probs.append(pred_prob.cpu())
return torch.stack(pred_probs)
[ ]: test_data
[ ]: Dataset FashionMNIST
Number of datapoints: 10000
Root location: data
Split: Test
StandardTransform
Transform: ToTensor()
[ ]:
[ ]: import random
test_samples = []
test_labels = []
[ ]:
[ ]:
[ ]: pred_probs = make_predictions(
model=model2,
data=test_samples,
device=device
)
[ ]: pred_classes = pred_probs.argmax(dim=1)
[ ]: plt.figure(figsize=(9,9))
rows = 3
cols = 3
for i,sample in enumerate(test_samples):
plt.subplot(rows,cols,i+1)
plt.imshow(sample.squeeze(),cmap="gray")
pred_label = class_names[pred_classes[i]]
11
truth_label = class_names[test_labels[i]]
if pred_label == truth_label:
plt.title(title_text,fontsize=10,c="g")
else:
plt.title(title_text,fontsize=10,c="r")
plt.axis(False)
12
[ ]: try:
import torchmetrics,mlxtend
print(mlxtend.__version__)
assert int(mlxtend.__version__.split(".")[1]) >= 19, "mlxtend should be␣
↪greater than 0.19.0"
except:
!pip install torchmetrics mlxtend -U
import torchmetrics,mlxtend
[ ]: mlxtend.__version__
[ ]: '0.23.1'
[ ]: y_preds = []
model2.eval()
with torch.inference_mode():
for X,y in tqdm(test_dataloader,desc="Make pred"):
X,y = X.to(device),y.to(device)
y_logits = model2(X)
y_pred = torch.softmax(y_logits.squeeze(),dim=0).argmax(dim=1)
y_preds.append(y_pred.cpu())
y_pred_tensor = torch.cat(y_preds)
[ ]: y_pred_tensor
[ ]: tensor([9, 2, 1, …, 8, 1, 6])
confmat = ConfusionMatrix(task="multiclass",num_classes=len(class_names))
conf_mat_tensor= confmat(preds=y_pred_tensor,target=test_data.targets)
fig,ax = plot_confusion_matrix(conf_mat=conf_mat_tensor.
↪numpy(),class_names=class_names,figsize=(10,7))
13
[ ]:
[ ]:
14