📑 Pytorch Workout 01
Code Modules
xxxxxxxxxx
#!python3 -m pip install torch==1.8.0 \
#--user --quiet --no-warn-script-location
!python3 -m pip install torchvision==0.9.0 \
--user --quiet --no-warn-script-location
spath='/home/sc_work/.sage/local/lib/python3.9/site-packages'
import sys; sys.path.append(spath)
import numpy as np,pandas as pd,pylab as pl
import h5py,urllib,torch,torchvision
import torchvision.transforms as tvt,\
torchvision.datasets as tvd,torchvision.utils as tvu
import sklearn.datasets as skd
from torch.utils.data import Dataset as tds
from torch.utils.data import DataLoader as tdl
from IPython.core.magic import register_line_magic
dev=torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
html('<style>.sagecell_input '+\
'{text-shadow:4px 4px 4px #aaa;}</style>')
Image Data
xxxxxxxxxx
path='https://raw.githubusercontent.com/'+\
'OlgaBelitskaya/data_kitchen/main/'
zf='Flowers128.h5'; input_file=urllib.request.urlopen(path+zf)
output_file=open(zf,'wb'); output_file.write(input_file.read())
output_file.close(); input_file.close()
with h5py.File(zf,'r') as f:
keys=list(f.keys())
pretty_print(html(
'<p style="color:darkorange">file keys: '+\
', '.join(keys)+'</p>'))
images=np.array(f[keys[0]]); labels=np.array(f[keys[1]])
names=[el.decode('utf-8')for el in f[keys[2]]]
f.close()
N=labels.shape[0]; n=int(.1*N); shuffle_ids=np.arange(N)
np.random.RandomState(12).shuffle(shuffle_ids)
images=images[shuffle_ids]; labels=labels[shuffle_ids]
x_test,x_valid,x_train=images[:n],images[n:2*n],images[2*n:]
y_test,y_valid,y_train=labels[:n],labels[n:2*n],labels[2*n:]
df=pd.DataFrame(
[[x_train.shape,x_valid.shape,x_test.shape],
[x_train.dtype,x_valid.dtype,x_test.dtype],
[y_train.shape,y_valid.shape,y_test.shape],
[y_train.dtype,y_valid.dtype,y_test.dtype]],
columns=['train','valid','test'],
index=['image shape','image type',
'label shape','label type'])
fig=pl.figure(figsize=(6,4)); n=randint(1,100)
for i in range(n,n+6):
ax=fig.add_subplot(2,3,i-n+1,xticks=[],yticks=[])
ax.set_title('$\\mathscr{'+names[labels[i]]+'}$',
color='slategray',
fontdict={'fontsize':'small'})
ax.imshow((images[i]))
pl.tight_layout(); pl.show(); display(df)
Data Loaders
xxxxxxxxxx
x_train=np.clip(x_train*255,0,255).astype(np.uint8)
x_test=np.clip(x_test*255,0,255).astype(np.uint8)
x_valid=np.clip(x_valid*255,0,255).astype(np.uint8)
class FlowerData(tds):
def __init__(self,images,labels,transform=None):
self.images=images
self.labels=labels
self.transform=transform
def __getitem__(self,index):
x=self.images[index]
y=self.labels[index]
if self.transform: x=self.transform(x)
return x,y
def __len__(self):
return len(self.labels)
batch_size=int(16); num_workers=int(4); img_size=int(32)
trans=tvt.Compose(
[tvt.ToPILImage(),
tvt.Resize((img_size,img_size)),tvt.ToTensor()])
train=FlowerData(images=x_train,labels=y_train,transform=trans)
test=FlowerData(images=x_test,labels=y_test,transform=trans)
valid=FlowerData(images=x_valid,labels=y_valid,transform=trans)
dataloaders={'train':tdl(dataset=train,batch_size=batch_size,
shuffle=True,num_workers=num_workers),
'test':tdl(dataset=test,batch_size=batch_size,
shuffle=True,num_workers=num_workers),
'valid':tdl(dataset=valid,batch_size=batch_size,
shuffle=True,num_workers=num_workers)}
xxxxxxxxxx
def display_examples(data):
for images,labels in dataloaders[data]:
print('Image dimensions: %s'%str(images.shape))
print('Label dimensions: %s'%str(labels.shape))
n=np.random.randint(1,5)
fig=pl.figure(figsize=(6,1))
for i in range(n,n+5):
ax=fig.add_subplot(1,5,i-n+1,xticks=[],yticks=[])
ax.set_title('$\\mathscr{'+names[labels[i].item()]+'}$',
fontsize=8,color='slategray')
ax.imshow(np.transpose(images[i],(1,2,0)))
pl.tight_layout(); pl.show()
break
%display_examples valid
Model Building
xxxxxxxxxx
from torchvision import models
import torch.nn.functional as tnnf
import torch.nn as tnn
num_classes=len(names)
xxxxxxxxxx
class FilterResponseNorm(tnn.Module):
def __init__(self,num_features,eps=float(1e-6)):
super(FilterResponseNorm,self).__init__()
self.register_parameter('beta',\
tnn.Parameter(torch.empty(
[int(1),num_features,int(1),int(1)]).normal_()))
self.register_parameter('gamma',\
tnn.Parameter(torch.empty(
[int(1),num_features,int(1),int(1)]).normal_()))
self.register_parameter('tau',\
tnn.Parameter(torch.empty(
[int(1),num_features,int(1),int(1)]).normal_()))
self.eps=torch.Tensor([eps])
def forward(self,x):
n,c,h,w=x.size()
self.eps=self.eps.to(self.tau.device)
nu2=torch.mean(x.pow(int(2)),(int(2),int(3)),keepdims=True)
x=x*torch.rsqrt(nu2+torch.abs(self.eps))
return torch.max(self.gamma*x+self.beta,self.tau)
def convfrn(x,y,k,s,p):
return tnn.Sequential(
tnn.Conv2d(x,y,kernel_size=k,stride=s,padding=p),
FilterResponseNorm(y))
class FRN_NNinNN(tnn.Module):
def __init__(self,num_classes):
super(FRN_NNinNN,self).__init__()
self.num_classes=num_classes
self.classifier=tnn.Sequential(
convfrn(int(3),int(192),int(5),int(1),int(2)),
convfrn(int(192),int(160),int(1),int(1),int(0)),
convfrn(int(160),int(96),int(1),int(1),int(0)),
tnn.MaxPool2d(
kernel_size=int(3),stride=int(2),padding=int(1)),
tnn.Dropout(float(.5)),
convfrn(int(96),int(192),int(5),int(1),int(2)),
convfrn(int(192),int(192),int(1),int(1),int(0)),
convfrn(int(192),int(192),int(1),int(1),int(0)),
tnn.AvgPool2d(
kernel_size=int(3),stride=int(2),padding=int(1)),
tnn.Dropout(float(.5)),
convfrn(int(192),int(192),int(3),int(1),int(1)),
convfrn(int(192),int(192),int(1),int(1),int(0)),
tnn.Conv2d(int(192),self.num_classes,kernel_size=int(1),
stride=int(1),padding=int(0)),
tnn.ReLU(),
tnn.AvgPool2d(
kernel_size=int(8),stride=int(1),padding=int(0)))
def forward(self,x):
x=self.classifier(x)
logits=x.view(x.size(int(0)),self.num_classes)
probs=torch.softmax(logits,dim=int(1))
return logits,probs
xxxxxxxxxx
random_seed=int(12); learning_rate=float(.00005)
torch.manual_seed(random_seed)
tmodel=FRN_NNinNN(num_classes)
tmodel=tmodel.to(dev)
optimizer=torch.optim.Adam(
tmodel.parameters(),lr=learning_rate)
def model_acc(model,data_loader):
correct_preds,num_examples=int(0),int(0)
for features,targets in data_loader:
features=features.to(dev)
targets=targets.to(dev).long()
logits=model(features)
_,pred_labels=torch.max(logits[int(0)],int(1))
num_examples+=targets.size(int(0))
correct_preds+=(pred_labels==targets).sum()
return correct_preds.float()/num_examples*int(100)
def epoch_loss(model,data_loader):
model.eval()
curr_loss,num_examples=float(0.),int(0)
with torch.no_grad():
for features,targets in data_loader:
features=features.to(dev)
targets=targets.to(dev).long()
logits=model(features)
loss=tnnf.cross_entropy(
logits[int(0)],targets,reduction='sum')
num_examples+=targets.size(int(0))
curr_loss+=loss
return curr_loss/num_examples
Model Training
xxxxxxxxxx
def train_run(epochs):
epochs=int(epochs)
str1='Epoch: %03d/%03d | Batch: %03d/%03d | Cost: %.4f'
str2='train acc/loss: %.2f%%/%.2f valid acc/loss: %.2f%%/%.2f'
for epoch in range(epochs):
tmodel.train()
for batch_ids,(features,targets) \
in enumerate(dataloaders['train']):
features=features.to(dev)
targets=targets.to(dev).long()
logits=tmodel(features)
cost=tnnf.cross_entropy(logits[int(0)],targets)
optimizer.zero_grad(); cost.backward()
optimizer.step()
if not batch_ids%int(10):
print (str1%(epoch+int(1),epochs,batch_ids,
len(dataloaders['train']),cost))
tmodel.eval()
with torch.set_grad_enabled(False):
print('Epoch: %03d/%03d'%(epoch+int(1),epochs))
print(str2%\
(model_acc(tmodel,dataloaders['train']),
epoch_loss(tmodel,dataloaders['train']),
model_acc(tmodel,dataloaders['valid']),
epoch_loss(tmodel,dataloaders['valid'])))
%train_run 2
Model Evaluation
xxxxxxxxxx
tmodel.eval()
with torch.set_grad_enabled(False):
print('test acc: %.2f%%'%(
model_acc(tmodel,dataloaders['test'])))
No comments:
Post a Comment