{"cells":[{"metadata":{"_uuid":"81833d75efc9bc0a893f853f4f961f4e42b79a4b"},"cell_type":"markdown","source":"# Dog breeds\n## Using Fast.ai's Deep Learning techniques to validate the highest accuracy in the classification of dog breeds"},{"metadata":{"trusted":false,"_uuid":"8a41d56d58333b9194ac49ffd2e060d4beee7cc7"},"cell_type":"code","source":"%reload_ext autoreload\n%autoreload 2\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"e24ff0dd32c2790d3d2eb3d58fb8706ce98e53e3"},"cell_type":"code","source":"#import sys\n#sys.path.append(\"../fastai\") ","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f70960f6ed6118c4ca5c50afcceb07ea5a656544"},"cell_type":"code","source":"from fastai.imports import *\nfrom fastai.torch_imports import *\nfrom fastai.transforms import *\nfrom fastai.conv_learner import *\nfrom fastai.model import *\nfrom fastai.dataset import *\nfrom fastai.sgdr import *\nfrom fastai.plots import *","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5d262103e66c0f87b16486d023bd2379368d5527"},"cell_type":"raw","source":"torch.cuda.set_device(1)"},{"metadata":{"trusted":false,"_uuid":"f0d9273b33e2144ad75947f06771ace3d1e8bcea"},"cell_type":"code","source":"PATH = \"data/\"\nsz=224\narch=resnext101_64\nbs=58","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"a13bfb1cac99987d76bc103fd29d25e7d4af1afb"},"cell_type":"code","source":"label_csv = f'{PATH}labels.csv'\nn = len(list(open(label_csv)))-1\nval_idx = get_cv_idxs(n)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"dff7e80d275462a0456803aafc8bdcc30b07f98b"},"cell_type":"markdown","source":"## Data Exploration after unzipping"},{"metadata":{"trusted":false,"_uuid":"457682f2abd188a44922d4dc78304925a7822613"},"cell_type":"code","source":"!pwd\n!ls {PATH}","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f288b4bafc81cbdea4caa7f9c165c13e6d4b939d"},"cell_type":"code","source":"label_df= pd.read_csv(label_csv)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"311590f5e2b7dfcb82c9fd3baf8f6a5697ced0d8"},"cell_type":"code","source":"label_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"63ad25bd9a462ce10f1d398a38eef788f733fdb5"},"cell_type":"code","source":"label_df.pivot_table(index='breed',aggfunc=len).sort_values('id',ascending=False).head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"dafb439ab3e47223650c3c7a4ce29a57da3ce10e"},"cell_type":"code","source":"transformations = tfms_from_model(arch,sz,aug_tfms=transforms_side_on,max_zoom=1.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"56b7d61ee020b073b5d6bcb0706aef5be73977bb"},"cell_type":"code","source":"data = ImageClassifierData.from_csv(PATH,'train', f'{PATH}labels.csv',test_name='test',val_idxs=val_idx,suffix='.jpg',tfms=transformations,bs=bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"78d0f7da20e89402dfefb462a6d4d41a1c4dacd8"},"cell_type":"code","source":"fn=PATH+data.trn_ds.fnames[0]; fn","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"b649eaa393d92614855c5e3eba4e4ce298568676"},"cell_type":"code","source":"n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"8e11d3984affc57e44528fc8ca92a94de0149d97"},"cell_type":"code","source":"val_idx","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"fab94b4f6721a0797fc858e2c919457c7c7f7b87"},"cell_type":"code","source":"len(val_idx)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"8b860cf3b6b2ea88251597d9f673c52a1700c1cd"},"cell_type":"code","source":"img = PIL.Image.open(fn); img","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"dfaff9c29d25228fd09690b5fd70edcfced29f04"},"cell_type":"code","source":"img.size","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"192870c1d5517d37d5df26f9494713308555b2d5"},"cell_type":"code","source":"size_d = {k:PIL.Image.open(PATH+k).size for k in data.trn_ds.fnames}","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"1476121fb54d15eac6751a70257914da3856fcaa"},"cell_type":"code","source":"row_sz,col_sz = list(zip(*size_d.values()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"8f9dd81bbcfe1fd9fc919142a129d2ea7b5394d8"},"cell_type":"code","source":"row_sz = np.array(row_sz);col_sz= np.array(col_sz)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"4048516af6c11d37d01aa131935cd154f9ee65a4"},"cell_type":"code","source":"row_sz[:5]","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"8e4fc26109e33e2c99a02f6e5ad0978574770662"},"cell_type":"code","source":"plt.hist(row_sz);","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"7550c97c342ca88fe413383b4f4695b08709b114"},"cell_type":"code","source":"plt.hist(row_sz[row_sz<1000]);","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cd85103e8f625bb4576b567841df358c4b5dbe8e"},"cell_type":"markdown","source":"# Initial model"},{"metadata":{"trusted":false,"_uuid":"2403a046b6f4efdcfc1e2bff1ce1942832ea73c7"},"cell_type":"code","source":"def get_data(sz,bs):\n    tfms = tfms_from_model(arch,sz,aug_tfms=transforms_side_on,max_zoom=1.2)\n    data = ImageClassifierData.from_csv(PATH,'train',f'{PATH}labels.csv',test_name='test',num_workers=4, \n                                        val_idxs=val_idx,suffix='.jpg',tfms=tfms,bs=bs)\n    return data if sz >300 else data.resize(340,'tmp')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c6c874650f85d8ad50349e35115e9857adeadcfd"},"cell_type":"markdown","source":"## Precompute"},{"metadata":{"trusted":false,"_uuid":"919c30ca0d4fbeaa4889e171665dd81a955acefa"},"cell_type":"code","source":"data = get_data(sz,bs)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":false,"_uuid":"75b803bb98942cbdf62f90bd9c9a243e2f216341"},"cell_type":"code","source":"learn = ConvLearner.pretrained(arch,data,precompute=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"3f9f37ce26432ee6d207128fc390199870a23f9e"},"cell_type":"code","source":"learn.fit(1e-2,5)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"fbad494ff96fd6dcedf3c16889a3faee698110a3"},"cell_type":"markdown","source":"## Augment"},{"metadata":{"trusted":false,"_uuid":"f61b38522c3b462ba7820b0122aa8850f580bcee"},"cell_type":"code","source":"from sklearn import metrics","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"22081f138efa6f5eed6e4b7b90b7cf1d1695b007"},"cell_type":"code","source":"data = get_data(sz,bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"2273c29460f29d1498430631ad8c7c3ec4d69a5e"},"cell_type":"code","source":"learn = ConvLearner.pretrained(arch,data,precompute=True,ps=0.5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d12224f355ac54f4388125c64a478657e8aae632"},"cell_type":"code","source":"learn.fit(1e-2,2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"a0ea1fcdfb38ae84f40658344d3545d1da4f34ff"},"cell_type":"code","source":"learn.precompute=False","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"20eb67852b5bb509b4a40015a63009dacf1789f8"},"cell_type":"code","source":"learn.fit(1e-2, 5, cycle_len=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f24dbe709b83c08c85b667dc7db3899597ebbdeb"},"cell_type":"code","source":"learn.fit(1e-2, 3, cycle_len=1, cycle_mult=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"e93e194fe192b6de7a704dfd1bd5b06ad6bd6e46"},"cell_type":"code","source":"learn.save('224_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"229c4c44405a2d57daff3ea35fec492dcfddf3d1"},"cell_type":"code","source":"learn.load('224_pre')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9ea02b035b695a49aa8faaeb4f408e20980f94f1"},"cell_type":"markdown","source":"## Increase size"},{"metadata":{"trusted":false,"_uuid":"e231ac73b79f608c41e92c1c4b6d0665cbae9d77"},"cell_type":"code","source":"learn.set_data(get_data(299,bs))\nlearn.freeze()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"859990c6cbc56e001fa4c7bfd98f9e8ba7e2fc83"},"cell_type":"code","source":"learn.fit(1e-2, 3, cycle_len=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"10666a940978b1bae6bc62f556793e514ab424b2"},"cell_type":"code","source":"learn.fit(1e-2, 3, cycle_len=1, cycle_mult=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"9b2b3f839c5486f9071ab7001de9d7cdebf14c71"},"cell_type":"code","source":"log_preds,y = learn.TTA()\nprobs = np.mean(np.exp(log_preds), axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"a444aebff6a66089c8c86bca1dd8e8a4f9c8c144"},"cell_type":"code","source":"accuracy_np(probs,y), metrics.log_loss(y, probs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"696df6bfca75d48e141d90124538ac5bc7b6e2d8"},"cell_type":"code","source":"learn.save('299_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"04aae03f8b0161230c370acf7206d9ab9c4c194a"},"cell_type":"code","source":"learn.load('299_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"5baf6cee87edea26e6265c219da822fbae7e4167"},"cell_type":"code","source":"learn.fit(1e-2,1,cycle_len=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"0aef52bd1f2b6f9a0574dda0f2fde2c3c850dda9"},"cell_type":"code","source":"log_preds,y = learn.TTA(is_test=True)\nprobs = np.exp(log_preds)\nprobs.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"1018eacc1ca7e72ff24675ab1b05da22e6fab7dd"},"cell_type":"code","source":"probs[0,:,:].shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"5d3561eeff2f178305e74cf66cdaff94580784d4"},"cell_type":"code","source":"data.classes","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"29fee6cd6d38037a3ce0515d8b6d999e722b2293"},"cell_type":"code","source":"df = pd.DataFrame(probs[0,:,:], columns = data.classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"cd4d4a006236df81bf7f9a7eb191ab867ae5a75c"},"cell_type":"code","source":"df.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"cacae8f0425e33d746366ac52f80102ccaec57e6"},"cell_type":"code","source":"df.insert(0,'id',[o[5:-4] for o in data.test_ds.fnames])","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"398f8084119b01fa1468b4a0c527c2360ea72d6f"},"cell_type":"code","source":"df.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d493729a6a232e7e57f1ad86d05a9e12815c2185"},"cell_type":"code","source":"df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"b9252a82d726c77907ec6b990b9004b6aea29e0b"},"cell_type":"code","source":"SUBM = f'{PATH}subm/'\nos.makedirs(SUBM,exist_ok=True)\ndf.to_csv(f'{SUBM}subm.gz', compression='gzip',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"44284ec5a15017146f8f11f13ab663df42b6d97e"},"cell_type":"code","source":"FileLink(f'{SUBM}subm.gz')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"83a3cf61d04e5395f4f69a6d8391d23202205eee"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.7"}},"nbformat":4,"nbformat_minor":1}