!pip install fastai --upgrade
import fastai.vision.all as vision
import torch
import numpy as np
from PIL import Image
from pathlib import Path
import os
import matplotlib.pyplot as plt
path = vision.untar_data(vision.URLs.IMAGENETTE)
path.ls()
path.ls()[0].ls()
def splitter(path): return str(path.parent.parent.name) == 'val'
db = vision.DataBlock(
blocks=(vision.ImageBlock, vision.CategoryBlock),
get_items=vision.get_image_files,
get_y=vision.parent_label,
item_tfms=vision.Resize(460),
batch_tfms=vision.aug_transforms(size=224, min_scale=0.75),
splitter=vision.FuncSplitter(splitter)
)
ds = db.datasets(path)
ds.train, ds.valid, ds.vocab
dls = db.dataloaders(path, bs=32)
dls.show_batch()
learn = vision.Learner(dls, vision.xresnet50(), loss_func=torch.nn.CrossEntropyLoss(), metrics=vision.accuracy, pretrained=False)
learn.fit_one_cycle(5, 3e-3)
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 1.658774 | 2.103384 | 0.401529 | 02:44 |
1 | 1.247024 | 2.213533 | 0.491210 | 02:40 |
2 | 0.914718 | 0.945459 | 0.707771 | 02:40 |
3 | 0.737189 | 0.707571 | 0.771720 | 02:40 |
4 | 0.621317 | 0.567915 | 0.819108 | 02:40 |
db1 = vision.DataBlock(
blocks=(vision.ImageBlock, vision.CategoryBlock),
get_items=vision.get_image_files,
get_y=vision.parent_label,
item_tfms=vision.Resize(460),
batch_tfms=[*vision.aug_transforms(size=224, min_scale=0.75),
vision.Normalize.from_stats(*vision.imagenet_stats)],
splitter=vision.FuncSplitter(splitter)
)
db1.summary(path)
dls1 = db1.dataloaders(path, bs=32)
dls1.show_batch()
learn1 = vision.Learner(dls1, vision.xresnet50(), loss_func=vision.CrossEntropyLossFlat(), metrics=vision.accuracy)
learn1.fit_one_cycle(5, 3e-3)
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 0.829856 | 0.837526 | 0.725605 | 02:40 |
1 | 0.824502 | 1.359232 | 0.628025 | 02:41 |
2 | 0.652435 | 0.677327 | 0.786497 | 02:40 |
3 | 0.519262 | 0.505769 | 0.838981 | 02:40 |
4 | 0.443815 | 0.428318 | 0.863185 | 02:40 |
Progressive resizing
def get_dls(bs, size):
db = vision.DataBlock(
blocks=(vision.ImageBlock, vision.CategoryBlock),
get_items=vision.get_image_files,
get_y=vision.parent_label,
splitter=vision.FuncSplitter(splitter),
item_tfms=vision.Resize(460),
batch_tfms=[*vision.aug_transforms(size=size, min_scale=0.75),
vision.Normalize.from_stats(*vision.imagenet_stats)]
)
return db.dataloaders(path, bs=bs)
dls = get_dls(32, 128)
learn = vision.Learner(dls, vision.xresnet50(), loss_func=vision.CrossEntropyLossFlat(), metrics=vision.accuracy)
learn.fit_one_cycle(4, 3e-3)
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 1.722279 | 2.013101 | 0.432866 | 02:09 |
1 | 1.256942 | 1.393829 | 0.578599 | 02:07 |
2 | 0.900626 | 0.809706 | 0.746242 | 02:07 |
3 | 0.733233 | 0.689337 | 0.780382 | 02:07 |
learn.dls = get_dls(16, 224)
learn.fine_tune(3, 1e-3)
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 0.739479 | 0.866746 | 0.746242 | 02:48 |
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 0.678550 | 0.720628 | 0.776815 | 02:49 |
1 | 0.581601 | 0.513642 | 0.833121 | 02:50 |
2 | 0.449859 | 0.436976 | 0.862675 | 02:50 |
pred, target = learn.tta()
vision.accuracy(pred, target).item()
0.8657324910163879
img1 = Image.open(path.ls()[0].ls()[0].ls()[0]).resize((256, 256))
img2 = Image.open(path.ls()[0].ls()[1].ls()[1]).resize((256, 256))
golf = np.array(img1)
truck = np.array(img2)
adv_im = torch.from_numpy(0.4*golf)/255.0 + torch.from_numpy(0.6*truck)/255.0
_, axs = plt.subplots(1, 3, figsize=(12, 4))
vision.show_image(golf, ax=axs[0])
vision.show_image(truck, ax=axs[1])
vision.show_image(adv_im, ax=axs[2])
<matplotlib.axes._subplots.AxesSubplot at 0x7f57f3b2b3c8>
db = vision.DataBlock(
blocks=(vision.ImageBlock, vision.CategoryBlock),
get_items=vision.get_image_files,
get_y=vision.parent_label,
item_tfms=vision.Resize(460),
batch_tfms=vision.aug_transforms(size=224, min_scale=0.75),
splitter=vision.FuncSplitter(splitter)
)
dls = db.dataloaders(path, bs=32)
learn = vision.Learner(dls, vision.xresnet50(), loss_func=vision.CrossEntropyLossFlat(), metrics=vision.accuracy)
learn.fit_one_cycle(1, 3e-3, cbs=vision.MixUp())
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 1.718072 | 1.311549 | 0.601783 | 02:35 |
learn = vision.Learner(dls, vision.xresnet50(), loss_func=vision.LabelSmoothingCrossEntropy(), metrics=vision.accuracy)
learn.fit_one_cycle(1, 3e-3)
epoch | train_loss | valid_loss | accuracy | time |
---|---|---|---|---|
0 | 2.231875 | 2.110342 | 0.623185 | 02:34 |