This notebook demonstrates various techniques of effective Neural Network models training using the Callbacks mechanism of FastAI library (v1).
Getting the Data¶
from fastai.vision import *
from fastai.callbacks import *
import fastai
%matplotlib inline
path = untar_data(URLs.CIFAR)
np.random.seed(10)
data = (ImageList.from_folder(path)
.split_by_rand_pct(0.2)
.label_from_folder()
.transform(get_transforms())
.add_test_folder()
.databunch(bs=128)
.normalize(imagenet_stats))
data
data.classes
data.show_batch(figsize=(6,6))
results = pd.DataFrame()
Pretrained Resnet34 Model¶
learn = cnn_learner(data, models.resnet34, metrics=[accuracy], pretrained=True, callback_fns=[CSVLogger,ShowGraph])
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=1e-2)
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']))
results
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-1')
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=1e-4)
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-2')
learn.unfreeze()
learn.lr_find(start_lr=1e-9)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-6,3e-5))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-3')
learn.lr_find(start_lr=1e-9)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-6,3e-5))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-4')
learn.lr_find(start_lr=1e-9)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-6,1e-5))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-5')
learn.lr_find(start_lr=1e-9)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-5,1e-4))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-6')
learn.lr_find(start_lr=1e-9)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-5,1e-4))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-7')
learn.lr_find(start_lr=1e-10)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-6,1e-5))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
learn.save('stage-8')
learn.load('stage-8');
learn.lr_find(start_lr=1e-11)
learn.recorder.plot()
learn.fit_one_cycle(1,max_lr=slice(1e-8,1e-7))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.save('stage-9')
learn.load('stage-9');
learn.lr_find(start_lr=1e-10)
learn.recorder.plot()
learn.fit_one_cycle(5,max_lr=slice(1e-6,1e-7))
results = results.append(pd.read_csv(path/'history.csv',usecols=['train_loss','valid_loss','accuracy']),ignore_index=True)
ax = results['accuracy'].plot(title='Model\'s Accuracy')
ax.set_xlabel("Epoch");
ax = results[['train_loss','valid_loss']].plot(title='Model\'s Loss')
ax.set_xlabel("Epoch");
learn.export('resnet34-acc.82775')
Results¶
interp = ClassificationInterpretation.from_learner(learn)
losses,idxs = interp.top_losses()
interp.plot_confusion_matrix(figsize=(8,8))
from fastai.widgets.class_confusion import ClassConfusion
ClassConfusion??
conf = ClassConfusion(interp,classlist=classes)
interp.plot_top_losses(25, figsize=(13,13))
interp.most_confused(min_val=10)
interp.learn.show_results(rows=4,figsize=(10,14))
Inference¶
modelpath = Path('./cifar10/')
learn = load_learner(modelpath, file='resnet34-acc.82775', test=ImageList.from_folder(path/'test'))
learn.file = 'resnet34-acc.82775'
learn.file
learn.file = 'resnet34-acc.82775'
print(learn.file)
preds = learn.TTA(ds_type=DatasetType.Test)
preds = preds.argmax(dim=1)
classes = {
0:'airplane',
1:'automobile',
2:'bird',
3:'cat',
4:'deer',
5:'dog',
6:'frog',
7:'horse',
8:'ship',
9:'truck'
}
idxs = np.random.randint(0,len(preds),(10,))
xs = learn.data.test_ds.x[idxs]
zs = preds[idxs]
for i in range(10):
xs[i].show(title=str(classes[int(zs[i])]),figsize=(1,1))
learn.show_results(rows=3,ds_type=DatasetType.Test,figsize=(6,6))
learn.show_results(ds_type=DatasetType.Test,figsize=(10,10),preds=preds)
learn.show_results(rows=3,ds_type=DatasetType.Test,figsize=(6,6))
ax[0][0].plot(learn.data.test_dl)
for i,ax in enumerate(ax):
print(i,ax)
learn.pred_batch(ds_type=DatasetType.Test)
learn.data.test_ds[1000][0]
classes[int(preds[1000])]
learn.data.test_ds[1][0]
classes[int(preds[1])],preds[1]
preds = learn.pred_batch(ds_type=DatasetType.Test)
classes[preds]
classes[preds.argmax(dim=1)[1].item()]
learn.data.y
learn.data.show_batch(49,ds_type=DatasetType.Test,figsize=(10,10))
from google.colab import files
!ls -l '/root/.fastai/data/cifar10/models/'
!ls -l '/root/.fastai/data/cifar10/'
files.download('/root/.fastai/data/cifar10/resnet34-acc.82775')
files.download('/root/.fastai/data/cifar10/resnet34-acc.82775')