40 KiB
40 KiB
In [46]:
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import pandas as pdIn [47]:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#train_df=pd.read_csv("/kaggle/input/competitions/digit-recognizer/train.csv")
#test_df=pd.read_csv("/kaggle/input/competitions/digit-recognizer/test.csv")
train_df=pd.read_csv("train.csv")
test_df=pd.read_csv("test.csv")In [48]:
fig, ax = plt.subplots(nrows=2, ncols=2, sharex='all', sharey='all')
ax = ax.flatten()
for i in range(4):
img = train_df.iloc[i][1:].to_numpy().reshape(28,28)
# ax[i].imshow(img,cmap='Greys')
ax[i].imshow(img)
ax[i].set_title(f'{train_df.iloc[i][0]}')In [49]:
class DatasetMnist(Dataset):
def __init__(self,df):
self.df=df
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
item= {"Data": torch.tensor(self.df.iloc[idx][1:].to_numpy().reshape(28, 28),dtype=torch.float), "label": torch.tensor(self.df.iloc[idx][0],dtype=torch.long)}
return item
batch_size =64
train_dataset = DatasetMnist(train_df)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)In [56]:
class MnistModule(nn.Module):
'''
(batch_size,1,28,28)
'''
def __init__(self):
super(MnistModule, self).__init__()
self.cov1=nn.Conv2d(in_channels=1, out_channels=16, kernel_size=7)
self.cov2=nn.Conv2d(in_channels=16, out_channels=32, kernel_size=7)
self.cov3=nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5)
self.cov4=nn.Conv2d(in_channels=64, out_channels=128, kernel_size=5)
self.cov5=nn.Conv2d(in_channels=128, out_channels=256, kernel_size=5)
self.cov6=nn.Conv2d(in_channels=256, out_channels=512, kernel_size=4)
self.linear1 = nn.Linear(in_features=1*1*512, out_features=128)
self.linear2 = nn.Linear(in_features=128, out_features=10)
self.relu = nn.ReLU()
def forward(self,X):
X=X.view(-1,1,28,28)
X=self.cov6(self.cov5(self.cov4(self.cov3(self.cov2(self.cov1(X))))))
X=X.view(-1,512)
return self.linear2(self.relu(self.linear1(X)))
In [57]:
model = MnistModule()
model=model.to(device)
loss_func = nn.CrossEntropyLoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-4)
scheduler=torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)In [58]:
epochs = 30
for epoch in range(epochs):
model.train()
training_loss=0
for batch in train_loader:
optimizer.zero_grad()
X = batch['Data']
labels=batch['label']
X=X.to(device)
labels=labels.to(device)
#print(model(X),'\n',labels)
loss = loss_func(model(X),labels)
loss.backward()
optimizer.step()
training_loss+=loss.item()
scheduler.step()
print(f"train_loss: {training_loss/len(train_loader)}")[31m---------------------------------------------------------------------------[39m [31mKeyboardInterrupt[39m Traceback (most recent call last) [36mCell[39m[36m [39m[32mIn[58][39m[32m, line 14[39m [32m 12[39m loss = loss_func(model(X),labels) [32m 13[39m loss.backward() [32m---> [39m[32m14[39m [43moptimizer[49m[43m.[49m[43mstep[49m[43m([49m[43m)[49m [32m 15[39m training_loss+=loss.item() [32m 16[39m scheduler.step() [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/lr_scheduler.py:166[39m, in [36mLRScheduler.__init__.<locals>.patch_track_step_called.<locals>.wrap_step.<locals>.wrapper[39m[34m(*args, **kwargs)[39m [32m 164[39m opt = opt_ref() [32m 165[39m opt._opt_called = [38;5;28;01mTrue[39;00m [38;5;66;03m# type: ignore[union-attr][39;00m [32m--> [39m[32m166[39m [38;5;28;01mreturn[39;00m [43mfunc[49m[43m.[49m[34;43m__get__[39;49m[43m([49m[43mopt[49m[43m,[49m[43m [49m[43mopt[49m[43m.[49m[34;43m__class__[39;49m[43m)[49m[43m([49m[43m*[49m[43margs[49m[43m,[49m[43m [49m[43m*[49m[43m*[49m[43mkwargs[49m[43m)[49m [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/optimizer.py:526[39m, in [36mOptimizer.profile_hook_step.<locals>.wrapper[39m[34m(*args, **kwargs)[39m [32m 521[39m [38;5;28;01mraise[39;00m [38;5;167;01mRuntimeError[39;00m( [32m 522[39m [33mf[39m[33m"[39m[38;5;132;01m{[39;00mfunc[38;5;132;01m}[39;00m[33m must return None or a tuple of (new_args, new_kwargs), but got [39m[38;5;132;01m{[39;00mresult[38;5;132;01m}[39;00m[33m.[39m[33m"[39m [32m 523[39m ) [32m 525[39m [38;5;66;03m# pyrefly: ignore [invalid-param-spec][39;00m [32m--> [39m[32m526[39m out = [43mfunc[49m[43m([49m[43m*[49m[43margs[49m[43m,[49m[43m [49m[43m*[49m[43m*[49m[43mkwargs[49m[43m)[49m [32m 527[39m [38;5;28mself[39m._optimizer_step_code() [32m 529[39m [38;5;66;03m# call optimizer step post hooks[39;00m [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/optimizer.py:81[39m, in [36m_use_grad_for_differentiable.<locals>._use_grad[39m[34m(*args, **kwargs)[39m [32m 79[39m torch.set_grad_enabled([38;5;28mself[39m.defaults[[33m"[39m[33mdifferentiable[39m[33m"[39m]) [32m 80[39m torch._dynamo.graph_break() [32m---> [39m[32m81[39m ret = [43mfunc[49m[43m([49m[43m*[49m[43margs[49m[43m,[49m[43m [49m[43m*[49m[43m*[49m[43mkwargs[49m[43m)[49m [32m 82[39m [38;5;28;01mfinally[39;00m: [32m 83[39m torch._dynamo.graph_break() [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/adam.py:248[39m, in [36mAdam.step[39m[34m(self, closure)[39m [32m 236[39m beta1, beta2 = group[[33m"[39m[33mbetas[39m[33m"[39m] [32m 238[39m has_complex = [38;5;28mself[39m._init_group( [32m 239[39m group, [32m 240[39m params_with_grad, [32m (...)[39m[32m 245[39m state_steps, [32m 246[39m ) [32m--> [39m[32m248[39m [43madam[49m[43m([49m [32m 249[39m [43m [49m[43mparams_with_grad[49m[43m,[49m [32m 250[39m [43m [49m[43mgrads[49m[43m,[49m [32m 251[39m [43m [49m[43mexp_avgs[49m[43m,[49m [32m 252[39m [43m [49m[43mexp_avg_sqs[49m[43m,[49m [32m 253[39m [43m [49m[43mmax_exp_avg_sqs[49m[43m,[49m [32m 254[39m [43m [49m[43mstate_steps[49m[43m,[49m [32m 255[39m [43m [49m[43mamsgrad[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mamsgrad[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 256[39m [43m [49m[43mhas_complex[49m[43m=[49m[43mhas_complex[49m[43m,[49m [32m 257[39m [43m [49m[43mbeta1[49m[43m=[49m[43mbeta1[49m[43m,[49m [32m 258[39m [43m [49m[43mbeta2[49m[43m=[49m[43mbeta2[49m[43m,[49m [32m 259[39m [43m [49m[43mlr[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mlr[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 260[39m [43m [49m[43mweight_decay[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mweight_decay[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 261[39m [43m [49m[43meps[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43meps[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 262[39m [43m [49m[43mmaximize[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mmaximize[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 263[39m [43m [49m[43mforeach[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mforeach[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 264[39m [43m [49m[43mcapturable[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mcapturable[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 265[39m [43m [49m[43mdifferentiable[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mdifferentiable[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 266[39m [43m [49m[43mfused[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mfused[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 267[39m [43m [49m[43mgrad_scale[49m[43m=[49m[38;5;28;43mgetattr[39;49m[43m([49m[38;5;28;43mself[39;49m[43m,[49m[43m [49m[33;43m"[39;49m[33;43mgrad_scale[39;49m[33;43m"[39;49m[43m,[49m[43m [49m[38;5;28;43;01mNone[39;49;00m[43m)[49m[43m,[49m [32m 268[39m [43m [49m[43mfound_inf[49m[43m=[49m[38;5;28;43mgetattr[39;49m[43m([49m[38;5;28;43mself[39;49m[43m,[49m[43m [49m[33;43m"[39;49m[33;43mfound_inf[39;49m[33;43m"[39;49m[43m,[49m[43m [49m[38;5;28;43;01mNone[39;49;00m[43m)[49m[43m,[49m [32m 269[39m [43m [49m[43mdecoupled_weight_decay[49m[43m=[49m[43mgroup[49m[43m[[49m[33;43m"[39;49m[33;43mdecoupled_weight_decay[39;49m[33;43m"[39;49m[43m][49m[43m,[49m [32m 270[39m [43m [49m[43m)[49m [32m 272[39m [38;5;28;01mreturn[39;00m loss [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/optimizer.py:151[39m, in [36m_disable_dynamo_if_unsupported.<locals>.wrapper.<locals>.maybe_fallback[39m[34m(*args, **kwargs)[39m [32m 149[39m [38;5;28;01mreturn[39;00m disabled_func(*args, **kwargs) [32m 150[39m [38;5;28;01melse[39;00m: [32m--> [39m[32m151[39m [38;5;28;01mreturn[39;00m [43mfunc[49m[43m([49m[43m*[49m[43margs[49m[43m,[49m[43m [49m[43m*[49m[43m*[49m[43mkwargs[49m[43m)[49m [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/adam.py:970[39m, in [36madam[39m[34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, foreach, capturable, differentiable, fused, grad_scale, found_inf, has_complex, decoupled_weight_decay, amsgrad, beta1, beta2, lr, weight_decay, eps, maximize)[39m [32m 967[39m [38;5;28;01melse[39;00m: [32m 968[39m func = _single_tensor_adam [32m--> [39m[32m970[39m [43mfunc[49m[43m([49m [32m 971[39m [43m [49m[43mparams[49m[43m,[49m [32m 972[39m [43m [49m[43mgrads[49m[43m,[49m [32m 973[39m [43m [49m[43mexp_avgs[49m[43m,[49m [32m 974[39m [43m [49m[43mexp_avg_sqs[49m[43m,[49m [32m 975[39m [43m [49m[43mmax_exp_avg_sqs[49m[43m,[49m [32m 976[39m [43m [49m[43mstate_steps[49m[43m,[49m [32m 977[39m [43m [49m[43mamsgrad[49m[43m=[49m[43mamsgrad[49m[43m,[49m [32m 978[39m [43m [49m[43mhas_complex[49m[43m=[49m[43mhas_complex[49m[43m,[49m [32m 979[39m [43m [49m[43mbeta1[49m[43m=[49m[43mbeta1[49m[43m,[49m [32m 980[39m [43m [49m[43mbeta2[49m[43m=[49m[43mbeta2[49m[43m,[49m [32m 981[39m [43m [49m[43mlr[49m[43m=[49m[43mlr[49m[43m,[49m [32m 982[39m [43m [49m[43mweight_decay[49m[43m=[49m[43mweight_decay[49m[43m,[49m [32m 983[39m [43m [49m[43meps[49m[43m=[49m[43meps[49m[43m,[49m [32m 984[39m [43m [49m[43mmaximize[49m[43m=[49m[43mmaximize[49m[43m,[49m [32m 985[39m [43m [49m[43mcapturable[49m[43m=[49m[43mcapturable[49m[43m,[49m [32m 986[39m [43m [49m[43mdifferentiable[49m[43m=[49m[43mdifferentiable[49m[43m,[49m [32m 987[39m [43m [49m[43mgrad_scale[49m[43m=[49m[43mgrad_scale[49m[43m,[49m [32m 988[39m [43m [49m[43mfound_inf[49m[43m=[49m[43mfound_inf[49m[43m,[49m [32m 989[39m [43m [49m[43mdecoupled_weight_decay[49m[43m=[49m[43mdecoupled_weight_decay[49m[43m,[49m [32m 990[39m [43m[49m[43m)[49m [36mFile [39m[32m~/.conda/envs/nn/lib/python3.11/site-packages/torch/optim/adam.py:545[39m, in [36m_single_tensor_adam[39m[34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, grad_scale, found_inf, amsgrad, has_complex, beta1, beta2, lr, weight_decay, eps, maximize, capturable, differentiable, decoupled_weight_decay)[39m [32m 543[39m denom = (max_exp_avg_sqs[i].sqrt() / bias_correction2_sqrt).add_(eps) [32m 544[39m [38;5;28;01melse[39;00m: [32m--> [39m[32m545[39m denom = ([43mexp_avg_sq[49m[43m.[49m[43msqrt[49m[43m([49m[43m)[49m / bias_correction2_sqrt).add_(eps) [32m 547[39m param.addcdiv_(exp_avg, denom, value=-step_size) [38;5;66;03m# type: ignore[arg-type][39;00m [32m 549[39m [38;5;66;03m# Lastly, switch back to complex view[39;00m [31mKeyboardInterrupt[39m:
In [ ]:
class DatasetMnistTest(Dataset):
def __init__(self,df):
self.df=df
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
item= {"Data": torch.tensor(self.df.iloc[idx].to_numpy().reshape(28, 28),dtype=torch.float)}
return item
test_dataset = DatasetMnistTest(test_df)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
all_preds = []
with torch.no_grad():
for batch in test_loader:
input_ids = batch['Data'].to(device)
outputs = model(input_ids)
preds = torch.argmax(outputs, dim=1)
all_preds.extend(preds.cpu().numpy())
idd = range(1,len(all_preds)+1)
submission = pd.DataFrame({
'ImageId':idd,
'Label': all_preds
})
print(submission)
submission.to_csv('submission.csv', index=False)
print("Submission saved!")In [ ]: