--- a +++ b/Notebook/Model/InceptionV3_2.ipynb @@ -0,0 +1,1047 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import os\n", + "import pickle\n", + "import random\n", + "import glob\n", + "import datetime\n", + "import pandas as pd\n", + "import numpy as np\n", + "import cv2\n", + "import pydicom\n", + "from tqdm import tqdm\n", + "from joblib import delayed, Parallel\n", + "import zipfile\n", + "from pydicom.filebase import DicomBytesIO\n", + "import sys\n", + "from PIL import Image\n", + "import cv2\n", + "#from focal_loss import sparse_categorical_focal_loss\n", + "import keras\n", + "#import tensorflow_addons as tfa\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from keras.models import model_from_json\n", + "import tensorflow as tf\n", + "import keras\n", + "from keras.models import Sequential, Model\n", + "from keras.layers import Dense, Conv2D, Flatten, MaxPooling2D, GlobalAveragePooling2D, Dropout\n", + "from keras.applications.inception_v3 import InceptionV3\n", + "\n", + "# importing pyplot and image from matplotlib \n", + "import matplotlib.pyplot as plt \n", + "import matplotlib.image as mpimg \n", + "from keras.optimizers import SGD\n", + "from keras import backend\n", + "from keras.models import load_model\n", + "\n", + "from keras.preprocessing import image\n", + "import albumentations as A\n", + "\n", + "\n", + "from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.losses import Reduction\n", + "\n", + "from tensorflow_addons.losses import SigmoidFocalCrossEntropy" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "base_url = '/home/ubuntu/kaggle/rsna-intracranial-hemorrhage-detection/'\n", + "TRAIN_DIR = '/home/ubuntu/kaggle/rsna-intracranial-hemorrhage-detection/stage_2_train/'\n", + "TEST_DIR = '/home/ubuntu/kaggle/rsna-intracranial-hemorrhage-detection/stage_2_test/'\n", + "image_dir = '/home/ubuntu/kaggle/rsna-intracranial-hemorrhage-detection/png/train/adjacent-brain-cropped/'\n", + "save_dir = 'home/ubuntu/kaggle/models/'\n", + "os.listdir(base_url)\n", + "\n", + "def png(image): \n", + " return image + '.png'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Learning rate scheduler" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "initial_learning_rate = 1e-2\n", + "first_decay_steps = 1000\n", + "lr_decayed_fn = (\n", + " tf.keras.experimental.CosineDecayRestarts(\n", + " initial_learning_rate,\n", + " first_decay_steps))\n", + "opt = tf.keras.optimizers.Adam(learning_rate=lr_decayed_fn)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Weighted_metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from keras import backend as K\n", + "def _normalized_weighted_average(arr, weights=None):\n", + " \"\"\"\n", + " A simple Keras implementation that mimics that of \n", + " numpy.average(), specifically for this competition\n", + " \"\"\"\n", + " \n", + " if weights is not None:\n", + " scl = K.sum(weights)\n", + " weights = K.expand_dims(weights, axis=1)\n", + " return K.sum(K.dot(arr, weights), axis=1) / scl\n", + " return K.mean(arr, axis=1)\n", + "\n", + "\n", + "def weighted_loss(y_true, y_pred):\n", + " \"\"\"\n", + " Will be used as the metric in model.compile()\n", + " ---------------------------------------------\n", + " \n", + " Similar to the custom loss function 'weighted_log_loss()' above\n", + " but with normalized weights, which should be very similar \n", + " to the official competition metric:\n", + " https://www.kaggle.com/kambarakun/lb-probe-weights-n-of-positives-scoring\n", + " and hence:\n", + " sklearn.metrics.log_loss with sample weights\n", + " \"\"\"\n", + " \n", + " class_weights = K.variable([2., 1., 1., 1., 1., 1.])\n", + " \n", + " eps = K.epsilon()\n", + " \n", + " y_pred = K.clip(y_pred, eps, 1.0-eps)\n", + "\n", + " loss = -( y_true * K.log( y_pred)\n", + " + (1.0 - y_true) * K.log(1.0 - y_pred))\n", + " \n", + " loss_samples = _normalized_weighted_average(loss, class_weights)\n", + " \n", + " return K.mean(loss_samples)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 604739 validated image filenames.\n", + "Found 148063 validated image filenames.\n" + ] + } + ], + "source": [ + "train_idg = ImageDataGenerator(\n", + " featurewise_center=False, # set input mean to 0 over the dataset\n", + " samplewise_center=False, # set each sample mean to 0\n", + " featurewise_std_normalization=False, # divide inputs by std of the dataset\n", + " samplewise_std_normalization=False, # divide each input by its std\n", + " zca_whitening=False, # apply ZCA whitening\n", + " rotation_range=50, # randomly rotate images in the range (degrees, 0 to 180)\n", + " width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)\n", + " height_shift_range=0.1, # randomly shift images vertically (fraction of total height)\n", + " horizontal_flip=True,\n", + " rescale=1./255)\n", + "valid_idg = ImageDataGenerator(rescale=1./255)\n", + "training_data = pd.read_csv(f'train_1.csv') \n", + "training_data['Image'] = training_data['Image'].apply(png)\n", + "\n", + "validation_data = pd.read_csv(f'valid_1.csv')\n", + "validation_data['Image'] = validation_data['Image'].apply(png)\n", + "\n", + "columns=['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "\n", + "train_data_generator = train_idg.flow_from_dataframe(training_data, directory = image_dir,\n", + " x_col = \"Image\", y_col = columns,batch_size=64,\n", + " class_mode=\"raw\", target_size=(224,224), shuffle = True)\n", + "valid_data_generator = valid_idg.flow_from_dataframe(validation_data, directory = image_dir,\n", + " x_col = \"Image\", y_col = columns,batch_size=64,\n", + " class_mode = \"raw\",target_size=(224,224), shuffle = False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"functional_1\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", + " conv2_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", + " conv2_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", + " conv2_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", + " conv3_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", + " conv3_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", + " conv3_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", + " conv3_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", + " conv4_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", + " conv4_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", + " conv4_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", + " conv4_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", + " conv4_block5_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", + " conv4_block6_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", + " conv5_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", + " conv5_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", + " conv5_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d (Globa (None, 2048) 0 conv5_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "dropout (Dropout) (None, 2048) 0 global_average_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense (Dense) (None, 6) 12294 dropout[0][0] \n", + "==================================================================================================\n", + "Total params: 23,600,006\n", + "Trainable params: 12,294\n", + "Non-trainable params: 23,587,712\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\n", + "\n", + "METRICS = [\n", + " tf.keras.metrics.TruePositives(name='tp'),\n", + " tf.keras.metrics.FalsePositives(name='fp'),\n", + " tf.keras.metrics.TrueNegatives(name='tn'),\n", + " tf.keras.metrics.FalseNegatives(name='fn'), \n", + " tf.keras.metrics.BinaryAccuracy(name='accuracy'),\n", + " tf.keras.metrics.Precision(name='precision'),\n", + " tf.keras.metrics.Recall(name='recall'),\n", + " tf.keras.metrics.AUC(name='auc')\n", + " \n", + "]\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "# create the base pre-trained model\n", + "base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))\n", + "\n", + "# add a global spatial average pooling layer\n", + "x = base_model.output\n", + "x = GlobalAveragePooling2D()(x)\n", + "# let's add a fully-connected layer\n", + "#x = Dense(256, activation='relu')(x)\n", + "# and a logistic layer -- let's say we have 200 classes\n", + "x = Dropout(0.3)(x)\n", + "#x = Dense(100, activation=\"relu\")(x)\n", + "#x = Dropout(0.3)(x)\n", + "#pred = Dense(6,\n", + "# kernel_initializer=tf.keras.initializers.HeNormal(seed=11),\n", + "# kernel_regularizer=tf.keras.regularizers.l2(0.05),\n", + "# bias_regularizer=tf.keras.regularizers.l2(0.05), activation=\"softmax\")(x)\n", + "#initializer = keras.initializers.GlorotUniform()\n", + "#layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)\n", + "\n", + "predictions = Dense(6, activation='softmax')(x)\n", + "#activation='sigmoid',kernel_initializer=keras.initializers.GlorotNormal()\n", + "# this is the model we will train\n", + "model = Model(inputs=base_model.input, outputs=predictions)\n", + "\n", + "# first: train only the top layers (which were randomly initialized)\n", + "# i.e. freeze all convolutional InceptionV3 layers\n", + "for layer in base_model.layers:\n", + " layer.trainable = False\n", + "\n", + "# compile the model (should be done *after* setting layers to non-trainable)\n", + "model.compile(opt, loss=SigmoidFocalCrossEntropy(), metrics= METRICS)\n", + "#model.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.Adam(), metrics=METRICS)\n", + "#model.compile(loss=loss_func,\n", + "# optimizer=opt,\n", + "# metrics=METRICS)\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# callbacks" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n" + ] + } + ], + "source": [ + "from keras import backend as K\n", + "\n", + "from tensorflow.keras.callbacks import ModelCheckpoint\n", + "\n", + "\n", + "checkpoint = tf.keras.callbacks.ModelCheckpoint('resnet50{epoch:08d}.h5', period=1,mode= 'auto',save_best_only=True) \n", + "\n", + "learning_rate_reduction = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_acc', \n", + " patience=1, \n", + " verbose=1, \n", + " factor=0.5, \n", + " min_lr=0.00001)\n", + "\n", + "callback_list = [checkpoint]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From <ipython-input-10-bdb3352f611a>:1: experimental_run_functions_eagerly (from tensorflow.python.eager.def_function) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use `tf.config.run_functions_eagerly` instead of the experimental version.\n" + ] + } + ], + "source": [ + "tf.config.experimental_run_functions_eagerly(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# model fit" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/ubuntu/anaconda3/envs/tensorflow2_p36/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py:3350: UserWarning: Even though the tf.config.experimental_run_functions_eagerly option is set, this option does not apply to tf.data functions. tf.data functions are still traced and executed as graphs.\n", + " \"Even though the tf.config.experimental_run_functions_eagerly \"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/3\n", + "4724/4724 [==============================] - 5855s 1s/step - loss: 0.6288 - tp: 6640.0000 - fp: 51458.0000 - tn: 1658587.0000 - fn: 96965.0000 - accuracy: 0.9182 - precision: 0.1143 - recall: 0.0641 - auc: 0.5777 - val_loss: 0.6626 - val_tp: 1.0000 - val_fp: 30.0000 - val_tn: 419245.0000 - val_fn: 24628.0000 - val_accuracy: 0.9445 - val_precision: 0.0323 - val_recall: 4.0603e-05 - val_auc: 0.6240\n", + "Epoch 2/3\n", + "4724/4724 [==============================] - 5560s 1s/step - loss: 0.7789 - tp: 17593.0000 - fp: 138643.0000 - tn: 1572177.0000 - fn: 85237.0000 - accuracy: 0.8766 - precision: 0.1126 - recall: 0.1711 - auc: 0.6140 - val_loss: 0.8053 - val_tp: 8792.0000 - val_fp: 65190.0000 - val_tn: 354085.0000 - val_fn: 15837.0000 - val_accuracy: 0.8175 - val_precision: 0.1188 - val_recall: 0.3570 - val_auc: 0.6379\n", + "Epoch 3/3\n", + "4724/4724 [==============================] - 5500s 1s/step - loss: 0.8205 - tp: 38155.0000 - fp: 264178.0000 - tn: 1446569.0000 - fn: 65114.0000 - accuracy: 0.8185 - precision: 0.1262 - recall: 0.3695 - auc: 0.6422 - val_loss: 0.8036 - val_tp: 9835.0000 - val_fp: 64144.0000 - val_tn: 355131.0000 - val_fn: 14794.0000 - val_accuracy: 0.8222 - val_precision: 0.1329 - val_recall: 0.3993 - val_auc: 0.6529\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "num_epochs = 3\n", + "\n", + "batch_size = 128\n", + "training_steps = len(training_data) // batch_size\n", + "validation_step = len(validation_data) // batch_size\n", + "\n", + "\n", + "\n", + "\n", + "# FIT THE MODEL\n", + "history = model.fit(train_data_generator,\n", + " epochs=num_epochs,steps_per_epoch=training_steps,\n", + " callbacks=callback_list,\n", + " validation_data=valid_data_generator,\n", + " validation_steps= validation_step) \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "tf.keras.backend.clear_session()\n", + "#from keras.models import load_model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = tf.keras.models.load_model('resnet5000000001.h5')" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "#from sklearn.neural_network import BernoulliRBM\n", + "#rbm = BernoulliRBM(n_components=100, learning_rate=0.01, random_state=0, verbose=True)\n", + "#rbm.fit(X_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From <ipython-input-12-6ece0724cedc>:2: Model.predict_generator (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Please use Model.predict, which supports generators.\n" + ] + } + ], + "source": [ + "X_val_sample, val_labels = next(valid_data_generator)\n", + "predictions = model.predict_generator(valid_data_generator,steps = 128)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "labels = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "cm = confusion_matrix(validation_data['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural'], prediction_, labels)\n", + "print(cm)\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "cax = ax.matshow(cm)\n", + "plt.title('Confusion matrix of the classifier')\n", + "fig.colorbar(cax)\n", + "ax.set_xticklabels([''] + labels)\n", + "ax.set_yticklabels([''] + labels)\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('True')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "BATCH_SIZE = 64\n", + "test_predictions_weighted = model.predict(valid_data_generator, batch_size=BATCH_SIZE)\n", + "\n", + "\n", + "weighted_results = model.evaluate(test_features, test_labels,\n", + " batch_size=BATCH_SIZE, verbose=0)\n", + "for name, value in zip(model.metrics_names, weighted_results):\n", + " print(name, ': ', value)\n", + "print()\n", + "\n", + "plot_cm(test_labels, test_predictions_weighted)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.6691614985466003, 1.0, 89.0, 838395.0, 49893.0, 0.9437377452850342, 0.011111111380159855, 2.004248926823493e-05, 0.6232836246490479]\n" + ] + } + ], + "source": [ + "valid_predict = model.evaluate_generator(valid_data_generator)\n", + "print(valid_predict)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['loss', 'tp', 'fp', 'tn', 'fn', 'accuracy', 'precision', 'recall', 'auc']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.metrics_names" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot([0, 1], [0, 1], linestyle='--')\n", + "# plot the roc curve for the model\n", + "plt.plot(valid_predict[2], valid_predict[1], marker='.')\n", + "# show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_training(H):\n", + " # construct a plot that plots and saves the training history\n", + " with plt.xkcd():\n", + " plt.figure(figsize = (10,10))\n", + " plt.plot(H.epoch,H.history[\"acc\"], label=\"train_acc\")\n", + " plt.plot(H.epoch,H.history[\"val_acc\"], label=\"val_acc\")\n", + " plt.title(\"Training Accuracy\")\n", + " plt.xlabel(\"Epoch #\")\n", + " plt.ylabel(\"Accuracy\")\n", + " plt.legend(loc=\"lower left\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_training(model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_training(H):\n", + " # construct a plot that plots and saves the training history\n", + " with plt.xkcd():\n", + " plt.figure(figsize = (10,10))\n", + " plt.plot(H.epoch,H.history[\"loss\"], label=\"train_loss\")\n", + " plt.plot(H.epoch,H.history[\"val_loss\"], label=\"val_loss\")\n", + " plt.title(\"Training Loss\")\n", + " plt.xlabel(\"Epoch #\")\n", + " plt.ylabel(\"Loss\")\n", + " plt.legend(loc=\"lower left\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_training(history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_metrics(history):\n", + " plt.figure(figsize = (15,15))\n", + " metrics = ['loss', 'tp', 'fp', 'tn', 'fn', 'accuracy', 'precision', 'recall', 'auc']\n", + " for n, metric in enumerate(metrics):\n", + " \n", + " name = metric.replace(\"_\",\" \").capitalize()\n", + " plt.subplot(2,2,n+1)\n", + " \n", + " plt.plot(history.epoch, history.history[metric], color='red', label='Train')\n", + " plt.plot(history.epoch, history.history['val_'+metric],\n", + " color='orange', linestyle=\"--\", label='Val')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel(name)\n", + " if metric == 'loss':\n", + " plt.ylim([0, plt.ylim()[1]])\n", + " elif metric == 'auc':\n", + " plt.ylim([0.8,1])\n", + " else:\n", + " plt.ylim([0,1])\n", + "\n", + " plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_training(history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}