{"cells":[{"metadata":{},"cell_type":"markdown","source":"## tensorflow CNN implimentation\n\nHi all,\n\nthis notebook is for anyone who like to start with tensorflow based model for this competition. this show how to use tensorflow hub for transfer learning and tf addons for metrics.\n\n\nutilizing tensorflow addons for CohenKappa\n\nutilizing tensorflow hub for finetuning models\n\n### Note look at version 1 for output\n\nVideo\nhttps://www.youtube.com/playlist?list=PLz2_wbmGj3n6-fLQ9WmzQgKpXVWIG7ncX","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport skimage.io\nimport random\nimport numpy as np\nimport cv2\nimport tensorflow_hub as hub\nimport tensorflow as tf","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install tensorflow_addons\nimport tensorflow_addons as tfa","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Data reading","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/prostate-cancer-grade-assessment/train.csv\")\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_img_list  = os.listdir(\"/kaggle/input/prostate-cancer-grade-assessment/train_images\") \ntrain_mask_list = os.listdir(\"/kaggle/input/prostate-cancer-grade-assessment/train_label_masks\")\nprint(train_mask_list[0])\n# to get only the image id and not the mask extension\ntrain_mask_list = [filename.split('_')[0] for filename in train_mask_list ]\nprint(train_mask_list[0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## custom generator","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def ImageGenerator(df,batch_size = 2,img_path = None,mask_path = None,n_classes=2,size=(256,256)):\n    df_iterator = df.iterrows()\n    while True:\n        count = 0\n        image_list = []\n        mask_list = []\n        label_list = []\n        while count < batch_size:\n            try:\n                image_id, row = next(df_iterator)\n                #print(image_id)\n                image_path = img_path + image_id +'.tiff'\n                mask_img_path = mask_path + image_id + \"_mask.tiff\"\n                im = skimage.io.MultiImage(image_path)            \n                label_list.append(tf.keras.utils.to_categorical(int(row.isup_grade), n_classes))\n                image_list.append(cv2.resize(im[-1],size))\n                count += 1\n            except StopIteration:\n                del df_iterator\n                df_iterator = df.iterrows()\n        yield np.array(image_list)/255.,np.array(label_list)\n            \n            ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model creation","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Get the model.\ndef model_dense_fn():\n    \n    n_classes = 6\n\n    input_img = tf.keras.Input(shape=(512,512,3), name='color_sample')\n\n    densenet121 = tf.keras.applications.DenseNet121(\n        include_top=False, weights='imagenet', input_tensor=input_img, input_shape=None,\n        pooling=None, classes=1000\n    )\n    glob = layers.GlobalAveragePooling2D()(densenet121.output)\n    out = layers.Dense(n_classes,activation='softmax',  name='prediction')(glob)\n    model = keras.Model(inputs=input_img, outputs=out)\n    # Instantiate an optimizer.\n    optimizer = keras.optimizers.Adam(learning_rate=0.01)\n    # Instantiate a loss function.\n    loss_fn = keras.losses.CategoricalCrossentropy(from_logits=False)   \n    return model, optimizer, loss_fn\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def model_hub_bit():\n    \n    n_classes = 6\n    do_fine_tuning = True\n    MODULE_HANDLE = \"https://tfhub.dev/google/bit/s-r101x1/1\"\n    model = tf.keras.Sequential([\n        tf.keras.layers.InputLayer(input_shape=(512,512) + (3,)),\n        hub.KerasLayer(MODULE_HANDLE, trainable=do_fine_tuning),\n        tf.keras.layers.Dropout(rate=0.2),\n        tf.keras.layers.Dense(n_classes,activation='softmax',  name='prediction')\n    ])\n    model.build((None,)+(512,512)+(3,))\n    model.summary()\n    # Instantiate an optimizer.\n    optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)\n    # Instantiate a loss function.\n    loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=False)\n    \n    return model, optimizer, loss_fn\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model, optimizer, loss_fn = model_hub_bit()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n_classes = 6\nmodel.compile(\n    optimizer=optimizer, loss=loss_fn, metrics=['accuracy',tfa.metrics.CohenKappa(num_classes=n_classes,weightage='quadratic')])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Generator initialization","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train_corrected = train_df.sample(frac=1).set_index(\"image_id\")\nBATCH = 16\n\ntrain_gen = ImageGenerator(df_train_corrected[:-1000],batch_size = BATCH,img_path = \"/kaggle/input/prostate-cancer-grade-assessment/train_images/\",\n                   mask_path = \"/kaggle/input/prostate-cancer-grade-assessment/train_label_masks/\",\n                   n_classes=6,size=(512,512))\nvalid_gen = ImageGenerator(df_train_corrected[-1000:],batch_size = BATCH,img_path = \"/kaggle/input/prostate-cancer-grade-assessment/train_images/\",\n                   mask_path = \"/kaggle/input/prostate-cancer-grade-assessment/train_label_masks/\",\n                   n_classes=6,size=(512,512))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"checkpoint_filepath = 'check/train'\nmodel_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(\n    filepath=checkpoint_filepath,\n    save_weights_only=False,\n    monitor=\"val_cohen_kappa\",\n    save_best_only=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"EPOCH = 30\nv = model.fit_generator(\n    train_gen, steps_per_epoch=9000/BATCH, epochs=EPOCH,\n    validation_data=valid_gen, validation_steps=1000/BATCH, callbacks = [model_checkpoint_callback]\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Testing","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def ImageGenerator_test(df,batch_size = 2,img_path = None,mask_path = None,n_classes=2,size=(256,256)):\n    df_iterator = df.iterrows()\n    \n    \n    while True:\n        count = 0\n        image_list = []\n        mask_list = []\n        image_id_list = []\n        while count < batch_size:\n            try:\n                image_id, row = next(df_iterator)\n\n                image_path = img_path + image_id +'.tiff'\n\n                image_id_list.append(image_id)\n                im = skimage.io.MultiImage(image_path)\n                \n                image_list.append(cv2.resize(im[-1],size))\n\n                count += 1\n            except StopIteration:\n                del df_iterator\n                df_iterator = df.iterrows()\n\n        yield np.array(image_list)/255.,image_id_list","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"folder_name = 'train'\nif os.path.exists(f'../input/prostate-cancer-grade-assessment/{folder_name}_images'):\n    sub = df_train_corrected[-1000:]#pd.read_csv('../input/prostate-cancer-grade-assessment/sample_submission.csv') \n    #sub = pd.read_csv('../input/prostate-cancer-grade-assessment/train.csv') \n    test_img_list  = os.listdir(f\"../input/prostate-cancer-grade-assessment/{folder_name}_images\")\n    \n    df_test = df_train_corrected[-1000:]#pd.read_csv(f\"../input/prostate-cancer-grade-assessment/{folder_name}.csv\",index_col=\"image_id\")\n    BATCH = 16\n    test_gen = ImageGenerator_test(df_test,batch_size = BATCH,img_path = f\"../input/prostate-cancer-grade-assessment/{folder_name}_images/\",\n                   mask_path = \"../input/prostate-cancer-grade-assessment/test_label_masks/\",n_classes=6,size=(512,512))\n\n    prediction_list = []\n    image_id_list = []\n    for i in range (int(1100/BATCH)):\n        #print('testing')\n        v = next(test_gen)\n        image_id_list.extend(v[1])\n\n        prediction = np.argmax(model.predict(v[0]),axis = 1)\n        prediction_list.extend(prediction)\n\n\n    d = {'image_id': image_id_list, 'isup_grade': prediction_list}\n    df = pd.DataFrame(data=d)\n    df.head()    \n    #sub = pd.read_csv('../input/prostate-cancer-grade-assessment/sample_submission.csv')   \n    #sub.drop(labels= 'isup_grade',axis=1,inplace=True)\n    dff = pd.merge(sub,df,on='image_id')\n    dff.drop_duplicates(subset =\"image_id\", \n                         keep = \"first\",inplace = True) \n    \n    sub = dff","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"original = sub['isup_grade_x'].values\nprediction = sub['isup_grade_y'].values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import cohen_kappa_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"qwk = cohen_kappa_score(original, prediction, labels=None, weights= 'quadratic', sample_weight=None)\nprint(qwk)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!zip -r check.zip /kaggle/working/check/","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}