{"cells":[{"metadata":{"_uuid":"bce826e1babe0164244c49fc4a0fd1d836e1da41"},"cell_type":"markdown","source":"# 1 Dog Breeds\n"},{"metadata":{"trusted":true,"_uuid":"da7d430b5da2757f97377e1f0dc2f06e2f07d610","collapsed":true},"cell_type":"code","source":"###  majic calls\n%reload_ext autoreload\n%autoreload 2\n%matplotlib inline\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2650a0d7c7fd94c5b56d741613d7f8297db5cb10","collapsed":true},"cell_type":"code","source":"# Fastai's Library\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 *\nfrom fastai.imports import *","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"175215525405a4860dc1d4c3113b155ef934b47e"},"cell_type":"markdown","source":"## A path to the data"},{"metadata":{"trusted":true,"_uuid":"d951b6e4e3ef2d2400a77fb4f89d469d1666fa1f"},"cell_type":"code","source":"torch.cuda.set_device(1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4c4df2bf4bc4a526154f8c7e2e2b91ab7321e230","collapsed":true},"cell_type":"code","source":"PATH = \"../input/\"\nsz=224\narch=resnext101_64\nbs=58","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"97fdaf686de1749857212d0750370e6301dadd38"},"cell_type":"markdown","source":"### label a path to the data"},{"metadata":{"trusted":true,"_uuid":"28e991d63d0cfc91a61885de5923a9f2a8f8b60a"},"cell_type":"code","source":"label_csv = f'{PATH}labels.csv'\nn = len(list(open(label_csv)))-1\nval_idxs = get_cv_idxs(n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3d3f8d2d979854d521b8aaacfd85576cb8c54b12"},"cell_type":"code","source":"n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c771f3696f986dd3b4bfb9fa49537eb313eef2d3"},"cell_type":"code","source":"len(val_idxs)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"dc443ed94950a58aedd69299f4be19f24d8f99c0"},"cell_type":"markdown","source":"# 2 Initial exploration"},{"metadata":{"trusted":true,"_uuid":"9cdde3ecc859dbbea0400dd1fa13f5a1292896f7"},"cell_type":"code","source":"!ls {PATH}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0ccf2ae8b8adf7239e9fb59ac52733ced4391fd7","collapsed":true},"cell_type":"code","source":"label_df = pd.read_csv(label_csv)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"99f5ca0cb73412f17af5bbc212f3fe0f738a8a28"},"cell_type":"code","source":"label_df.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"0a5ed9ce05010c764585cf027ccf66b326e1dc66"},"cell_type":"code","source":"label_df.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5d780c93a440a679503e4946f078536688faafea"},"cell_type":"code","source":"label_df.pivot_table(index='breed', aggfunc=len).sort_values('id',ascending=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"489b37722cb6ae5f6d9c232bf8720a7ebe46c106","collapsed":true},"cell_type":"code","source":"tfms = tfms_from_model(arch,sz,aug_tfms=transforms_side_on, max_zoom=1.1)\ndata = ImageClassifierData.from_csv(PATH, 'train', f'{PATH}labels.csv',test_name='test',\n                                     val_idxs=val_idxs, suffix='.jpg', tfms=tfms,bs=bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"157b0d75fbb3d92955b79967e512eb43f197c172"},"cell_type":"code","source":"fn = PATH+data.trn_ds.fnames[0]; fn","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"59c442d14deda9c6bdd0fe7735e6b3dd50450303"},"cell_type":"markdown","source":"### 3.1 Precompute"},{"metadata":{"trusted":false,"_uuid":"593682dc6ec5c8a7bd60c25e9a911fabb9aea710","collapsed":true},"cell_type":"code","source":"Here we need to find out how big the sizes are for the rows and columns of the images","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0c6929605cbc09fda65190aefea66dd909ba2970"},"cell_type":"code","source":"fn = PATH+data.trn_ds.fnames[0]; fn","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"671c0c94fd9f692bac23e1f32749053bf59a61b4"},"cell_type":"code","source":"img = PIL.Image.open(fn); img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"91de6ab4166b4d28f2affd6aba77ea83eec01482"},"cell_type":"code","source":"img.size\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4fbeb642a6b8aaf758c52392f864ec6d30f390f4","collapsed":true},"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":true,"_uuid":"2c59c92f4e8d12913e5a7a9cb678ff04ea36987c","collapsed":true},"cell_type":"code","source":"row_sz,col_sz = list(zip(*size_d.values()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3899393098d646af31cc8c843e9aa438ef6749d5"},"cell_type":"code","source":"row_sz=np.array(row_sz); col_sz=np.array(col_sz)\nrow_sz[:5]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ad126922111541a10a5aa49cce2f63a52aa4f842"},"cell_type":"code","source":"plt.hist(row_sz)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c269ea2c9df44a261b5fb9f5dba98b93e56414bd"},"cell_type":"code","source":"plt.hist(row_sz[row_sz<1000])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f440f55abe9bf38acef5b5fd3198b762435c8c8d"},"cell_type":"code","source":"len(data.trn_ds), len(data.test_ds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8ec0d46287eff479153f67de0595d5572f4a927c"},"cell_type":"code","source":"len(data.classes), data.classes[:5]","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"df62cec23285a89936d5383cc02b77f384bf9b9c","collapsed":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"557fea81e59065bfc0bca12363a4678049a4f5d6"},"cell_type":"markdown","source":"# 3 Initial model"},{"metadata":{"trusted":true,"_uuid":"69dca55b6e64981222f84a766e3d31f947242662","collapsed":true},"cell_type":"code","source":"def get_data(sz,bs):\n    tfms = tfms_from_model(arch,sz,aug_tfms=transforms_side_on, max_zoom=1.1)\n    data = ImageClassifierData.from_csv(PATH, 'train', f'{PATH}labels.csv',test_name='test', num_workers=4,\n                                        val_idxs=val_idxs, suffix='.jpg', tfms=tfms,bs=bs)\n ","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"dc948ae07fb7cbf1423c3358bf697447025124e6"},"cell_type":"markdown","source":"## 3.1 Precompute"},{"metadata":{"trusted":true,"_uuid":"ecf3d3bb37ada10f89fbd600f827ff0f8ebd2a57"},"cell_type":"code","source":"data = get_data(sz,bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7e225c0e16e63a167be9f6a3c754b444f91086c7"},"cell_type":"code","source":"learn = ConvLearner.pretrained(arch, data, precompute=True) \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4784c500aadefdbcbf8b2ce5c353ddb61e077a4e"},"cell_type":"code","source":"learn.fit(1e-2,5)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"650b34cf8976a5e051af1baa7ec0f905f993af4a"},"cell_type":"markdown","source":"## 3.2 Augment"},{"metadata":{"trusted":false,"_uuid":"083eab335234a0825e19c6646cea30fb30cca36b","collapsed":true},"cell_type":"code","source":"from sklearn import metric","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d4464a5d9a2b4b1ba48e270f4cd5f10448110d70","collapsed":true},"cell_type":"code","source":"data = get_data(sz,bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"ff9fe9b6470e83dfe206320d908aadefb62af737","collapsed":true},"cell_type":"code","source":"learn = ConvLearner.pretrained(arch, data, precompute=True,ps=0.5) \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"ee97ed376b7a54b4f6d0e780b6b553034852fa2a","collapsed":true},"cell_type":"code","source":"learn.fit(1e-2,2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"932f963652f8d5bfb4dfbf1fea8ea4f4fe02d952","collapsed":true},"cell_type":"code","source":"learn.precompute=False","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"b8a1abc00fcb6e52514a60aafb93c474c6c45e1e","collapsed":true},"cell_type":"code","source":"learn.fit(1e-2,5,cycle_len=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"41e6a96c1b70baa9515c8d50b713ae79727fa1c4","collapsed":true},"cell_type":"code","source":"learn.save('224_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6c6215b1ed6e272f9d7609a3954ec77c5a236026","collapsed":true},"cell_type":"code","source":"learn.load('224_pre')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ee8eaecd66609aadb6e125536472314a8229d317"},"cell_type":"markdown","source":"## 3.3 Increase Size"},{"metadata":{"trusted":false,"_uuid":"0c023b7dc3f5ded05c7bbc2aa4b413c8a2c4b622","collapsed":true},"cell_type":"code","source":"learn.set_data(get_data(299,bs))\nlearn.freeze()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6070c9f2829bc04685133709a3d189e61af43756","collapsed":true},"cell_type":"code","source":"learn.fit(1e-2,3,cycle_len=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d8458fb7b1debf814241944073f03bee405ad294"},"cell_type":"markdown","source":"We are underfiting our data/ [loss of training][loss of validation][Accuracy]"},{"metadata":{"trusted":false,"_uuid":"e0bb7ac55283c6c43cb6931abf8d47aebed7ecbc","collapsed":true},"cell_type":"code","source":"learn.fit(1e-2,3,cycle_len=1,cycle_mult=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"dcf38c54f4da648214bbe3b600b8d25d03059732","collapsed":true},"cell_type":"code","source":"log_preds,y = learn.TTA()\nprobs = np.exp(log_preds)\naccuracy(log_preds,y), metrics.log_loss(y,probs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"17a0c19d0de0fbb234a0a004b96bd4b6f39160c3","collapsed":true},"cell_type":"code","source":"learn.save('299_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"2d078708b8f0e097d49da01f7d0cd2a5bfb296c9","collapsed":true},"cell_type":"code","source":"learn.load('299_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"aaa6a5c9dc86816e172cbdb581b028ba9c93c830","collapsed":true},"cell_type":"code","source":"learn.fit(1e-2,3,cycle_len=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6cae4f6c1f50d720de933ae5e069c0d0a765ffda","collapsed":true},"cell_type":"code","source":"learn.save('299_pre')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"444a67c55a2f5ae241d449d0f380238ade9747bb","collapsed":true},"cell_type":"code","source":"log_preds,y = learn.TTA()\nprobs = np.exp(log_preds)\naccuracy(log_preds,y), metrics.log_loss(y,probs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"e5cc3b5ec45e4feec55a34015e6f6515ee87224c","collapsed":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"1e4b74fba4bc9715694c34139a3adde90adb858a","collapsed":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}