{"cells":[{"metadata":{"collapsed":true,"_uuid":"acec03a5349f652365134989c150cbdf28ba2076","trusted":true},"cell_type":"code","source":"# Put these at the top of every notebook, to get automatic reloading and inline plotting\n%reload_ext autoreload\n%autoreload 2\n%matplotlib inline\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt # showing and rendering figures\n# io related\nfrom skimage.io import imread\nimport os\nfrom glob import glob\n\nfrom fastai.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 *\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"85a91c810cfd4de369813dae37a18562d3e660a2","collapsed":true},"cell_type":"code","source":"from subprocess import check_output\nprint(check_output([\"ls\", \"../input/dr_data/DR_data/\"]).decode(\"utf8\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1f3bc62500ee5fc6f3fdfeac9138c106aded8a62","collapsed":true},"cell_type":"code","source":"PATH =\"../input/dr_data/DR_data/\"\nTMP_PATH = \"/tmp/tmp\"\nMODEL_PATH = \"/tmp/model/\"\narch=resnet34\nsz=224\ntfms=tfms_from_model(arch, sz)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9ba310c51d959cab508081d01d87a3aaa2ab5085","trusted":true,"collapsed":true},"cell_type":"code","source":"torch.cuda.is_available()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"aeffd45f60ecfcb90aa0cd37f09bbb89cbee8c01","trusted":true,"collapsed":true},"cell_type":"code","source":"torch.backends.cudnn.enabled","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"a9fb6a8048fa18c65800b1865876bf8cccfa0e86","trusted":true,"collapsed":true},"cell_type":"code","source":"fnames = np.array([f'train/{f}' for f in sorted(os.listdir(f'{PATH}train'))])\n","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"09f87570c2cd82eb3eed603565240021a5a888fe","trusted":true,"collapsed":true},"cell_type":"code","source":"img = plt.imread(f'{PATH}{fnames[0]}')\nplt.imshow(img);","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"1d87111c18c0cb0b3326f8e5ff61e18651c13b40"},"cell_type":"markdown","source":"Here is how the raw data looks like"},{"metadata":{"hidden":true,"_uuid":"5ba79cbbb1fbab9dbcbc35834f62a8b024942d2e","trusted":true,"collapsed":true},"cell_type":"code","source":"img.shape","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"cfef74b040d59c22cb769c6cdfa5cb9cf40066cf","trusted":true,"collapsed":true},"cell_type":"code","source":"img[2000:2004,1500:1504]","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true,"_uuid":"500f86792c2bd9c9373d883eb301b74219a9b2a7"},"cell_type":"markdown","source":"## Our first model: quick start"},{"metadata":{"collapsed":true,"_uuid":"7aa60a8f5fecaf1e2054fbb53029fa881108ea24","trusted":true},"cell_type":"code","source":"# Uncomment the below if you need to reset your precomputed activations\n# shutil.rmtree(f'{PATH}tmp', ignore_errors=True)","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"scrolled":false,"_uuid":"34c2f123f94ac01f68f8ab36a2943486fbe35ab5","trusted":true,"collapsed":true},"cell_type":"code","source":"data= ImageClassifierData.from_csv(path=PATH,\n                                      folder='train', \n                                      csv_fname='../input/trainLabels_3.csv'\n                                      , tfms=tfms, test_name='test', \n                                       suffix='.jpeg')\nlearn = ConvLearner.pretrained(arch, data, precompute=True, tmp_name=TMP_PATH, models_name=MODEL_PATH)\nlearn.fit(0.01, 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f398c5ce068a1c5b37d4db10088d9322c3aedc4b","collapsed":true},"cell_type":"code","source":"data","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true,"_uuid":"17f0e5c8170bbcd4a0371c95d5a136e9674f7c31"},"cell_type":"markdown","source":"## Analyzing results: looking at pictures"},{"metadata":{"hidden":true,"_uuid":"942e14027848dcad6d6c80422b5bbf56f63bc1c7","trusted":true,"collapsed":true},"cell_type":"code","source":"# This is the label for a val data\ndata.val_y","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"6378a93c7e03118e0b12d423d31b2be8f95c1005","trusted":true,"collapsed":true},"cell_type":"code","source":"# from here we know that 'cats' is label 0 and 'dogs' is label 1.\ndata.classes","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"1326d53d70acad37272afa71c20d6ff39e165c89","trusted":true,"collapsed":true},"cell_type":"code","source":"# this gives prediction for validation set. Predictions are in log scale\nlog_preds = learn.predict()\nlog_preds.shape","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"b7ff16accb5fa5104de318bd261abcdee72530aa","trusted":true,"collapsed":true},"cell_type":"code","source":"log_preds[:10]","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"hidden":true,"_uuid":"b8709f3bac05d50ee2f7b0b774eb86af8f0f709c","trusted":true},"cell_type":"code","source":"preds = np.argmax(log_preds, axis=1)  # from log probabilities to 0 or 1\nprobs = np.exp(log_preds[:,0])        # pr(no DR)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"hidden":true,"_uuid":"37901ee29c7a90714b6385d51eb4126b890f4f8e","trusted":true},"cell_type":"code","source":"def rand_by_mask(mask): return np.random.choice(np.where(mask)[0], 4, replace=False)\ndef rand_by_correct(is_correct): return rand_by_mask((preds == data.val_y)==is_correct)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"hidden":true,"_uuid":"f9de40f3a17b608fb5c4baea893e138c88464fd7","trusted":true},"cell_type":"code","source":"def plots(ims, figsize=(12,6), rows=1, titles=None):\n    f = plt.figure(figsize=figsize)\n    for i in range(len(ims)):\n        sp = f.add_subplot(rows, len(ims)//rows, i+1)\n        sp.axis('Off')\n        if titles is not None: sp.set_title(titles[i], fontsize=16)\n        plt.imshow(ims[i])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"hidden":true,"_uuid":"f64c7bef125f50701884273ed8d161de25b9703b","trusted":true},"cell_type":"code","source":"def load_img_id(ds, idx): return np.array(PIL.Image.open(PATH+ds.fnames[idx]))\n\ndef plot_val_with_title(idxs, title):\n    imgs = [load_img_id(data.val_ds,x) for x in idxs]\n    title_probs = [probs[x] for x in idxs]\n    print(title)\n    return plots(imgs, rows=1, titles=title_probs, figsize=(16,8))","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"9b2fac071b6f72c82cb4a499dffe9dc77b5b57e3","trusted":true,"collapsed":true},"cell_type":"code","source":"# 1. A few correct labels at random\nplot_val_with_title(rand_by_correct(True), \"Correctly classified\")","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"2380c1cc7a75c19c96a72fdafed058c7fbd92815","trusted":true,"collapsed":true},"cell_type":"code","source":"# 2. A few incorrect labels at random\nplot_val_with_title(rand_by_correct(False), \"Incorrectly classified\")","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"hidden":true,"_uuid":"c0782f2afa83cc74dac7239cb7d6fa5d7f034aab","trusted":true},"cell_type":"code","source":"def most_by_mask(mask, mult):\n    idxs = np.where(mask)[0]\n    return idxs[np.argsort(mult * probs[idxs])[:4]]\n\ndef most_by_correct(y, is_correct): \n    mult = -1 if (y==1)==is_correct else 1\n    return most_by_mask(((preds == data.val_y)==is_correct) & (data.val_y == y), mult)","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"127110ef2fedc2f795b08d494adf9ce7d666d88c","trusted":true,"collapsed":true},"cell_type":"code","source":"plot_val_with_title(most_by_correct(0, True), \"Most correct No Retinopathy\")","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"c59754e3ca49c83553d7b86959071fd331a3e4f2","trusted":true,"collapsed":true},"cell_type":"code","source":"plot_val_with_title(most_by_correct(4, True), \"Most correct Retinopathy\")","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"e47ad9fca54f184cf737e77103987ea6d89ebddc","trusted":true,"collapsed":true},"cell_type":"code","source":"plot_val_with_title(most_by_correct(0, False), \"Most incorrect No Retinopathy\")","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"5f4b6c4800ce0c32a3619205607e574231b5bae1","trusted":true,"collapsed":true},"cell_type":"code","source":"plot_val_with_title(most_by_correct(1, False), \"Most incorrect Retinopathy\")","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"_uuid":"3fa2abbbf44c4b364d8415df7566419742935146","trusted":true,"collapsed":true},"cell_type":"code","source":"most_uncertain = np.argsort(np.abs(probs -0.5))[:4]\nplot_val_with_title(most_uncertain, \"Most uncertain predictions\")","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"},"toc":{"colors":{"hover_highlight":"#DAA520","navigate_num":"#000000","navigate_text":"#333333","running_highlight":"#FF0000","selected_highlight":"#FFD700","sidebar_border":"#EEEEEE","wrapper_background":"#FFFFFF"},"moveMenuLeft":true,"nav_menu":{"height":"266px","width":"252px"},"navigate_menu":true,"number_sections":true,"sideBar":true,"threshold":4,"toc_cell":false,"toc_section_display":"block","toc_window_display":false,"widenNotebook":false}},"nbformat":4,"nbformat_minor":1}