{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 2. Préparation de la base de données\n\n### 2.1 importer les bibliothèques nécessaires","metadata":{"papermill":{"duration":0.045646,"end_time":"2021-02-03T06:25:28.307357","exception":false,"start_time":"2021-02-03T06:25:28.261711","status":"completed"},"tags":[],"id":"HeXxCMF611Ph"}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport random, re, math\nimport tensorflow as tf, tensorflow.keras.backend as K\nimport tensorflow_addons as tfa\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import optimizers\nfrom kaggle_datasets import KaggleDatasets\nfrom tensorflow.keras.models import Sequential\nimport tensorflow.keras.layers as L\nfrom tensorflow.keras.applications import ResNet152V2, InceptionResNetV2, InceptionV3, Xception, VGG19\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D,GlobalMaxPooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau , EarlyStopping , ModelCheckpoint , LearningRateScheduler\nfrom keras import regularizers\n\nimport matplotlib.pyplot as plt\n\n!pip install efficientnet\nimport efficientnet.tfkeras as efn","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2021-02-03T06:25:28.410889Z","iopub.status.busy":"2021-02-03T06:25:28.410137Z","iopub.status.idle":"2021-02-03T06:25:45.384712Z","shell.execute_reply":"2021-02-03T06:25:45.383655Z"},"papermill":{"duration":17.034143,"end_time":"2021-02-03T06:25:45.384939","exception":false,"start_time":"2021-02-03T06:25:28.350796","status":"completed"},"tags":[],"id":"0ODU5JjE11Pi","outputId":"c936bae3-1727-42af-9a83-772e0837a383","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.2 Configuration de tpu","metadata":{"papermill":{"duration":0.047351,"end_time":"2021-02-03T06:25:45.480383","exception":false,"start_time":"2021-02-03T06:25:45.433032","status":"completed"},"tags":[],"id":"H7U18Z-m11Pj"}},{"cell_type":"code","source":"AUTO = tf.data.experimental.AUTOTUNE\ntry:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n    print('Running on TPU ', tpu.master())\nexcept ValueError:\n    tpu = None\n\nif tpu:\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu)\nelse:\n    strategy = tf.distribute.get_strategy()\n\nprint(\"REPLICAS: \", strategy.num_replicas_in_sync)\n","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.execute_input":"2021-02-03T06:25:45.57978Z","iopub.status.busy":"2021-02-03T06:25:45.578987Z","iopub.status.idle":"2021-02-03T06:25:51.339602Z","shell.execute_reply":"2021-02-03T06:25:51.339045Z"},"papermill":{"duration":5.811764,"end_time":"2021-02-03T06:25:51.339778","exception":false,"start_time":"2021-02-03T06:25:45.528014","status":"completed"},"tags":[],"id":"Mqd82DVQ11Pj","outputId":"c7e20587-597e-4c26-b5e7-05605a439cbd","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"GCS_DS_PATH = KaggleDatasets().get_gcs_path('vinbigdata-512-image-dataset')","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:51.45649Z","iopub.status.busy":"2021-02-03T06:25:51.455624Z","iopub.status.idle":"2021-02-03T06:25:52.160281Z","shell.execute_reply":"2021-02-03T06:25:52.160803Z"},"papermill":{"duration":0.7745,"end_time":"2021-02-03T06:25:52.161","exception":false,"start_time":"2021-02-03T06:25:51.3865","status":"completed"},"tags":[],"id":"ZzlXICfW11Pk","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/bigbigvin/bigvin2020')\ntrain_paths = train.image_id.apply(lambda x: GCS_DS_PATH+ '/train/' + x ).values\ntrain_labels = train.class_id.values","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:52.258775Z","iopub.status.busy":"2021-02-03T06:25:52.258083Z","iopub.status.idle":"2021-02-03T06:25:52.324572Z","shell.execute_reply":"2021-02-03T06:25:52.323875Z"},"papermill":{"duration":0.117217,"end_time":"2021-02-03T06:25:52.324719","exception":false,"start_time":"2021-02-03T06:25:52.207502","status":"completed"},"tags":[],"id":"NqUhNJ9p11Pk","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_paths","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=train.drop(columns=['Lung Opacity','Infiltration','ILD','Nodule/Mass','Other lesion','Pleural effusion'],axis=1)","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:52.574602Z","iopub.status.busy":"2021-02-03T06:25:52.573928Z","iopub.status.idle":"2021-02-03T06:25:52.579517Z","shell.execute_reply":"2021-02-03T06:25:52.580063Z"},"papermill":{"duration":0.065707,"end_time":"2021-02-03T06:25:52.580245","exception":false,"start_time":"2021-02-03T06:25:52.514538","status":"completed"},"tags":[],"id":"Sqaws90h11Pl","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=train.drop(columns=['Aortic enlargement','Atelectasis','Calcification','Cardiomegaly','Consolidation','Pleural thickening'],axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=train.drop(columns=['Pulmonary fibrosis'],axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2.3 Normal Vs Cataract","metadata":{"papermill":{"duration":0.048221,"end_time":"2021-02-03T06:25:52.676486","exception":false,"start_time":"2021-02-03T06:25:52.628265","status":"completed"},"tags":[],"id":"iOiwkf4b11Pl"}},{"cell_type":"code","source":"train=train[((train['No finding']== 1) | (train['Pneumothorax'] == 1))]","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:52.775507Z","iopub.status.busy":"2021-02-03T06:25:52.774806Z","iopub.status.idle":"2021-02-03T06:25:52.800206Z","shell.execute_reply":"2021-02-03T06:25:52.800914Z"},"papermill":{"duration":0.077621,"end_time":"2021-02-03T06:25:52.801099","exception":false,"start_time":"2021-02-03T06:25:52.723478","status":"completed"},"tags":[],"id":"ZzmycFMb11Pl","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:52.898988Z","iopub.status.busy":"2021-02-03T06:25:52.898331Z","iopub.status.idle":"2021-02-03T06:25:52.913181Z","shell.execute_reply":"2021-02-03T06:25:52.91378Z"},"papermill":{"duration":0.065475,"end_time":"2021-02-03T06:25:52.914003","exception":false,"start_time":"2021-02-03T06:25:52.848528","status":"completed"},"tags":[],"id":"ty3qH3eZ11Pl","outputId":"7e8bc7d8-fbbb-48db-fc50-f6872a026d95","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.4 Diviser notre dataset en 80% l'entraînement et 20% pour le test","metadata":{"papermill":{"duration":0.04791,"end_time":"2021-02-03T06:25:53.010799","exception":false,"start_time":"2021-02-03T06:25:52.962889","status":"completed"},"tags":[],"id":"IrVIZDP011Pl"}},{"cell_type":"code","source":"train,valid = train_test_split(train,test_size = 0.2,random_state = 42)","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:53.110809Z","iopub.status.busy":"2021-02-03T06:25:53.110091Z","iopub.status.idle":"2021-02-03T06:25:53.116473Z","shell.execute_reply":"2021-02-03T06:25:53.116997Z"},"papermill":{"duration":0.058047,"end_time":"2021-02-03T06:25:53.117174","exception":false,"start_time":"2021-02-03T06:25:53.059127","status":"completed"},"tags":[],"id":"24sR2xDQ11Pm","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3 Hyperparamètre","metadata":{"papermill":{"duration":0.047729,"end_time":"2021-02-03T06:25:53.212112","exception":false,"start_time":"2021-02-03T06:25:53.164383","status":"completed"},"tags":[],"id":"8DNFhDWk11Pm"}},{"cell_type":"code","source":"BATCH_SIZE = 8* strategy.num_replicas_in_sync\nimg_size = 512\nEPOCHS = 10\nSEED = 42","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:53.31113Z","iopub.status.busy":"2021-02-03T06:25:53.310152Z","iopub.status.idle":"2021-02-03T06:25:53.314715Z","shell.execute_reply":"2021-02-03T06:25:53.31518Z"},"papermill":{"duration":0.055737,"end_time":"2021-02-03T06:25:53.315403","exception":false,"start_time":"2021-02-03T06:25:53.259666","status":"completed"},"tags":[],"id":"bS6QepHq11Pm","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4. Prétraitement des données","metadata":{"papermill":{"duration":0.047296,"end_time":"2021-02-03T06:25:53.410566","exception":false,"start_time":"2021-02-03T06:25:53.36327","status":"completed"},"tags":[],"id":"tFR0jq9l11Pm"}},{"cell_type":"code","source":"def decode_image(filename, label=None, image_size=(img_size,img_size)):\n    bits = tf.io.read_file(filename)\n    image = tf.image.decode_jpeg(bits, channels=3) \n    image = tf.image.resize(image, image_size)\n    image = tf.cast(image, tf.float32)\n    image = tf.image.per_image_standardization(image)\n    if label is None:\n        return image\n    else:\n        return image, label\n    \ndef preprocess(df,test=False):\n    paths = df.image_id.apply(lambda x: GCS_DS_PATH+ '/train/' + x +'.png').values\n    labels = df.loc[:, ['No finding', 'Pneumothorax']].values\n    if test==False:\n        return paths,labels\n    else:\n        return paths\n    \ndef data_augment(image, label=None, seed=SEED):\n    image = tf.image.random_flip_left_right(image, seed=seed)\n    image = tf.image.random_flip_up_down(image, seed=seed)\n           \n    if label is None:\n        return image\n    else:\n        return image, label","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:53.510574Z","iopub.status.busy":"2021-02-03T06:25:53.509602Z","iopub.status.idle":"2021-02-03T06:25:53.520775Z","shell.execute_reply":"2021-02-03T06:25:53.520054Z"},"papermill":{"duration":0.062563,"end_time":"2021-02-03T06:25:53.520924","exception":false,"start_time":"2021-02-03T06:25:53.458361","status":"completed"},"tags":[],"id":"_0TMwTsZ11Pn","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5. Augmentation","metadata":{"papermill":{"duration":0.047443,"end_time":"2021-02-03T06:25:53.617012","exception":false,"start_time":"2021-02-03T06:25:53.569569","status":"completed"},"tags":[],"id":"2mEK5bCV11Pn"}},{"cell_type":"code","source":"def get_mat(rotation, shear, height_zoom, width_zoom, height_shift, width_shift):\n    rotation = math.pi * rotation / 180.\n    shear = math.pi * shear / 180.\n\n    c1 = tf.math.cos(rotation)\n    s1 = tf.math.sin(rotation)\n    one = tf.constant([1],dtype='float32')\n    zero = tf.constant([0],dtype='float32')\n    rotation_matrix = tf.reshape( tf.concat([c1,s1,zero, -s1,c1,zero, zero,zero,one],axis=0),[3,3] )\n\n    c2 = tf.math.cos(shear)\n    s2 = tf.math.sin(shear)\n    \n    shear_matrix = tf.reshape( tf.concat([one,s2,zero, zero,c2,zero, zero,zero,one],axis=0),[3,3] )    \n    zoom_matrix = tf.reshape( tf.concat([one/height_zoom,zero,zero, zero,one/width_zoom,zero, zero,zero,one],axis=0),[3,3] )\n    shift_matrix = tf.reshape( tf.concat([one,zero,height_shift, zero,one,width_shift, zero,zero,one],axis=0),[3,3] )\n    \n    return K.dot(K.dot(rotation_matrix, shear_matrix), K.dot(zoom_matrix, shift_matrix))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:53.724614Z","iopub.status.busy":"2021-02-03T06:25:53.721697Z","iopub.status.idle":"2021-02-03T06:25:53.728256Z","shell.execute_reply":"2021-02-03T06:25:53.727716Z"},"papermill":{"duration":0.06345,"end_time":"2021-02-03T06:25:53.728427","exception":false,"start_time":"2021-02-03T06:25:53.664977","status":"completed"},"tags":[],"id":"9Q00dyzI11Pn","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transform(image,label=None):\n    DIM = img_size\n    XDIM = DIM%2 \n    \n    rot = 15. * tf.random.normal([1],dtype='float32')\n    shr = 5. * tf.random.normal([1],dtype='float32') \n    h_zoom = 1.0 + tf.random.normal([1],dtype='float32')/10.\n    w_zoom = 1.0 + tf.random.normal([1],dtype='float32')/10.\n    h_shift = 8. * tf.random.normal([1],dtype='float32') \n    w_shift = 8. * tf.random.normal([1],dtype='float32') \n  \n    m = get_mat(rot,shr,h_zoom,w_zoom,h_shift,w_shift) \n\n    x = tf.repeat( tf.range(DIM//2,-DIM//2,-1), DIM )\n    y = tf.tile( tf.range(-DIM//2,DIM//2),[DIM] )\n    z = tf.ones([DIM*DIM],dtype='int32')\n    idx = tf.stack( [x,y,z] )\n    \n    idx2 = K.dot(m,tf.cast(idx,dtype='float32'))\n    idx2 = K.cast(idx2,dtype='int32')\n    idx2 = K.clip(idx2,-DIM//2+XDIM+1,DIM//2)\n              \n    idx3 = tf.stack( [DIM//2-idx2[0,], DIM//2-1+idx2[1,]] )\n    d = tf.gather_nd(image,tf.transpose(idx3))\n    \n    if label is None:\n        return tf.reshape(d,[DIM,DIM,3])\n    else:\n        return tf.reshape(d,[DIM,DIM,3]),label","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:53.838602Z","iopub.status.busy":"2021-02-03T06:25:53.837809Z","iopub.status.idle":"2021-02-03T06:25:53.841301Z","shell.execute_reply":"2021-02-03T06:25:53.840711Z"},"papermill":{"duration":0.065378,"end_time":"2021-02-03T06:25:53.841475","exception":false,"start_time":"2021-02-03T06:25:53.776097","status":"completed"},"tags":[],"id":"UJpdZQWK11Po","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 6.Création d'un générateur pour l'ensemble de données d'entraînement ","metadata":{"papermill":{"duration":0.04777,"end_time":"2021-02-03T06:25:53.937685","exception":false,"start_time":"2021-02-03T06:25:53.889915","status":"completed"},"tags":[],"id":"Q2o-g5eO11Po"}},{"cell_type":"code","source":"train_dataset = (tf.data.Dataset\n    .from_tensor_slices(preprocess(train))\n    .map(decode_image, num_parallel_calls=AUTO)\n    #.map(data_augment, num_parallel_calls=AUTO)\n    .map(transform,num_parallel_calls=AUTO)\n    .shuffle(SEED)\n    .batch(BATCH_SIZE)\n    .repeat()\n    .prefetch(AUTO))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:54.049743Z","iopub.status.busy":"2021-02-03T06:25:54.047982Z","iopub.status.idle":"2021-02-03T06:25:54.952719Z","shell.execute_reply":"2021-02-03T06:25:54.952061Z"},"papermill":{"duration":0.966164,"end_time":"2021-02-03T06:25:54.952873","exception":false,"start_time":"2021-02-03T06:25:53.986709","status":"completed"},"tags":[],"id":"mEieTb9d11Po","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 7. Création d'un générateur pour l'ensemble de données de test","metadata":{"papermill":{"duration":0.049667,"end_time":"2021-02-03T06:25:55.051045","exception":false,"start_time":"2021-02-03T06:25:55.001378","status":"completed"},"tags":[],"id":"UR1SjOF111Po"}},{"cell_type":"code","source":"test_dataset= (tf.data.Dataset\n    .from_tensor_slices(preprocess(valid))\n    .map(decode_image, num_parallel_calls=AUTO)\n    .batch(BATCH_SIZE)\n    .cache()\n    .prefetch(AUTO))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:55.158967Z","iopub.status.busy":"2021-02-03T06:25:55.157178Z","iopub.status.idle":"2021-02-03T06:25:55.186486Z","shell.execute_reply":"2021-02-03T06:25:55.187051Z"},"papermill":{"duration":0.087783,"end_time":"2021-02-03T06:25:55.187233","exception":false,"start_time":"2021-02-03T06:25:55.09945","status":"completed"},"tags":[],"id":"rrcmcofa11Pp","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 8. Fonction du taux d'apprentissage","metadata":{"papermill":{"duration":0.047076,"end_time":"2021-02-03T06:25:55.2826","exception":false,"start_time":"2021-02-03T06:25:55.235524","status":"completed"},"tags":[],"id":"U28o5hHm11Pp"}},{"cell_type":"code","source":"LR_START = 0.00001\nLR_MAX = 0.00005 * strategy.num_replicas_in_sync\nLR_MIN = 0.00001\nLR_RAMPUP_EPOCHS = 5\nLR_SUSTAIN_EPOCHS = 0\nLR_EXP_DECAY = .8\n\ndef lrfn(epoch):\n    if epoch < LR_RAMPUP_EPOCHS:\n        lr = (LR_MAX - LR_START) / LR_RAMPUP_EPOCHS * epoch + LR_START\n    elif epoch < LR_RAMPUP_EPOCHS + LR_SUSTAIN_EPOCHS:\n        lr = LR_MAX\n    else:\n        lr = (LR_MAX - LR_MIN) * LR_EXP_DECAY**(epoch - LR_RAMPUP_EPOCHS - LR_SUSTAIN_EPOCHS) + LR_MIN\n    return lr\n    \nlr_callback = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=True)\n\nrng = [i for i in range(EPOCHS)]\ny = [lrfn(x) for x in rng]\nplt.plot(rng, y)\nprint(\"Learning rate schedule: {:.3g} to {:.3g} to {:.3g}\".format(y[0], max(y), y[-1]))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:55.404392Z","iopub.status.busy":"2021-02-03T06:25:55.402229Z","iopub.status.idle":"2021-02-03T06:25:55.570807Z","shell.execute_reply":"2021-02-03T06:25:55.570097Z"},"papermill":{"duration":0.240796,"end_time":"2021-02-03T06:25:55.570965","exception":false,"start_time":"2021-02-03T06:25:55.330169","status":"completed"},"tags":[],"id":"0zk0kN0C11Pp","outputId":"bc9da74b-2f36-415d-d6a5-f9c7db15c481","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9. Fonction de perte","metadata":{"papermill":{"duration":0.049006,"end_time":"2021-02-03T06:25:55.669367","exception":false,"start_time":"2021-02-03T06:25:55.620361","status":"completed"},"tags":[],"id":"jymide2k11Pp"}},{"cell_type":"markdown","source":"<p>\n<h1><center> EfficientNetB7 </center></h1>\n<center><img src='https://1.bp.blogspot.com/-DjZT_TLYZok/XO3BYqpxCJI/AAAAAAAAEKM/BvV53klXaTUuQHCkOXZZGywRMdU9v9T_wCLcBGAs/s1600/image2.png' height=350></center>\n<p>","metadata":{"papermill":{"duration":0.048615,"end_time":"2021-02-03T06:25:55.879799","exception":false,"start_time":"2021-02-03T06:25:55.831184","status":"completed"},"tags":[],"id":"07qhvlcX11Pq"}},{"cell_type":"code","source":"with strategy.scope():\n    enet = efn.EfficientNetB0(input_shape=(img_size, img_size, 3),weights='noisy-student',include_top=False)","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:25:55.985104Z","iopub.status.busy":"2021-02-03T06:25:55.984042Z","iopub.status.idle":"2021-02-03T06:26:21.978712Z","shell.execute_reply":"2021-02-03T06:26:21.977997Z"},"papermill":{"duration":26.050378,"end_time":"2021-02-03T06:26:21.978871","exception":false,"start_time":"2021-02-03T06:25:55.928493","status":"completed"},"tags":[],"id":"L3ugba6411Pq","outputId":"b7dd4ad5-7de8-4904-e9d2-dfbb81da82a1","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Unfreeze the model (fine-tuning)\nwith strategy.scope():\n    enet.trainable = True","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:26:22.115385Z","iopub.status.busy":"2021-02-03T06:26:22.11022Z","iopub.status.idle":"2021-02-03T06:26:22.130633Z","shell.execute_reply":"2021-02-03T06:26:22.131102Z"},"papermill":{"duration":0.09102,"end_time":"2021-02-03T06:26:22.131285","exception":false,"start_time":"2021-02-03T06:26:22.040265","status":"completed"},"tags":[],"id":"o6tPJJPH11Pq","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    ef7 =tf.keras.Sequential()\n    ef7.add(enet)\n    ef7.add(tf.keras.layers.MaxPooling2D())\n    ef7.add(tf.keras.layers.Conv2D(2048,3,padding='same'))\n    ef7.add(tf.keras.layers.BatchNormalization())\n    ef7.add(tf.keras.layers.ReLU())\n    ef7.add(tf.keras.layers.GlobalAveragePooling2D())\n    ef7.add(tf.keras.layers.Flatten())\n\n    ef7.add(tf.keras.layers.Dense(512,activation='relu'))\n    ef7.add(tf.keras.layers.BatchNormalization())\n    ef7.add(tf.keras.layers.LeakyReLU())\n    ef7.add(tf.keras.layers.Dropout(0.5))\n    ef7.add(tf.keras.layers.Dense(2,activation='softmax'))\n    ef7.compile(\n                optimizer=tf.optimizers.Adam(lr=0.0001),\n                loss='categorical_crossentropy',\n                metrics=['categorical_accuracy',\n                        tf.keras.metrics.Recall(),\n                        tf.keras.metrics.Precision(),   \n                        tf.keras.metrics.AUC(),\n                        tfa.metrics.F1Score(num_classes=2, average=\"macro\")\n                       ])\n","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:26:22.26681Z","iopub.status.busy":"2021-02-03T06:26:22.265727Z","iopub.status.idle":"2021-02-03T06:26:27.381378Z","shell.execute_reply":"2021-02-03T06:26:27.380819Z"},"papermill":{"duration":5.189829,"end_time":"2021-02-03T06:26:27.381539","exception":false,"start_time":"2021-02-03T06:26:22.19171","status":"completed"},"tags":[],"id":"3Upu3ZIw11Pr","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* **BatchNormalization** permet d'utiliser des taux d'apprentissage plus élevés, ce qui accélère considérablement le processus d'apprentissage.\n* **LeakyReLU** résoudre le problème des \"ReLU mourants\". Au lieu que la fonction soit nulle lorsque x < 0, un ReLU qui fuit aura plutôt une petite pente négative (de 0,01 environ)(mais les résultats ne sont pas toujours cohérents) .\n* **learning_rate** lr=1e-5 ,après plusieurs essais, je trouve que le meilleur taux d'apprentissage est de 1e-5\n","metadata":{"id":"GEQUJWlXYo7c"}},{"cell_type":"markdown","source":"# 10 Entraînement","metadata":{"papermill":{"duration":0.060141,"end_time":"2021-02-03T06:26:27.501221","exception":false,"start_time":"2021-02-03T06:26:27.44108","status":"completed"},"tags":[],"id":"xXiXX3md11Pr"}},{"cell_type":"code","source":"h7=ef7.fit(\n    train_dataset,\n    steps_per_epoch=train_labels.shape[0] // BATCH_SIZE,\n    callbacks=[lr_callback],\n    epochs=EPOCHS)","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:26:27.631105Z","iopub.status.busy":"2021-02-03T06:26:27.629074Z","iopub.status.idle":"2021-02-03T06:54:50.155417Z","shell.execute_reply":"2021-02-03T06:54:50.154789Z"},"papermill":{"duration":1702.594711,"end_time":"2021-02-03T06:54:50.155579","exception":false,"start_time":"2021-02-03T06:26:27.560868","status":"completed"},"tags":[],"id":"a_aMXkFm11Ps","outputId":"cad9e115-26bc-4e88-e94c-b912cca2b6ed","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 11. Affichage des courbes (acc,loss)","metadata":{"papermill":{"duration":0.369535,"end_time":"2021-02-03T06:54:50.910659","exception":false,"start_time":"2021-02-03T06:54:50.541124","status":"completed"},"tags":[],"id":"b3dbNo-f11Ps"}},{"cell_type":"code","source":"import seaborn as sns\nsns.set()\nfig = plt.figure(0, (12, 4))\n\nax = plt.subplot(1, 2, 1)\nsns.lineplot(h7.epoch,h7.history['categorical_accuracy'], label = 'train')\nplt.title('Accuracy')\nplt.tight_layout()\n\nax = plt.subplot(1, 2, 2)\nsns.lineplot(h7.epoch,h7.history['loss'], label = 'train')\nplt.title('Loss')\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:54:51.643198Z","iopub.status.busy":"2021-02-03T06:54:51.642578Z","iopub.status.idle":"2021-02-03T06:54:52.810815Z","shell.execute_reply":"2021-02-03T06:54:52.810227Z"},"papermill":{"duration":1.537928,"end_time":"2021-02-03T06:54:52.810961","exception":false,"start_time":"2021-02-03T06:54:51.273033","status":"completed"},"tags":[],"id":"emuWLSXY11Ps","outputId":"6d303887-15e6-4e6e-9a39-cbb4bc703f43","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 11. Test et évaluation","metadata":{"papermill":{"duration":0.364513,"end_time":"2021-02-03T06:54:53.541169","exception":false,"start_time":"2021-02-03T06:54:53.176656","status":"completed"},"tags":[],"id":"M0wvymMr11Pt"}},{"cell_type":"code","source":"ef7.evaluate(test_dataset)","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:54:54.280418Z","iopub.status.busy":"2021-02-03T06:54:54.279767Z","iopub.status.idle":"2021-02-03T06:55:22.889374Z","shell.execute_reply":"2021-02-03T06:55:22.888864Z"},"papermill":{"duration":28.980929,"end_time":"2021-02-03T06:55:22.889517","exception":false,"start_time":"2021-02-03T06:54:53.908588","status":"completed"},"tags":[],"id":"65eX6w3811Pt","outputId":"2a680b21-1574-471b-8514-97b0706a7a40","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nY_pred = ef7.predict(test_dataset)\ntrue_classes = valid.loc[:, ['N', 'C']].values\nprint('Confusion Matrix')\ncm=confusion_matrix(true_classes.argmax(axis=1),Y_pred.argmax(axis=1))\ncm","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:55:23.668901Z","iopub.status.busy":"2021-02-03T06:55:23.667997Z","iopub.status.idle":"2021-02-03T06:55:37.253096Z","shell.execute_reply":"2021-02-03T06:55:37.252524Z"},"papermill":{"duration":13.992012,"end_time":"2021-02-03T06:55:37.253233","exception":false,"start_time":"2021-02-03T06:55:23.261221","status":"completed"},"tags":[],"id":"6eezlc2411Pt","outputId":"ef47de82-5332-45ec-c26c-aa1e40cb27a2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sklearn.metrics\nprint(sklearn.metrics.classification_report(true_classes.argmax(axis=1),Y_pred.argmax(axis=1)))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:55:38.004984Z","iopub.status.busy":"2021-02-03T06:55:38.003906Z","iopub.status.idle":"2021-02-03T06:55:38.013989Z","shell.execute_reply":"2021-02-03T06:55:38.014577Z"},"papermill":{"duration":0.389393,"end_time":"2021-02-03T06:55:38.014787","exception":false,"start_time":"2021-02-03T06:55:37.625394","status":"completed"},"tags":[],"id":"MtciQ7SQ11Pt","outputId":"c36072e7-43de-4a5d-dbf3-b2c4acca382e","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 12. Matrice de confusion","metadata":{"papermill":{"duration":0.380225,"end_time":"2021-02-03T06:55:38.768665","exception":false,"start_time":"2021-02-03T06:55:38.38844","status":"completed"},"tags":[],"id":"Nsj4fOYv11Pt"}},{"cell_type":"code","source":"import seaborn as sns\ngroup_names = ['True Negative','False Positive','False Negative','True Positive']\ngroup_counts = [\"{0:0.0f}\".format(value) for value in\n                cm.flatten()]\ngroup_percentages = [\"{0:.2%}\".format(value) for value in\n                     cm.flatten()/np.sum(cm)]\nlabels = [f\"{v1}\\n{v2}\\n{v3}\" for v1, v2, v3 in\n          zip(group_names,group_counts,group_percentages)]\nlabels = np.asarray(labels).reshape(2,2)\n\nsns.heatmap(cm, annot=labels, fmt='', cmap=\"YlGnBu\")","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:55:39.535067Z","iopub.status.busy":"2021-02-03T06:55:39.533051Z","iopub.status.idle":"2021-02-03T06:55:39.720795Z","shell.execute_reply":"2021-02-03T06:55:39.719736Z"},"papermill":{"duration":0.582682,"end_time":"2021-02-03T06:55:39.721137","exception":false,"start_time":"2021-02-03T06:55:39.138455","status":"completed"},"tags":[],"id":"05DrPZd411Pu","outputId":"87a64a5d-0f78-451b-a5ee-c67b56cb64ee","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 13. specificity et sensitivity","metadata":{"papermill":{"duration":0.372352,"end_time":"2021-02-03T06:55:40.468696","exception":false,"start_time":"2021-02-03T06:55:40.096344","status":"completed"},"tags":[],"id":"Kasr4BaA11Pu"}},{"cell_type":"code","source":"tn, fp, fn, tp = confusion_matrix(true_classes.argmax(axis=1),Y_pred.argmax(axis=1)).ravel()\nspecificity = tn /(tn+fp)\nsensitivity=  tp/ (tp+fn)\nprint('specificity: {:.6f} | sensitivity: {:.6f} '.format(specificity, sensitivity))","metadata":{"execution":{"iopub.execute_input":"2021-02-03T06:55:41.265856Z","iopub.status.busy":"2021-02-03T06:55:41.263909Z","iopub.status.idle":"2021-02-03T06:55:41.270658Z","shell.execute_reply":"2021-02-03T06:55:41.269943Z"},"papermill":{"duration":0.42998,"end_time":"2021-02-03T06:55:41.270813","exception":false,"start_time":"2021-02-03T06:55:40.840833","status":"completed"},"tags":[],"id":"wln_fJyE11Pu","outputId":"4a44ef97-9f78-4d78-f574-742323da6217","trusted":true},"execution_count":null,"outputs":[]}]}