Darknet53 ImageNet Sampleset

Import


In [1]:
%matplotlib inline
%reload_ext autoreload
%autoreload 2

In [2]:
from fastai.conv_learner import *
from fastai.models import darknet

In [3]:
from pathlib import Path

In [4]:
PATH = Path('data/imagenet')
PATH_TRAIN = PATH/'train'

Setup


In [5]:
def reset_valset(path):
    path_val = path/'valid'
    path_trn = path/'train'
    
    if not os.path.exists(path_val):
        print('No validation directory to reset.')
        return
    
    for folder in path_val.iterdir():
        for f in folder.iterdir():
            os.rename(f, path_trn / str(f).split('valid/')[-1])

def create_valset(path, p=0.15, seed=0):
    np.random.seed(seed=seed)
    
    path_val = path/'valid'
    path_trn = path/'train'
    reset_valset(path)
    
    # move random p-percent selection from train/ to valid/
    for folder in path_trn.iterdir():
        os.makedirs(path_val/str(folder).split('train/')[-1], exist_ok=True)
        flist = list(folder.iterdir())
        n_move = int(np.round(len(flist) * p))
        fmoves = np.random.choice(flist, n_move, replace=False)
        
        for f in fmoves:
            os.rename(f, path_val / str(f).split('train/')[-1])

def count_files(path):
    count = 0
    for folder in path.iterdir():
        count += len(list(folder.glob('*')))
    return count

In [6]:
create_valset(PATH, p=0.2)
count_files(PATH_TRAIN), count_files(PATH/'valid')


Out[6]:
(15565, 3874)

Weight Decay of 1e-5 used bc it's a near what JHoward uses in CIFAR-10 Darknet notebook. See Fast.ai DL1 bit on Weight Decay in Lesson 5 - 2:12:01.

I may experiment with cycle length and cycle split. lr, clr_div, and cut_div values determined by looking at results in the darknet_test.ipynb notebook, and guessing.


In [6]:
bs = 32
sz = 256
wd = 1e-5

darknet53 = darknet.darknet_53()

tfms = tfms_from_stats(imagenet_stats, sz, aug_tfms=transforms_side_on, 
                       max_zoom=1.05, pad=sz//8)
model_data = ImageClassifierData.from_paths(PATH, bs=bs, tfms=tfms)

learner = ConvLearner.from_model_data(darknet53, model_data, crit=F.cross_entropy)

In [8]:
learner.lr_find()
learner.sched.plot()


 91%|█████████ | 442/487 [32:53<03:20,  4.46s/it, loss=71]  

Train


In [10]:
learner.fit(lrs=1e-2, n_cycle=1, wds=wd, cycle_len=3, use_clr=(40, 10))


  0%|          | 0/487 [00:00<?, ?it/s]
epoch      trn_loss   val_loss   accuracy                   
    0      6.591332   6.535328   0.007228  
    1      6.284904   6.388249   0.00826                    
    2      5.974577   5.956076   0.018327                   

Out[10]:
[array([5.95608]), 0.018327310273619]

In [7]:
# learner.save('darknet53_imagenet_sample_00')
learner.load('darknet53_imagenet_sample_00')

In [8]:
learner.fit(lrs=1e-2, n_cycle=1, wds=wd, cycle_len=3, use_clr=(40, 10))


epoch      trn_loss   val_loss   accuracy                   
    0      6.103869   6.255477   0.009809  
    1      5.85425    6.003895   0.015746                   
    2      5.566146   5.661218   0.032783                   

Out[8]:
[array([5.66122]), 0.032782653588022716]

In [9]:
learner.fit(lrs=1e-2, n_cycle=1, wds=wd, cycle_len=10, use_clr=(40, 10))


epoch      trn_loss   val_loss   accuracy                   
    0      5.845506   6.113468   0.016004  
    1      5.727329   5.851977   0.019876                   
    2      5.601784   15.758144  0.005421                   
    3      5.366751   5.786405   0.032008                   
    4      5.240548   5.628979   0.047754                   
    5      5.069232   5.413086   0.049045                   
    6      4.916917   5.463916   0.054466                   
    7      4.791992   5.401633   0.068147                   
    8      4.62377    5.185652   0.075632                   
    9      4.423053   4.994946   0.089572                   

Out[9]:
[array([4.99495]), 0.08957150232318017]

In [10]:
learner.save('darknet53_imagenet_sample_01')

In [ ]: