import pickle,gzip,math,os,time,shutil,torch,matplotlib as mpl,numpy as np,matplotlib.pyplot as plt
import fastcore.all as fc
from collections.abc import Mapping
from pathlib import Path
from operator import attrgetter,itemgetter
from functools import partial
from torch import tensor,nn,optim
from torch.utils.data import DataLoader,default_collate
import torch.nn.functional as F
import torchvision.transforms.functional as TF
from datasets import load_dataset,load_dataset_builder
from fastprogress import progress_bar,master_bar
from miniai.datasets import *
from miniai.training import *
from miniai.conv import *
This is not my content it’s a part of Fastai’s From Deep Learning Foundations to Stable Diffusion course. I add some notes for me to understand better thats all. For the source check Fastai course page.
I this notebook is for explaning why and how manual coding doesnt work. watch the video and skip to the next one. (notice there is no exports here)
Autoencoders
from fastcore.test import test_close
=2, linewidth=140, sci_mode=False)
torch.set_printoptions(precision1)
torch.manual_seed('image.cmap'] = 'gray'
mpl.rcParams[
import logging
logging.disable(logging.WARNING)
Data
= 'image','label'
x,y = "fashion_mnist"
name = load_dataset(name, ignore_verifications=True) dsd
@inplace
def transformi(b): b[x] = [TF.to_tensor(o) for o in b[x]]
= 256
bs = dsd.with_transform(transformi) tds
= tds['train']
ds = ds[0]['image']
img =(1,1)); show_image(img, figsize
= collate_dict(ds) cf
def collate_(b): return to_device(cf(b))
def data_loaders(dsd, bs, **kwargs): return {k:DataLoader(v, bs, **kwargs) for k,v in dsd.items()}
= data_loaders(tds, bs, collate_fn=collate_) dls
= dls['train']
dt = dls['test']
dv
= next(iter(dt)) xb,yb
= ds.features[y].names labels
labels
['T - shirt / top',
'Trouser',
'Pullover',
'Dress',
'Coat',
'Sandal',
'Shirt',
'Sneaker',
'Bag',
'Ankle boot']
= itemgetter(*yb[:16])
lbl_getter = lbl_getter(labels) titles
'figure.dpi'] = 70
mpl.rcParams[16], imsize=1.7, titles=titles) show_images(xb[:
Warmup - classify
from torch import optim
= 256
bs = 0.4 lr
= nn.Sequential(
cnn 1 ,4), #14x14
conv(4 ,8), #7x7
conv(8 ,16), #4x4
conv(16,16), #2x2
conv(16,10, act=False),
conv( nn.Flatten()).to(def_device)
= optim.SGD(cnn.parameters(), lr=lr)
opt = fit(5, cnn, F.cross_entropy, opt, dt, dv) loss,acc
0 0.37266189764738084 0.8627
1 0.36386815688610075 0.866
2 0.3640298747062683 0.8672
3 0.36340640761852266 0.8692
4 0.36365662859678266 0.8698
'train'][0] dsd[
{'image': <PIL.PngImagePlugin.PngImageFile image mode=L size=28x28>,
'label': 9}
Autoencoder
def deconv(ni, nf, ks=3, act=True):
= [nn.UpsamplingNearest2d(scale_factor=2),
layers =1, kernel_size=ks, padding=ks//2)]
nn.Conv2d(ni, nf, strideif act: layers.append(nn.ReLU())
return nn.Sequential(*layers)
def eval(model, loss_func, valid_dl, epoch=0):
eval()
model.with torch.no_grad():
= 0.,0
tot_loss,count for xb,_ in valid_dl:
= model(xb)
pred = len(xb)
n += n
count += loss_func(pred,xb).item()*n
tot_loss print(epoch, f'{tot_loss/count:.3f}')
def fit(epochs, model, loss_func, opt, train_dl, valid_dl):
for epoch in range(epochs):
model.train()for xb,_ in train_dl:
= loss_func(model(xb), xb)
loss
loss.backward()
opt.step()
opt.zero_grad()eval(model, loss_func, valid_dl, epoch)
= nn.Sequential( #28x28
ae 2), #32x32
nn.ZeroPad2d(1,2), #16x16
conv(2,4), #8x8
conv(# conv(4,8), #4x4
# deconv(8,4), #8x8
4,2), #16x16
deconv(2,1, act=False), #32x32
deconv(-2), #28x28
nn.ZeroPad2d(
nn.Sigmoid() ).to(def_device)
eval(ae, F.mse_loss, dv)
0 0.158
= optim.SGD(ae.parameters(), lr=0.01)
opt 5, ae, F.mse_loss, opt, dt, dv) fit(
0 0.136
1 0.127
2 0.125
3 0.124
4 0.124
= optim.SGD(ae.parameters(), lr=0.1)
opt 5, ae, F.mse_loss, opt, dt, dv) fit(
0 0.108
1 0.047
2 0.039
3 0.036
4 0.034
= ae(xb)
p 16].data.cpu(), imsize=1.5) show_images(p[:
= ae(xb)
p 16].data.cpu(), imsize=1.5) show_images(p[:
16].data.cpu(), imsize=1.5) show_images(xb[: