--- a +++ b/Notebook/Model/Hybrid_model.ipynb @@ -0,0 +1,2079 @@ +{ + "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/brain-subdural-bone/'\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" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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.SGD(learning_rate=lr_decayed_fn, nesterov=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Undersampling" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def undersample(dataframe,steps,batch_size):\n", + " part = np.int(steps/3 * batch_size)\n", + " zero_ids = np.random.choice(dataframe.loc[dataframe[\"any\"] == 0].index.values, size=2*part, replace=False)\n", + " hot_ids = np.random.choice(dataframe.loc[dataframe[\"any\"] == 1].index.values, size=1*part, replace=False)\n", + " data_ids = list(set(zero_ids).union(hot_ids))\n", + " np.random.shuffle(data_ids)\n", + " return data_ids\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "257598\n", + "64320\n" + ] + } + ], + "source": [ + "train_indices = undersample(training_data, 8050,32)\n", + "print(len(train_indices))\n", + "\n", + "valid_indices = undersample(validation_data, 2010,32)\n", + "print(len(valid_indices))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "l = training_data[training_data.index.isin(train_indices)]\n", + "m = validation_data[validation_data.index.isin(valid_indices)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generator" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "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", + " shear_range=0.05,\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_2.csv') \n", + "training_data['Image'] = training_data['Image'].apply(png)\n", + "\n", + "validation_data = pd.read_csv(f'valid_2.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": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 257598 validated image filenames.\n", + "Found 64320 validated image filenames.\n" + ] + } + ], + "source": [ + "train_under_generator = train_idg.flow_from_dataframe(l, 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_under_generator = valid_idg.flow_from_dataframe(m, 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": "markdown", + "metadata": {}, + "source": [ + "# Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model loaded.\n", + "Model: \"resnet50\"\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", + "Total params: 23,587,712\n", + "Trainable params: 23,534,592\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "\n", + "\n", + "base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))\n", + "print('Model loaded.')\n", + "\n", + "\n", + "base_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'input_1': <tensorflow.python.keras.engine.input_layer.InputLayer object at 0x7f804ba02828>, 'conv1_pad': <tensorflow.python.keras.layers.convolutional.ZeroPadding2D object at 0x7f8058950cf8>, 'conv1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f803a4a2f60>, 'conv1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f803a405470>, 'conv1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f803a405c88>, 'pool1_pad': <tensorflow.python.keras.layers.convolutional.ZeroPadding2D object at 0x7f803a405978>, 'pool1_pool': <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f80302d3b00>, 'conv2_block1_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80302ef320>, 'conv2_block1_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80303001d0>, 'conv2_block1_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030300f60>, 'conv2_block1_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030300f28>, 'conv2_block1_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80302a77f0>, 'conv2_block1_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80302a7eb8>, 'conv2_block1_0_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80302e25c0>, 'conv2_block1_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80302a7e80>, 'conv2_block1_0_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80302e2f28>, 'conv2_block1_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80302466d8>, 'conv2_block1_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f8030246d30>, 'conv2_block1_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030246358>, 'conv2_block2_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030260b70>, 'conv2_block2_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f8030266898>, 'conv2_block2_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030266f28>, 'conv2_block2_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030266ef0>, 'conv2_block2_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f803020a748>, 'conv2_block2_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f803020ae10>, 'conv2_block2_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f803020a3c8>, 'conv2_block2_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f803022b630>, 'conv2_block2_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f803022bc88>, 'conv2_block2_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f803022b2b0>, 'conv2_block3_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301c6ac8>, 'conv2_block3_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80301cc7f0>, 'conv2_block3_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80301cce80>, 'conv2_block3_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301cce48>, 'conv2_block3_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80301ee6a0>, 'conv2_block3_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80301eed68>, 'conv2_block3_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301ee320>, 'conv2_block3_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f803018e588>, 'conv2_block3_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f803018ebe0>, 'conv2_block3_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f803018e208>, 'conv3_block1_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301b2d68>, 'conv3_block1_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f803014db38>, 'conv3_block1_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030153a58>, 'conv3_block1_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301538d0>, 'conv3_block1_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f8030174278>, 'conv3_block1_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030174940>, 'conv3_block1_0_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80301aba20>, 'conv3_block1_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030174b00>, 'conv3_block1_0_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80301b2748>, 'conv3_block1_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f8030114160>, 'conv3_block1_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f80301147b8>, 'conv3_block1_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030114748>, 'conv3_block2_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030132c88>, 'conv3_block2_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f8030136320>, 'conv3_block2_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80301369b0>, 'conv3_block2_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030136b70>, 'conv3_block2_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300d81d0>, 'conv3_block2_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300d8898>, 'conv3_block2_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80300d8a58>, 'conv3_block2_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f804b153208>, 'conv3_block2_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f804b153860>, 'conv3_block2_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f804b1537f0>, 'conv3_block3_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80300f6d30>, 'conv3_block3_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300fb3c8>, 'conv3_block3_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300fba58>, 'conv3_block3_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80300fb320>, 'conv3_block3_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300a1278>, 'conv3_block3_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300a1940>, 'conv3_block3_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f80300a1b00>, 'conv3_block3_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300c0160>, 'conv3_block3_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f80300c07b8>, 'conv3_block3_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300c0748>, 'conv3_block4_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f803005dc88>, 'conv3_block4_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f8030060320>, 'conv3_block4_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300609b0>, 'conv3_block4_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030060b70>, 'conv3_block4_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300071d0>, 'conv3_block4_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f8030007898>, 'conv3_block4_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030007a58>, 'conv3_block4_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f80300270b8>, 'conv3_block4_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f8030027710>, 'conv3_block4_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f80300276a0>, 'conv4_block1_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c7bd898>, 'conv4_block1_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c7dc6d8>, 'conv4_block1_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c7e1588>, 'conv4_block1_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c7e1748>, 'conv4_block1_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c7f7d68>, 'conv4_block1_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c780470>, 'conv4_block1_0_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f8030043be0>, 'conv4_block1_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c780630>, 'conv4_block1_0_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c7bd278>, 'conv4_block1_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c79fc50>, 'conv4_block1_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c7a4080>, 'conv4_block1_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c7a4358>, 'conv4_block2_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c739fd0>, 'conv4_block2_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c740e10>, 'conv4_block2_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c7454e0>, 'conv4_block2_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c7456a0>, 'conv4_block2_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c762cc0>, 'conv4_block2_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c7673c8>, 'conv4_block2_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c767588>, 'conv4_block2_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c705ba8>, 'conv4_block2_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c705f98>, 'conv4_block2_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c709128>, 'conv4_block3_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c717f28>, 'conv4_block3_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c725d68>, 'conv4_block3_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c72b438>, 'conv4_block3_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c72b5f8>, 'conv4_block3_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c6c9c18>, 'conv4_block3_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c6c9f60>, 'conv4_block3_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c6cd4e0>, 'conv4_block3_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c6e9b00>, 'conv4_block3_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c6e9e48>, 'conv4_block3_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c6f0f98>, 'conv4_block4_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c685eb8>, 'conv4_block4_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c68bcc0>, 'conv4_block4_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c6913c8>, 'conv4_block4_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c691550>, 'conv4_block4_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c6b0b70>, 'conv4_block4_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c6b0eb8>, 'conv4_block4_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c6b5438>, 'conv4_block4_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c650a58>, 'conv4_block4_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c650da0>, 'conv4_block4_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c654e80>, 'conv4_block5_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c66aef0>, 'conv4_block5_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c673c18>, 'conv4_block5_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c673f28>, 'conv4_block5_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c6774a8>, 'conv4_block5_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c616ac8>, 'conv4_block5_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c616eb8>, 'conv4_block5_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c61c390>, 'conv4_block5_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c6379b0>, 'conv4_block5_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c637d68>, 'conv4_block5_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c637da0>, 'conv4_block6_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c5d3e48>, 'conv4_block6_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c5d8b70>, 'conv4_block6_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c5d8e80>, 'conv4_block6_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c5dd400>, 'conv4_block6_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c57ca20>, 'conv4_block6_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c57ce10>, 'conv4_block6_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c583128>, 'conv4_block6_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c59d908>, 'conv4_block6_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c59def0>, 'conv4_block6_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c59df28>, 'conv5_block1_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c53fdd8>, 'conv5_block1_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c55aeb8>, 'conv5_block1_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c561dd8>, 'conv5_block1_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c561c50>, 'conv5_block1_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c5035f8>, 'conv5_block1_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c503cc0>, 'conv5_block1_0_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c5b8da0>, 'conv5_block1_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c503278>, 'conv5_block1_0_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c53fac8>, 'conv5_block1_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c5254e0>, 'conv5_block1_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c525b38>, 'conv5_block1_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c525160>, 'conv5_block2_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c4be978>, 'conv5_block2_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c4c46a0>, 'conv5_block2_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c4c4d30>, 'conv5_block2_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c4c45f8>, 'conv5_block2_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c4e8550>, 'conv5_block2_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c4e8c18>, 'conv5_block2_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c4e81d0>, 'conv5_block2_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c48c438>, 'conv5_block2_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c48ca90>, 'conv5_block2_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c48c0b8>, 'conv5_block3_1_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c4a6f60>, 'conv5_block3_1_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c4ab5f8>, 'conv5_block3_1_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c4abc88>, 'conv5_block3_2_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c4ab550>, 'conv5_block3_2_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c44e4a8>, 'conv5_block3_2_relu': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c44eb70>, 'conv5_block3_3_conv': <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f801c44e128>, 'conv5_block3_3_bn': <tensorflow.python.keras.layers.normalization_v2.BatchNormalization object at 0x7f801c472390>, 'conv5_block3_add': <tensorflow.python.keras.layers.merge.Add object at 0x7f801c4729e8>, 'conv5_block3_out': <tensorflow.python.keras.layers.core.Activation object at 0x7f801c4728d0>}\n" + ] + } + ], + "source": [ + "#define the dictionary of layers\n", + "layer_dict = dict([(layer.name, layer) for layer in base_model.layers])\n", + "print(layer_dict)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model loaded.\n", + "Model: \"functional_1\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_2 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_2[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", + "dense (Dense) (None, 256) 524544 global_average_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_1 (Dense) (None, 6) 1542 dense[0][0] \n", + "==================================================================================================\n", + "Total params: 24,113,798\n", + "Trainable params: 24,060,678\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "import tensorflow as tf\n", + "from tensorflow.keras.models import Model,Sequential\n", + "from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout, MaxPooling2D\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", + "# create the base pre-trained model\n", + "\n", + "base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))\n", + "print('Model loaded.')\n", + "\n", + "\n", + "# add a global spatial average pooling layer\n", + "x = base_model.output\n", + "#net = MaxPooling2D(pool_size= (2,2), strides=(2,2),padding='same', name='pool')(x)\n", + "x = GlobalAveragePooling2D()(x)\n", + "net = Dense(256, activation='elu')(x)\n", + "net = Dense(6, activation='sigmoid')(net)\n", + "\n", + "\n", + "# this is the model we will train\n", + "model = Model(inputs=base_model.input, outputs=net)\n", + "\n", + "\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", + "#for layer in base_model.layers[:20]:\n", + "# layer.trainable = False\n", + "\n", + "\n", + "# compile the model (should be done *after* setting layers to non-trainable)\n", + "model.compile(opt, loss='binary_crossentropy', metrics=METRICS)\n", + "\n", + "\n", + "\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Callbacks" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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_brain_{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=2, \n", + " verbose=1, \n", + " factor=0.5, \n", + " min_lr=0.00001)\n", + "\n", + "callback_list = [checkpoint]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From <ipython-input-16-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": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: 1.0, 1: 2.0}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class_weight = {0:1.0,1:2.0}\n", + "class_weight" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "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/35\n", + "1174/1174 [==============================] - 1414s 1s/step - loss: 0.2569 - tp: 21430.0000 - fp: 9206.0000 - tn: 382133.0000 - fn: 38035.0000 - accuracy: 0.8952 - precision: 0.6995 - recall: 0.3604 - auc: 0.8835 - val_loss: 0.2269 - val_tp: 7006.0000 - val_fp: 2913.0000 - val_tn: 95750.0000 - val_fn: 7611.0000 - val_accuracy: 0.9071 - val_precision: 0.7063 - val_recall: 0.4793 - val_auc: 0.9111\n", + "Epoch 2/35\n", + "1174/1174 [==============================] - 1350s 1s/step - loss: 0.2101 - tp: 31390.0000 - fp: 9611.0000 - tn: 381284.0000 - fn: 28531.0000 - accuracy: 0.9154 - precision: 0.7656 - recall: 0.5239 - auc: 0.9258 - val_loss: 0.2127 - val_tp: 6487.0000 - val_fp: 1387.0000 - val_tn: 97276.0000 - val_fn: 8130.0000 - val_accuracy: 0.9160 - val_precision: 0.8239 - val_recall: 0.4438 - val_auc: 0.9271\n", + "Epoch 3/35\n", + "1174/1174 [==============================] - 1329s 1s/step - loss: 0.1961 - tp: 33148.0000 - fp: 9205.0000 - tn: 382466.0000 - fn: 25997.0000 - accuracy: 0.9219 - precision: 0.7827 - recall: 0.5605 - auc: 0.9344 - val_loss: 0.1943 - val_tp: 7490.0000 - val_fp: 1567.0000 - val_tn: 97096.0000 - val_fn: 7127.0000 - val_accuracy: 0.9233 - val_precision: 0.8270 - val_recall: 0.5124 - val_auc: 0.9369\n", + "Epoch 4/35\n", + "1174/1174 [==============================] - 1311s 1s/step - loss: 0.1839 - tp: 35865.0000 - fp: 8889.0000 - tn: 382362.0000 - fn: 23700.0000 - accuracy: 0.9277 - precision: 0.8014 - recall: 0.6021 - auc: 0.9428 - val_loss: 0.1815 - val_tp: 7938.0000 - val_fp: 1285.0000 - val_tn: 97378.0000 - val_fn: 6679.0000 - val_accuracy: 0.9297 - val_precision: 0.8607 - val_recall: 0.5431 - val_auc: 0.9458\n", + "Epoch 5/35\n", + "1174/1174 [==============================] - 1298s 1s/step - loss: 0.1728 - tp: 37649.0000 - fp: 8311.0000 - tn: 382789.0000 - fn: 22067.0000 - accuracy: 0.9326 - precision: 0.8192 - recall: 0.6305 - auc: 0.9498 - val_loss: 0.1839 - val_tp: 7988.0000 - val_fp: 1268.0000 - val_tn: 97395.0000 - val_fn: 6629.0000 - val_accuracy: 0.9303 - val_precision: 0.8630 - val_recall: 0.5465 - val_auc: 0.9451\n", + "Epoch 6/35\n", + "1174/1174 [==============================] - 1289s 1s/step - loss: 0.1691 - tp: 38264.0000 - fp: 8216.0000 - tn: 382755.0000 - fn: 21569.0000 - accuracy: 0.9339 - precision: 0.8232 - recall: 0.6395 - auc: 0.9521 - val_loss: 0.1940 - val_tp: 7400.0000 - val_fp: 1030.0000 - val_tn: 97633.0000 - val_fn: 7217.0000 - val_accuracy: 0.9272 - val_precision: 0.8778 - val_recall: 0.5063 - val_auc: 0.9420\n", + "Epoch 7/35\n", + "1174/1174 [==============================] - 1282s 1s/step - loss: 0.1671 - tp: 38953.0000 - fp: 8159.0000 - tn: 382694.0000 - fn: 21010.0000 - accuracy: 0.9353 - precision: 0.8268 - recall: 0.6496 - auc: 0.9531 - val_loss: 0.1735 - val_tp: 8492.0000 - val_fp: 1191.0000 - val_tn: 97472.0000 - val_fn: 6125.0000 - val_accuracy: 0.9354 - val_precision: 0.8770 - val_recall: 0.5810 - val_auc: 0.9503\n", + "Epoch 8/35\n", + "1174/1174 [==============================] - 1292s 1s/step - loss: 0.1601 - tp: 39488.0000 - fp: 7825.0000 - tn: 383439.0000 - fn: 20064.0000 - accuracy: 0.9381 - precision: 0.8346 - recall: 0.6631 - auc: 0.9565 - val_loss: 0.1825 - val_tp: 8175.0000 - val_fp: 1102.0000 - val_tn: 97561.0000 - val_fn: 6442.0000 - val_accuracy: 0.9334 - val_precision: 0.8812 - val_recall: 0.5593 - val_auc: 0.9483\n", + "Epoch 9/35\n", + "1174/1174 [==============================] - 1287s 1s/step - loss: 0.1552 - tp: 40110.0000 - fp: 7726.0000 - tn: 383709.0000 - fn: 19271.0000 - accuracy: 0.9401 - precision: 0.8385 - recall: 0.6755 - auc: 0.9594 - val_loss: 0.1608 - val_tp: 9149.0000 - val_fp: 1386.0000 - val_tn: 97277.0000 - val_fn: 5468.0000 - val_accuracy: 0.9395 - val_precision: 0.8684 - val_recall: 0.6259 - val_auc: 0.9550\n", + "Epoch 10/35\n", + "1174/1174 [==============================] - 1281s 1s/step - loss: 0.1527 - tp: 41196.0000 - fp: 7738.0000 - tn: 383104.0000 - fn: 18766.0000 - accuracy: 0.9412 - precision: 0.8419 - recall: 0.6870 - auc: 0.9610 - val_loss: 0.1613 - val_tp: 9037.0000 - val_fp: 1225.0000 - val_tn: 97438.0000 - val_fn: 5580.0000 - val_accuracy: 0.9399 - val_precision: 0.8806 - val_recall: 0.6183 - val_auc: 0.9564\n", + "Epoch 11/35\n", + "1174/1174 [==============================] - 1275s 1s/step - loss: 0.1501 - tp: 41519.0000 - fp: 7554.0000 - tn: 383305.0000 - fn: 18438.0000 - accuracy: 0.9423 - precision: 0.8461 - recall: 0.6925 - auc: 0.9623 - val_loss: 0.1590 - val_tp: 9271.0000 - val_fp: 1347.0000 - val_tn: 97316.0000 - val_fn: 5346.0000 - val_accuracy: 0.9409 - val_precision: 0.8731 - val_recall: 0.6343 - val_auc: 0.9563\n", + "Epoch 12/35\n", + "1174/1174 [==============================] - 1279s 1s/step - loss: 0.1486 - tp: 41136.0000 - fp: 7468.0000 - tn: 383876.0000 - fn: 18336.0000 - accuracy: 0.9428 - precision: 0.8464 - recall: 0.6917 - auc: 0.9629 - val_loss: 0.1582 - val_tp: 9293.0000 - val_fp: 1351.0000 - val_tn: 97312.0000 - val_fn: 5324.0000 - val_accuracy: 0.9411 - val_precision: 0.8731 - val_recall: 0.6358 - val_auc: 0.9569\n", + "Epoch 13/35\n", + "1174/1174 [==============================] - 1277s 1s/step - loss: 0.1483 - tp: 41631.0000 - fp: 7621.0000 - tn: 383310.0000 - fn: 18254.0000 - accuracy: 0.9426 - precision: 0.8453 - recall: 0.6952 - auc: 0.9634 - val_loss: 0.1701 - val_tp: 8776.0000 - val_fp: 1086.0000 - val_tn: 97577.0000 - val_fn: 5841.0000 - val_accuracy: 0.9389 - val_precision: 0.8899 - val_recall: 0.6004 - val_auc: 0.9525\n", + "Epoch 14/35\n", + "1174/1174 [==============================] - 1271s 1s/step - loss: 0.1489 - tp: 41422.0000 - fp: 7562.0000 - tn: 383574.0000 - fn: 18246.0000 - accuracy: 0.9428 - precision: 0.8456 - recall: 0.6942 - auc: 0.9629 - val_loss: 0.1550 - val_tp: 9453.0000 - val_fp: 1436.0000 - val_tn: 97227.0000 - val_fn: 5164.0000 - val_accuracy: 0.9417 - val_precision: 0.8681 - val_recall: 0.6467 - val_auc: 0.9580\n", + "Epoch 15/35\n", + "1174/1174 [==============================] - 1268s 1s/step - loss: 0.1445 - tp: 41784.0000 - fp: 7258.0000 - tn: 384104.0000 - fn: 17658.0000 - accuracy: 0.9447 - precision: 0.8520 - recall: 0.7029 - auc: 0.9645 - val_loss: 0.1561 - val_tp: 9313.0000 - val_fp: 1285.0000 - val_tn: 97378.0000 - val_fn: 5304.0000 - val_accuracy: 0.9418 - val_precision: 0.8788 - val_recall: 0.6371 - val_auc: 0.9579\n", + "Epoch 16/35\n", + "1174/1174 [==============================] - 1299s 1s/step - loss: 0.1412 - tp: 42241.0000 - fp: 7219.0000 - tn: 384141.0000 - fn: 17203.0000 - accuracy: 0.9458 - precision: 0.8540 - recall: 0.7106 - auc: 0.9664 - val_loss: 0.1605 - val_tp: 9247.0000 - val_fp: 1203.0000 - val_tn: 97460.0000 - val_fn: 5370.0000 - val_accuracy: 0.9420 - val_precision: 0.8849 - val_recall: 0.6326 - val_auc: 0.9567\n", + "Epoch 17/35\n", + "1174/1174 [==============================] - 1292s 1s/step - loss: 0.1396 - tp: 42324.0000 - fp: 7110.0000 - tn: 384495.0000 - fn: 16887.0000 - accuracy: 0.9468 - precision: 0.8562 - recall: 0.7148 - auc: 0.9669 - val_loss: 0.1504 - val_tp: 9795.0000 - val_fp: 1475.0000 - val_tn: 97188.0000 - val_fn: 4822.0000 - val_accuracy: 0.9444 - val_precision: 0.8691 - val_recall: 0.6701 - val_auc: 0.9598\n", + "Epoch 18/35\n", + "1174/1174 [==============================] - 1277s 1s/step - loss: 0.1377 - tp: 43230.0000 - fp: 7134.0000 - tn: 383768.0000 - fn: 16684.0000 - accuracy: 0.9472 - precision: 0.8584 - recall: 0.7215 - auc: 0.9685 - val_loss: 0.1501 - val_tp: 9729.0000 - val_fp: 1358.0000 - val_tn: 97305.0000 - val_fn: 4888.0000 - val_accuracy: 0.9449 - val_precision: 0.8775 - val_recall: 0.6656 - val_auc: 0.9605\n", + "Epoch 19/35\n", + "1174/1174 [==============================] - 1280s 1s/step - loss: 0.1354 - tp: 43237.0000 - fp: 7117.0000 - tn: 384049.0000 - fn: 16413.0000 - accuracy: 0.9478 - precision: 0.8587 - recall: 0.7248 - auc: 0.9697 - val_loss: 0.1498 - val_tp: 9766.0000 - val_fp: 1384.0000 - val_tn: 97279.0000 - val_fn: 4851.0000 - val_accuracy: 0.9450 - val_precision: 0.8759 - val_recall: 0.6681 - val_auc: 0.9598\n", + "Epoch 20/35\n", + "1174/1174 [==============================] - 1275s 1s/step - loss: 0.1334 - tp: 43392.0000 - fp: 6990.0000 - tn: 384391.0000 - fn: 16043.0000 - accuracy: 0.9489 - precision: 0.8613 - recall: 0.7301 - auc: 0.9704 - val_loss: 0.1541 - val_tp: 9511.0000 - val_fp: 1157.0000 - val_tn: 97506.0000 - val_fn: 5106.0000 - val_accuracy: 0.9447 - val_precision: 0.8915 - val_recall: 0.6507 - val_auc: 0.9592\n", + "Epoch 21/35\n", + "1174/1174 [==============================] - 1275s 1s/step - loss: 0.1333 - tp: 44333.0000 - fp: 7034.0000 - tn: 383547.0000 - fn: 15902.0000 - accuracy: 0.9491 - precision: 0.8631 - recall: 0.7360 - auc: 0.9707 - val_loss: 0.1502 - val_tp: 9744.0000 - val_fp: 1292.0000 - val_tn: 97371.0000 - val_fn: 4873.0000 - val_accuracy: 0.9456 - val_precision: 0.8829 - val_recall: 0.6666 - val_auc: 0.9601\n", + "Epoch 22/35\n", + "1174/1174 [==============================] - 1281s 1s/step - loss: 0.1332 - tp: 43970.0000 - fp: 7013.0000 - tn: 383927.0000 - fn: 15906.0000 - accuracy: 0.9492 - precision: 0.8624 - recall: 0.7344 - auc: 0.9706 - val_loss: 0.1503 - val_tp: 9699.0000 - val_fp: 1217.0000 - val_tn: 97446.0000 - val_fn: 4918.0000 - val_accuracy: 0.9458 - val_precision: 0.8885 - val_recall: 0.6635 - val_auc: 0.9607\n", + "Epoch 23/35\n", + "1174/1174 [==============================] - 1277s 1s/step - loss: 0.1330 - tp: 43656.0000 - fp: 6954.0000 - tn: 384165.0000 - fn: 16029.0000 - accuracy: 0.9490 - precision: 0.8626 - recall: 0.7314 - auc: 0.9706 - val_loss: 0.1454 - val_tp: 10036.0000 - val_fp: 1433.0000 - val_tn: 97230.0000 - val_fn: 4581.0000 - val_accuracy: 0.9469 - val_precision: 0.8751 - val_recall: 0.6866 - val_auc: 0.9621\n", + "Epoch 24/35\n", + "1174/1174 [==============================] - 1273s 1s/step - loss: 0.1317 - tp: 43773.0000 - fp: 6970.0000 - tn: 384203.0000 - fn: 15870.0000 - accuracy: 0.9493 - precision: 0.8626 - recall: 0.7339 - auc: 0.9712 - val_loss: 0.1487 - val_tp: 9835.0000 - val_fp: 1301.0000 - val_tn: 97362.0000 - val_fn: 4782.0000 - val_accuracy: 0.9463 - val_precision: 0.8832 - val_recall: 0.6728 - val_auc: 0.9607\n", + "Epoch 25/35\n", + "1174/1174 [==============================] - 1276s 1s/step - loss: 0.1321 - tp: 44028.0000 - fp: 7051.0000 - tn: 383997.0000 - fn: 15740.0000 - accuracy: 0.9494 - precision: 0.8620 - recall: 0.7366 - auc: 0.9712 - val_loss: 0.1475 - val_tp: 9884.0000 - val_fp: 1333.0000 - val_tn: 97330.0000 - val_fn: 4733.0000 - val_accuracy: 0.9465 - val_precision: 0.8812 - val_recall: 0.6762 - val_auc: 0.9614\n", + "Epoch 26/35\n", + "1174/1174 [==============================] - 1276s 1s/step - loss: 0.1301 - tp: 44342.0000 - fp: 6832.0000 - tn: 384036.0000 - fn: 15594.0000 - accuracy: 0.9503 - precision: 0.8665 - recall: 0.7398 - auc: 0.9721 - val_loss: 0.1464 - val_tp: 9947.0000 - val_fp: 1367.0000 - val_tn: 97296.0000 - val_fn: 4670.0000 - val_accuracy: 0.9467 - val_precision: 0.8792 - val_recall: 0.6805 - val_auc: 0.9620\n", + "Epoch 27/35\n", + "1174/1174 [==============================] - 1274s 1s/step - loss: 0.1326 - tp: 43940.0000 - fp: 7199.0000 - tn: 383764.0000 - fn: 15913.0000 - accuracy: 0.9487 - precision: 0.8592 - recall: 0.7341 - auc: 0.9710 - val_loss: 0.1498 - val_tp: 9844.0000 - val_fp: 1388.0000 - val_tn: 97275.0000 - val_fn: 4773.0000 - val_accuracy: 0.9456 - val_precision: 0.8764 - val_recall: 0.6735 - val_auc: 0.9605\n", + "Epoch 28/35\n", + "1174/1174 [==============================] - 1270s 1s/step - loss: 0.1313 - tp: 43835.0000 - fp: 7018.0000 - tn: 384289.0000 - fn: 15662.0000 - accuracy: 0.9497 - precision: 0.8620 - recall: 0.7368 - auc: 0.9712 - val_loss: 0.1483 - val_tp: 9873.0000 - val_fp: 1323.0000 - val_tn: 97340.0000 - val_fn: 4744.0000 - val_accuracy: 0.9464 - val_precision: 0.8818 - val_recall: 0.6754 - val_auc: 0.9606\n", + "Epoch 29/35\n", + "1174/1174 [==============================] - 1269s 1s/step - loss: 0.1297 - tp: 44138.0000 - fp: 6881.0000 - tn: 384291.0000 - fn: 15494.0000 - accuracy: 0.9504 - precision: 0.8651 - recall: 0.7402 - auc: 0.9719 - val_loss: 0.1455 - val_tp: 10183.0000 - val_fp: 1620.0000 - val_tn: 97043.0000 - val_fn: 4434.0000 - val_accuracy: 0.9466 - val_precision: 0.8627 - val_recall: 0.6967 - val_auc: 0.9616\n", + "Epoch 30/35\n", + "1174/1174 [==============================] - 1269s 1s/step - loss: 0.1300 - tp: 44765.0000 - fp: 7035.0000 - tn: 383443.0000 - fn: 15573.0000 - accuracy: 0.9499 - precision: 0.8642 - recall: 0.7419 - auc: 0.9726 - val_loss: 0.1484 - val_tp: 9770.0000 - val_fp: 1240.0000 - val_tn: 97423.0000 - val_fn: 4847.0000 - val_accuracy: 0.9463 - val_precision: 0.8874 - val_recall: 0.6684 - val_auc: 0.9618\n", + "Epoch 31/35\n", + "1174/1174 [==============================] - 1270s 1s/step - loss: 0.1267 - tp: 44546.0000 - fp: 6918.0000 - tn: 384228.0000 - fn: 15124.0000 - accuracy: 0.9511 - precision: 0.8656 - recall: 0.7465 - auc: 0.9734 - val_loss: 0.1468 - val_tp: 9863.0000 - val_fp: 1211.0000 - val_tn: 97452.0000 - val_fn: 4754.0000 - val_accuracy: 0.9473 - val_precision: 0.8906 - val_recall: 0.6748 - val_auc: 0.9622\n", + "Epoch 32/35\n", + "1174/1174 [==============================] - 1270s 1s/step - loss: 0.1259 - tp: 44600.0000 - fp: 6848.0000 - tn: 384449.0000 - fn: 14907.0000 - accuracy: 0.9517 - precision: 0.8669 - recall: 0.7495 - auc: 0.9737 - val_loss: 0.1431 - val_tp: 10013.0000 - val_fp: 1326.0000 - val_tn: 97337.0000 - val_fn: 4604.0000 - val_accuracy: 0.9477 - val_precision: 0.8831 - val_recall: 0.6850 - val_auc: 0.9640\n", + "Epoch 33/35\n", + "1174/1174 [==============================] - 1269s 1s/step - loss: 0.1264 - tp: 45092.0000 - fp: 6859.0000 - tn: 383867.0000 - fn: 14986.0000 - accuracy: 0.9515 - precision: 0.8680 - recall: 0.7506 - auc: 0.9738 - val_loss: 0.1405 - val_tp: 10423.0000 - val_fp: 1586.0000 - val_tn: 97077.0000 - val_fn: 4194.0000 - val_accuracy: 0.9490 - val_precision: 0.8679 - val_recall: 0.7131 - val_auc: 0.9644\n", + "Epoch 34/35\n", + "1174/1174 [==============================] - 1269s 1s/step - loss: 0.1240 - tp: 45225.0000 - fp: 6842.0000 - tn: 384207.0000 - fn: 14542.0000 - accuracy: 0.9526 - precision: 0.8686 - recall: 0.7567 - auc: 0.9748 - val_loss: 0.1453 - val_tp: 9933.0000 - val_fp: 1285.0000 - val_tn: 97378.0000 - val_fn: 4684.0000 - val_accuracy: 0.9473 - val_precision: 0.8855 - val_recall: 0.6796 - val_auc: 0.9629\n", + "Epoch 35/35\n", + "1174/1174 [==============================] - 1268s 1s/step - loss: 0.1231 - tp: 44814.0000 - fp: 6721.0000 - tn: 384781.0000 - fn: 14488.0000 - accuracy: 0.9530 - precision: 0.8696 - recall: 0.7557 - auc: 0.9746 - val_loss: 0.1409 - val_tp: 10215.0000 - val_fp: 1355.0000 - val_tn: 97308.0000 - val_fn: 4402.0000 - val_accuracy: 0.9492 - val_precision: 0.8829 - val_recall: 0.6988 - val_auc: 0.9647\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "num_epochs = 35\n", + "\n", + "batch_size = 512\n", + "training_steps = len(training_data) // batch_size\n", + "validation_step = len(validation_data) // batch_size\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "# FIT THE MODEL\n", + "history = model.fit(train_under_generator,\n", + " epochs=num_epochs,\n", + " steps_per_epoch=training_steps,\n", + " callbacks=callback_list,\n", + " class_weight=class_weight,\n", + " validation_data=valid_under_generator,\n", + " validation_steps= validation_step\n", + " ) \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "tf.keras.backend.clear_session()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Evalution" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From <ipython-input-19-b13240840368>:1: Model.evaluate_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.evaluate, which supports generators.\n", + "[0.14285612106323242, 35334.0, 4761.0, 330681.0, 15144.0, 0.9484224319458008, 0.8812569975852966, 0.6999881267547607, 0.9643110036849976]\n" + ] + } + ], + "source": [ + "valid_predict = model.evaluate_generator(valid_under_generator)\n", + "print(valid_predict)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['loss', 'tp', 'fp', 'tn', 'fn', 'accuracy', 'precision', 'recall', 'auc']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.metrics_names" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "---------------\n", + "\n", + "validation data **loss** value = 0.14285612106323242\n", + "\n", + "---------------\n", + "\n", + "validation data **true positive** value = 35334.0\n", + "\n", + "---------------\n", + "\n", + "validation data **false positive** value = 4761.0\n", + "\n", + "---------------\n", + "\n", + "validation data **true negative** value = 330681.0\n", + "\n", + "---------------\n", + "\n", + "validation data **false negative** value = 15144.0\n", + "\n", + "---------------\n", + "\n", + "validation data **accuracy** value = 0.9484224319458008\n", + "\n", + "---------------\n", + "\n", + "validation data **precision** value = 0.8812569975852966\n", + "\n", + "---------------\n", + "\n", + "validation data **recall* value = 0.6999881267547607\n", + "\n", + "---------------\n", + "\n", + "validation data **AUC* value = 0.9643110036849976\n", + "\n", + "---------------\n", + "\n" + ] + } + ], + "source": [ + "print('\\n---------------\\n')\n", + "print('validation data **loss** value =', valid_predict[0])\n", + "print('\\n---------------\\n')\n", + "print('validation data **true positive** value = ', valid_predict[1])\n", + "print('\\n---------------\\n')\n", + "print('validation data **false positive** value =', valid_predict[2])\n", + "print('\\n---------------\\n')\n", + "print('validation data **true negative** value =', valid_predict[3])\n", + "print('\\n---------------\\n')\n", + "print('validation data **false negative** value =', valid_predict[4])\n", + "print('\\n---------------\\n')\n", + "print('validation data **accuracy** value = ', valid_predict[5])\n", + "print('\\n---------------\\n')\n", + "print('validation data **precision** value =', valid_predict[6])\n", + "print('\\n---------------\\n')\n", + "print('validation data **recall* value =', valid_predict[7])\n", + "print('\\n---------------\\n')\n", + "print('validation data **AUC* value =', valid_predict[8])\n", + "print('\\n---------------\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From <ipython-input-23-8e5b4df874af>:3: 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": [ + "y_true = m[['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']].reset_index(drop=True)\n", + "\n", + "#Y_pred = model.predict_generator(valid_under_generator)\n", + "preds = np.where(Y_pred < 0.25, 0, 1)\n", + "\n", + "\n", + "\n", + "#val = 0.25\n", + "\n", + "#Y_pred[Y_pred>=val]=1\n", + "#Y_pred[Y_pred<val]=0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Classification" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report\n", + " precision recall f1-score support\n", + "\n", + " any 0.86 0.89 0.87 21440\n", + " epidural 0.31 0.16 0.21 625\n", + "intraparenchymal 0.79 0.79 0.79 7287\n", + "intraventricular 0.77 0.82 0.80 4867\n", + " subarachnoid 0.66 0.65 0.66 6817\n", + " subdural 0.72 0.74 0.73 9442\n", + "\n", + " micro avg 0.78 0.80 0.79 50478\n", + " macro avg 0.68 0.67 0.68 50478\n", + " weighted avg 0.78 0.80 0.79 50478\n", + " samples avg 0.27 0.27 0.26 50478\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/ubuntu/anaconda3/envs/tensorflow2_p36/lib/python3.6/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in samples with no predicted labels. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/home/ubuntu/anaconda3/envs/tensorflow2_p36/lib/python3.6/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in samples with no true labels. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + } + ], + "source": [ + "print('Classification Report')\n", + "target_names = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "print(classification_report(y_true, preds, target_names=target_names))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iIiIiIhIhBJlERERERERkQglyiIiIiIiIiIRSpRFREREREREIpQoi4iIiIiIiEQoURYRERERERGJUKIsIiIiIiIiEqFEWURERERERCRCibKIiIiIiIhIhBJlERERERERkQglyiIiIiIiIiIRSpRFREREREREIpQoi4iIiIiIiEQoURYRERERERGJUKIsIiIiIiIiEqFEWURERERERCRCibKIiIiIiIhIhBJlERERERERkQglyiIiIiIiIiIRSpRFREREREREIpQoi4iIiIiIiEQoURYRERERERGJUKIsIiIiIiIiEqFEWURERERERCRCibKIiIiIiIhIhBJlERERERERkQglyiIiIiIiIiIRSpRFREREREREIpQoi4iIiIiIiESkxB2A5H0HFE5h3MAuFC6cQkpyMqPGzeLh5z+g6QmH8sjtF1C4UDKz5i/mnz2HkJ6ewe1Xns7FZ58AQEpyEocfUpnqLe5h4+at2dYD8GLPyznt+DqsS90MwPXdX2POd0ti2+dEs2XLFq7tdDlbt24lPT2d01udwY0338rQN17njdcH8+viX/hk0hTKli27w3r/mzeXqzpezKOPP0HLM84CoOEx9ahT91AAKh90EE8+3T/X90ckvypdoij9H7yMerUPwh3+2XMIZzaux7lN65PhzorV67n+wddZumJd5jrH16vBp4O7csU9gxg1bjYA1SuX5bnul1GtUlkcp+0t/fll6Wq1lXvh96VLuf/eu1m1aiVmSXS48CI6XnEVzzz1JBMnfEKSJVG2fHke6v0IFStWwt3p+0hvPpv0KUWKFuGh3o9yRL0j494NkXxpwfs9Wb9hC+kZGaSlZ9C442Pcf8PZXNPuFFasSQXgwWfG8N/Pvslcp3rlssx8uxu9n/+AJ1/7hLoHV+S1vtdkLj+kanke6v8+z7wxcbd1FXTdu93LpE8nUq5ceUa+8x4A/Z99mrdHDKdc2XIAdO5yB6c1acqSJb9yQZuzqVnzEACOPuYYHniwFwAfvv8eLw14ATOoUKEiffo+Ttlw/bxAibL8bVu2pnHW9U+xYdNWUlKSGD/oDsZNmc9Lva6g9Q1P88Mvy3ngxnO4vM1JvDp6Cv8Z/An/GfwJAGc3OYrOHZuz5o+NADvV8/Hn3zBt7kIA7ntydOZJouyocOHCvDDwFYoVK862bdv4x1UdObVxExocexxNmjbj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Xd+4VW1lbipWOPhz1f9RuatoIVNbKX+Zzitz3/bzyqXrtsYcScFyUOnCObaVekZZRETykk/M7Akzmx5+/m1mpeMOSkRERPIXJcoiIpKXDCTobn1R+PkDeDnWiERERCTf0TPKIiKSl9R29/aR6Z5mNju2aERERCRf0h1lERHJSzaZWePtE2Z2KrApxnhEREQkH9IdZRERyUtuBF6NPJe8BrgqxnhEREQkH1KiLCIiecl84DGgNlAGWAe0BebEGZSIiIjkL0qURUQkL3kHWAvMBJbEHIuIiIjkU0qURUQkL6nm7mfFHYSIiIjkbxrMS0RE8pIvzOzouIMQERGR/E13lEVEJC9pDHQys5+BLYAB7u714w1LRERE8hMlyiIikpe0jjsAERERyf+UKIuISJ7h7ovijkFERETyPz2jLCIiIiIiIhKhRFlEREREREQkQomyiIiIiIiISIQSZREREREREZEIJcoiIiIiIiIiEUqURURERERERCKUKIuIiIiIiIhEKFEWERERERERiVCiLCIiIiIiIhKhRFlEREREREQkQomyiIiIiIiISIQSZREREREREZEIJcoiIiIiIiIiEUqURURERERERCKUKIuIiIiIiIhEKFEWERERERERiVCiLCIiIiIiIhKhRFlEREREREQkQomyiIiIiIiISIQSZREREREREZEIJcoiIiIiIiIiEUqURURERERERCKUKIuIiIiIiIhEKFEWERERERERiVCiLCIiIiIiIhKhRFlEREREREQkQomyiIiIiIiISIQSZREREREREZGIlLgDkPzl96VLuf/eu1m1aiVmSXS48CI6XnFV5vJXXx7IE/0eY+JnUyhbthxfTfuSLp1vomrVagC0aNmKf950y27rkcCU157k13nTKFKyDG26PQfA6sU/Mm3os6Rv24olJ3PixTdxYM3D2LJxPVNf/z/Wr1hKcqHCnHz5bZSpUhOA+eNH8cPnH4MZZaoczClX3E5yocIsXTCbmaMHQUYGKQcU5ZQrbqdkxSox7rFI/tT6jBYUL16cpKQkUpKTeWP4SJ7o15dJn06gUEohqlWvQc+HH6FUqVLMnTuHh3o8EKzozj9v6kyLlq3i3YE8qnu3e5n06UTKlSvPyHfeA2Dd2rXc3fV2fluyhCpVq/L4v5+kVOnSvP/eGF4eOACAYsWKc/8DPTjs8MPjDF8k38vu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\n", + "text/plain": [ + "<Figure size 1008x576 with 6 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "from sklearn.metrics import multilabel_confusion_matrix\n", + "# Creating multilabel confusion matrix\n", + "confusion = multilabel_confusion_matrix(y_true, preds)\n", + "mlb= ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "# Plot confusion matrix \n", + "fig = plt.figure(figsize = (14, 8))\n", + "for i, (label, matrix) in enumerate(zip(mlb, confusion)):\n", + " plt.subplot(f'23{i+1}')\n", + " labels = [f'not_{label}', label]\n", + " sns.heatmap(matrix, annot = True, square = True, fmt = 'd', cbar = False, cmap = 'Blues', \n", + " xticklabels = labels, yticklabels = labels, linecolor = 'black', linewidth = 1)\n", + " plt.title(labels[0])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AUC_ROC_SCORE" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.8195484097257365\n" + ] + } + ], + "source": [ + "auc = roc_auc_score(y_true, preds)\n", + "print(auc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ACCURACY and LOSS" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "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[\"accuracy\"], label=\"train_acc\")\n", + " plt.plot(H.epoch,H.history[\"val_accuracy\"], label=\"val_acc\")\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 Accuracy and Loss\")\n", + " plt.xlabel(\"Epoch #\")\n", + " plt.ylabel(\"Accuracy/Loss\")\n", + " plt.legend(loc=\"lower left\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "findfont: Font family ['xkcd', 'xkcd Script', 'Humor Sans', 'Comic Sans MS'] not found. Falling back to DejaVu Sans.\n", + "findfont: Font family ['xkcd', 'xkcd Script', 'Humor Sans', 'Comic Sans MS'] not found. Falling back to DejaVu Sans.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnAAAAJtCAYAAAC2W03mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeZwU9Z0//ldV3/cx93AJIpeKCkYSQ8QbQVFRlEvdaLySdfWRZL+aPH7rZjXXmmS9YjQhUaIYsholrIawm3hhEm/FE7kRGBjm6vs+6vP7o7pqZhzobpChZ6zX8/HoB0xPH++urql61ftThySEECAiIiKiYUOudQFEREREdHAY4IiIiIiGGQY4IiIiomGGAY6IiIhomGGAIyIiIhpmGOCIiIiIhhkGOCKDyOVyCIfDKBaLB/1cIQTC4TDS6fQgVEafR9ls9pDnNyKqzFzrAoiM6LXXXsNTTz1V8XFmsxn/+Z//eVjec/Xq1Vi4cCE++OADHHfccQf13EKhgGAwiDvvvBO33377YannUK1atQqvvPIKzjnnHMyePbumtdCB/e53v8PXvvY1bN++HWPHjj3g49555x2sXLkSV199NY499tgjWCHR8MYAR1QDO3fuxLPPPqv/rCgKtm7dCo/Hg5aWFv1+m8122AKcx+PBhAkTYLVaD+n5EyZMQF1d3WGp5VApioJvfetb2LlzJ1588UUGuM+Bjz/+GP/1X/+FWbNmMcARHQQGOKIaWLhwIRYuXKj/nEgk4PF4sGDBAjzyyCOD8p5z5szBnDlzDum5FosFmzZtOswVHbwXX3wRO3fuxIUXXohnnnkG7733Hk444YRal0VEdMQxwBENA2vWrMHHH3+Mm2++GcuWLcPf//53jB07Fj/+8Y/R0dGB1atX44033kBXVxfq6+tx0UUX4YILLoDJZNJfY8OGDXj66adxww03oLGxEYA6zJXJZLBo0SI88MADeOONNxAIBHDNNdfg1FNP1Z9bLBbxox/9CLNmzcJpp50GAHjrrbewdu1a3HLLLXjuueewatUqZDIZzJs3D0uXLoXZ3H/xsn37dvz85z/HJ598ggkTJuBf/uVf8Prrr6OjowPf+MY3qpoOy5cvR319PR5++GGMGjUKy5cvx7333rvfx27YsAGPPfYYNm7cCIfDgWnTpuGqq65CU1OT/piOjg6sWLECr732GoQQmDRpEpYsWaJ3gu69916MGzcOF154Yb/X/v3vf49EIoHrrrsOANDT04MHH3wQF110ETKZDH77299iz549+OlPf4rx48fj+eefx3PPPYetW7dCCIEZM2Zg6dKlGDly5IC6Q6EQVq5ciZdffhn5fB7HHHMMLr/8cpx88slYvXo1Nm7ciFtvvRWy3H8X5pdffhnr1q3DLbfcAq/Xu99pkk6nsWbNGrz88svYtWsXbDYbzjrrLCxcuBA+n09/XDgcxgMPPIB58+ZBkiT86le/wt69e3HyySfjxhtvRH19fb/XTaVSWLZsGV5++WXU1dXh6quvPtBX+Jm88847WL58OXbv3o3Ro0fjmmuuwYknntjvMdFoFA8//DDWr1+PaDSKxsZGnHLKKbj66qthsVgAADt27MBvfvMbbNmyBfl8HqNGjcLs2bNx/vnnD0rdRINCEFHNxeNxAUBcffXV+/399ddfL/x+vzjnnHPE2LFjxaWXXiquu+46IYQQt912mxg5cqRYuHChuP7668WsWbMEALFgwQKhKIr+Gk888YQAID744AP9vnPOOUdMmTJFTJs2TUybNk0sWrRIjBo1SkiSJP70pz/pj8vlcgKAuPPOO/X7HnzwQQFAXHXVVWLEiBHi8ssvFzNmzBAA9No0L774orBaraKpqUnccMMNYu7cuaKpqUmceuqpYsKECVVNo3A4LOx2u7j55puFEEIsWrRI1NXViWw2O+Cx//7v/y4AiDFjxohrr71WXHHFFWLMmDHil7/8pf6Y//mf/xF2u134fD6xdOlS8bWvfU2cdNJJ4oorrtAf09raut/vZO7cuWLatGn6z5s2bdKnucvlEmeffba48MILxVtvvSU6OjqExWIRZ555prj++uvF4sWLRTAYFF6vV7z33nv9XnfdunXC6/UKp9MpFi5cKK677joxY8YMMXv2bCGEEE8++aQAIJ5//vkBNX3hC18QJ554Yr/v/NP+8pe/CI/HIy644AJx4403ivnz5wubzSbGjRsnuru79cdt27ZNABCLFi0Sfr9fzJs3T8ybN0+YTCYxYcIEkUql+n0vkyZNEmazWSxcuFBceeWVwuVyiXnz5gkAYvv27QesRwghHn/8cQFAPPPMM2Ufd8cddwgAYsqUKeL6668XkyZNEgDEj370I/0x6XRaHH300cLv94ulS5eKm266SVx88cXC5/OJnp4eIYQQH3zwgbDb7WLcuHHi2muvFV//+tfFmWeeKaZPn172/YmGGgY4oiGgmgAHQFx22WUDAsvu3btFsVjsd9+yZcsEAPHuu+/q9x0owAEQd9xxh77ij0QioqmpSZx//vn648oFuJkzZ4p4PC6EEEJRFLFkyRJhsVj0+4QQYvLkyWL8+PEiGo3q9y1fvlwAqDrAPfTQQwKAeOutt4QQQqxdu1YAEE899VS/x7388ssCgLj22mtFoVDQ7y8Wi3pIicViwu12i+nTp/erSQghOjs79f8fbIBzOp3i/fff7/fYTCYj9u3b1+++7u5uMWbMGHHllVfq9+XzedHS0iLGjx/fr4a+NeVyOdHc3CwWLlzY7/fvvPOOACAeeuihAbV++n0TiUS/+z788ENht9vFz372M/0+LcB5vV6xadMm/f5HH31UABDPPvusft93vvMdAUD84x//0O/bsGGDsFgshy3AbdiwQQAQS5Ys0ef1QqEgFixYICRJ0mt8+umnBQDx+uuv93t+MpkU+XxeCCHEzTffLOrq6gZMh1gsVrZOoqGGpxEhGkZ+/OMfDzgIYeTIkZBlGYqioLu7G+3t7Tj33HMhyzL+93//t+Jrer1efPe734UkSQAAn8+HOXPm4NVXX62qpttvvx1utxsAIEkSFi5ciHw+j3feeQcAsGnTJn34t+/Q3pVXXolRo0ZV9R4A8Mgjj+DYY4/FtGnTAADnnHMOWlpasHz58n6PW7FiBZxOJ37yk5/0G0KWZVk/CGP16tVIJBL4yU9+MmC4saGhoeqaPu2rX/0qjj/++H732Ww2fdg2kUigvb0duVwOZ599dr/v5/nnn0d7ezvuvPPOATVoP1ssFlx77bVYtWoVOjs79d//+te/hsvlwpIlS8rWV1dXB5fLBQCIRCJob29HMBjEiSeeuN955Wtf+xomTJig/3z55ZcDQL95Y9WqVTj77LP7DblPnjxZf+zh8PTTTwMA7rzzTn3o2GQy4Y477oAQAqtWrQIA/Xc7duzo93yn06kP6cuyjGw2i7179/Z7jMfjOWz1Eh0JDHBEw4Tdbse4ceMG3L97924sXrwY9fX1aGhoQGtrK4466igoitJvJX8g48aN0/cN0tTX1yOZTFZVV98VvPZcAPrz33//fQAYcOoSk8mEyZMnV/UeH374Id58801cddVVetA0mUy44oorsHbt2n4r41dffRUTJ05EIBA44Ou98sorAIBTTjmlqvev1v6OohRC4Oc//zmmTp0Kj8eD1tZWtLa24uGHH0ZXVxeEEP1q+uIXv1j2Pa6//noUi0U8+uijANRQ+Pjjj2PJkiUH3PdNk81mcdttt2Hs2LEIBAJ6La+99hq6uroGPH7ixIn9frbb7XC73fp3m0gksHnz5v0eSHI4Dy5566234PV6cfTRR/e7f/LkybDb7XjrrbcAALNnz8aJJ56IRYsWYcqUKbjpppuwZs0aFAoF/TnXX389rFYrJk+ejJkzZ+L222/Hm2++edhqJTpSGOCIhgmXy6WHF40QAgsWLMDf//53/OIXv8DGjRvR3t6Offv2wWw26+GgnE+HNwAD3udgnn8wz62W1mX75S9/ialTp+q3J554AoqiYMWKFfpjC4UCbDZb2dcrFAqQJOmQT6miKMp+79c6kX09+eSTuPnmm3HGGWfg9ddfx86dO9HZ2YmbbrppQE0AKtY+atQozJs3D8uWLYOiKHjiiScQj8dxww03VKz7jjvuwN13341//ud/xnvvvYe2tjZ0dnbijDPO2O+8Umne0Gre33Q81Gm7P8Vicb+vp32HWh0OhwOvvfYaVq5cienTp2PVqlW44IILcMoppyASiQBQQ9/GjRtx7733wu/3495778Upp5yCa665pqq/F6KhggGOaBjbsmUL3njjDdx+++1YvHgxJk6ciObmZqTT6X5dh1qaOnUqALWL1lexWMSGDRsqPj+Xy2HFihWYNGkSLrroIpx11ln67ZJLLsHYsWPxyCOP6CvfKVOmYPPmzcjn8wd8zWOPPRZCCGzcuLHse1utVsRisQH37969u2LdmscffxwTJ07Efffdh1NOOQWjR49GQ0PDgCE8rXtXzTT5+te/jq1bt+Kll17CsmXLMH36dEyfPr3i81asWIFLLrkE//qv/4qpU6dixIgRqK+vx86dO6v+PH15vV40NjZi69atA363v/sO1YQJE9Dd3Y1wONzv/o6ODsRisX6dQpvNhsWLF2PFihXYs2cPHn30Uaxfv77f6XkaGhpw00034U9/+hO6urpw4403Yvny5Vi/fv1hq5losDHAEQ1jWofk08Odd999dy3K2a+JEydi8uTJuO+++/qFocceewxtbW0Vn79mzRp0dXXhtttuwz333DPgdvPNN2Pz5s36flmLFy9GKBTCQw89NOC1tJB32WWXQZIk/OAHPxjQden78/HHH4/XX3+9Xxj829/+ho8++qjqz2+xWAYE6s2bN/c7kTMAXHjhhXA4HPjRj3404PJTn67xnHPOwdFHH41vf/vbeOONN6rqvmm1JBKJfvc988wz2L59e9Wfpy9ZlnHBBRfgmWee6fddRiIR/O53vzuk19yfiy++GADw85//vN/9999/f7/ff/rvQJIkXHDBBQDU07Ps7zF2u10/IXRPT89hq5losPE8cETD2JgxYzB9+nR873vfQzKZxJgxY/DMM8/go48+qjgUdyQ9+OCDOO+88zB+/HhcfPHF2LVrF9577z2ceuqpFVeay5cvh91uxyWXXLLf3y9atAjf/va38cgjj+DUU0/F/PnzMWfOHHzzm9/Eq6++itmzZyOdTmPdunU499xzcc0112DEiBH6ZcHa29uxZMkS2Gw2vP322zCZTHowWLJkCZ599lnMnj0b8+fPx86dO/H4448P2O+vnAULFuCPf/wj5s+fjwULFmD37t144IEHMGXKFLz33nv649xuN+655x7ceOONmDFjBq666ip4vV68//776O7uxmOPPaY/VpZl3HDDDbj11lvhdruxaNGiqmv56U9/iq9//ev48pe/jPXr1+Oxxx47qM/zad/5znfw1FNPYebMmfjmN78Jq9WK+++/H62trQM6ZuV8//vfx69//ev93j9z5kxcdNFFuOOOO7Br1y585StfwUsvvYRHH30Ul156qb7f4C9+8Qt92HTcuHGIxWJYvnw5LBYLrrrqKgDQD/Q444wz0NTUhN27d+P+++/H+PHjcfrppx/ydCA60kz/8R//8R+1LoLI6IrFoh5o9rcT+65du2C1WnHppZf2u1+SJJx//vnYtWsXVq9ejRdffBGTJk3CY489hm3btuFLX/qSftRmKBRCV1cX5s+fD7/fD0DtBLW0tAy4JFVbWxuEEPrVIoQQWL9+PU4//XT9YISuri7EYjEsWLAATqdTf24ymcTOnTsxd+5ctLa2AgCOOuooXHHFFchms2hvb8dxxx2H3/zmN/jjH/+oH1m5P5lMBqtWrcIll1yC8847b7+PcbvdiMfjCIVCmD9/PkwmEy677DKMGjUKL730Ev77v/8bb7zxBpqamrB06VL9iNDTTjsNM2bMwIcffoiVK1fi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/baIiIiIWpxebmmzAHfhhRdi7dq1tbZ9++236NOnT4NznHTq1Anbt2/Hv/71LwDBOeQA4L333kMgEKgT4HJycpCTk1PvtU6fPo3Bgwc3920QERERtTq93NJmAW7SpEmYP38+1q5diyuuuAIFBQVYsmQJbrzxxvAxmzZtwjvvvIN58+bBarXin//8Z61r7Nu3D/369cPChQsxYsQIw/fWNA0FBQUNtvQRERERtRdGckubPdF/ySWX4OGHH8bEiRNx6aWXol+/fujduzcefvjh8DE7d+7E/PnzEQgEWvTepaWl8Pv9DHBERETU7hnJLW3WAgcEJ+OdMWMGvv76a3Tr1g0XXXRRrcEJkydPxgUXXAC73V7v+d26dcP27dvRu3fvRt23oKAAQPA5PCIiIqL2zEhuadMABwC9evVCr1696t2XlpYWca1Sm83WpOfYysrKAAAul6vR5xIRERG1JSO5JS4mRSstLQXAAEdERETtn5HcEhcBLpRkm7OWKhEREVFbMJJb4irAcRktIiIiau+M5Ja4CHChpsjk5OQoV0JEREQUmZHcElcBji1wRERE1N4ZyS1xEeAqKipgsVhgNpujXQoRERFRREZyS1wEuEAgwPBGREREMcFIbomLAOfz+WCz2aJdBhEREZEuI7klLgJcZWUlEhISol0GERERkS4juSUuApzX62ULHBEREcUEI7klbgJcQ+urEhEREbUnRnJLXAS4qqoqBjgiIiKKCUZyS1wEOI5CJSIioljBUag1iGLcvFUiIiKKcXq5JS5SjaZp0S6BiIiIyBAjuSUuAhwRERHRz0lcBDhBEKCqarTLICIiItJlJLfERYATRZEBjoiIiGKCkdzCAEdERETUjjDAVTOZTJBlOdplEBEREekyklsY4IiIiIjaEQa4agxwREREFCsY4KqZzWYEAoFol0FERESky0huiYsAZ7PZ4PV6o10GERERkS4juSUuApzVaoXP54t2GURERES6jOSWuAhwFosFfr8/2mUQERER6TKSW+IiwCUkJMDj8US7DCIiIiJdRnJLXAU4TuZLRERE7Z2R3BI3AQ4ABzIQERFRu2ckt8RFgEtKSgIAlJeXR7kSIiIiosiM5Ja4CHAOhwMAUFFREeVKiIiIiCIzklviIsDZbDYA4EAGIiIiaveM5Ja4CHB2ux0AAxwRERG1f0ZyCwMcERERUTvCAFctMTERAFBZWRnlSoiIiIgiM5Jb4iLAOZ1OAByFSkRERO2fkdwSFwGOLXBEREQUK9gCVy00HJcBjoiIiNo7I7klLgJccnIyRFFEQUFBtEshIiIiishIbomLAGcymZCens4AR0RERO2ekdwSFwEOCDZHchADERERxQK93BI3AS4xMZHPwBEREVFM0MstcRXgqqqqol0GERERkS693BI3AS4pKYldqERERBQT9HJL3AQ4l8uF0tLSaJdBREREpEsvt8RNgHM6nQxwREREFBP0ckvcBLiUlBSUlJREuwwiIiIiXXq5JW4CnMPhQFVVFVRVjXYpRERERBHp5Za4CXA2mw0A4PV6o1wJERERUWR6uSVuAhzXQyUiIqJYoZdb4ibApaWlAQBOnz4d5UqIiIiIItPLLXEX4IqLi6NcCREREVFkerklbgJcqCmyoqIiypUQERERRaaXW+ImwCUlJQEAV2MgIiKidk8vt8RNgEtNTQUAFBYWRrkSIiIiosj0ckvcBLiMjAwAHMRARERE7Z9ebombAGexWOBwOOB2u6NdChEREVFEerklbgIcEHwgkIMYiIiIKBZEyi1xFeAsFgu69OUPAAAgAElEQVT8fn+0yyAiIiLSFSm3xFWAs9lsXEqLiIiIYkKk3MIAR0RERNQOMcBVYxcqERERxQp2oVYzmUyQZTnaZRARERHpipRb4irASZIERVGiXQYRERGRrki5Je4CnKqq0S6DiIiISFek3BJXAY6IiIjo5yCuApyqqhAEIdplEBEREemKlFviKsApigJJkqJdBhEREZGuSLmFAY6IiIioHWKAq6aqKkQxrt4yERERxahIuSWu0kwgEIDZbI52GURERES6IuUWBjgiIiKidogBrposywxwREREFBMi5Za4CnAejwc2my3aZRARERHpipRb4i7A2e32aJdBREREpCtSbomrAOf3+2GxWKJdBhEREZGuSLklbgKcpmmorKyEw+FotXsElAC+yfum1a5PRERE8UEvt8RNgPN4PFAUBUlJSa1yfZ/iwzXvX4Pb1t6G42XHW+UeREREFB/0ckvcBLiysjIAgNPpbJXrWyUrhmUNg6IpWLhzYavcg4iIiOKDXm6JmwBXUlICAEhOTm61e9w26DaIgogPD36IU5WnWu0+RERE9POml1viJsCVlpYCAFwuV6vdo6uzK8Z0HQNZk7Fs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Z/fu3Tj//PMRDAah0+nwxBNPoKioCMDg7eForKceeOABvPrqq/D7/TjllFOyot08z+O2227DySefDI1Gg3Xr1uG6666Dx+PBr371q5zuzwTcYSIIAgBlRUkm8Xic7Ql3AGVlZbjtttvU92eeeSZisRgeeeQRJuAOgiAIfcoYIYSVs3740Y9+lPX+7LPPRk1NDVavXo177703T1bljy+//BLnnXcebrrpJlxxxRXqcVp3xeNxWCwW9XgsFlPPjSYIIfiv//ovfPTRR/jwww+zVqHW1dWhrq5OfX/OOeegp6cHjz766KgTcHV1dejt7YUsy3j99dexZMkSAMCyZctYe3gATz31FJ566im43W5cc801mD9/Pr7++msYjUbYbDbceeed6rWnn3460uk0fvvb3+Lmm2/OaastNoR6mEycOBEA+kTburq6UFtbmw+TRhRz587F7t27IUlSvk0Z1kyaNAnd3d1Z4XWv1wtJklg5OwgWiwUnnHACGhsb823KUWfLli04/fTTcdVVV+F//ud/ss7RcsPqLkW83XDDDXjllVfw7rvvqvX6QGg0GsyZM2dUlikKx3G46KKLcPbZZ+Pll18GAIwbNw46nY6VqQMoKirCfffdhz179mDz5s0DXjd37lz09vbmHK1kAu4wKSoqQm1tLdavX68eC4VC2LhxY585FIy+bN68GWPHjmWT0g/CySefjFAohM8++0w99s4774DjuFGXt+u7Eo/HsWPHjtxzKx0jbNu2DQsXLsRll12GBx98sM+k6unTp8NkMmXVXTt37kRbW9uoqrsIIfjFL36B559/Hu+++y6mTp2a099s3rwZEyZMOAoWDl8IIejp6YHJZAKgTJM58cQTs8pUKpXChg0bRlWZ6o+enh4AgNlsHvCazZs3w+l0wm6353RP1moOAT/96U9x0003YebMmaivr8ctt9wCl8uFiy++ON+mDSv++Mc/ghCC6dOnQxRFvPnmm1i9ejUefPDBfJuWd95//320tbVh06ZNSCaTePbZZwEAP/zhD+F0OjFt2jQsWLAAK1euxOrVqxEOh3HrrbfiiiuugNVqzbP1R49gMIi1a9cCUIb6vvzySzz77LMoKyvDaaedBgC44YYbsGDBAowfPx5dXV146KGH4PP5cM011+TT9KNKV1cXFi5cCKfTiRkzZuC5555Tzy1cuBDl5eXgeR4r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\n", + "text/plain": [ + "<Figure size 720x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_training(history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.utils import class_weight\n", + "\n", + "#list_classes = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "#y = l[list_classes].values\n", + "#sample_weights = class_weight.compute_sample_weight('balanced', y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#sample_weights.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "size =5" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "layer_name = 'my_layer'\n", + "intermediate_layer_model = Model(inputs=model.input,\n", + " outputs=model.get_layer('dense').output)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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" + ] + } + ], + "source": [ + "train_prediction = intermediate_layer_model.predict_generator(train_under_generator)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "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" + ] + } + ], + "source": [ + "valid_prediction = intermediate_layer_model.predict_generator(valid_under_generator)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/ubuntu/anaconda3/envs/tensorflow2_p36/lib/python3.6/site-packages/sklearn/externals/joblib/__init__.py:15: FutureWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.\n", + " warnings.warn(msg, category=FutureWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "['Valid_Classifier1.pkl']" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.externals import joblib\n", + "joblib.dump(train_prediction, 'train_Classifier1.pkl')#save model\n", + "joblib.dump(valid_prediction, 'Valid_Classifier1.pkl')#save model" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((257598, 256), (64320, 256))" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_prediction.shape, valid_prediction.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(numpy.ndarray, numpy.ndarray)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(train_prediction), type(valid_prediction)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from joblib import dump, load\n", + "train_prediction = load('train_Classifier1.pkl')\n", + "valid_prediction = load('Valid_Classifier1.pkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_XG_SVC = train_prediction\n", + "X_dev_XG_SVC= valid_prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(257598, 256)" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train_XG_SVC.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_train = l[['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']].values" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "import xgboost as xgb\n", + "from sklearn import svm\n", + "from sklearn.multiclass import OneVsRestClassifier\n", + "from sklearn.svm import LinearSVC\n", + "from skmultilearn.problem_transform import BinaryRelevance\n", + "seed = 42\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "classifier = OneVsRestClassifier(svm.SVC(kernel='rbf', probability=True, verbose=True,class_weight={0:1.0,1:2.0}, decision_function_shape='ovr'), n_jobs=-1)\n", + "classifier.fit(X_train_XG_SVC, y_train).score(X_dev_XG_SVC, y_dev)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "size = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SVM" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "classifier = BinaryRelevance(svm.SVC(kernel='rbf', probability=True, verbose=True,class_weight={0:1.0,1:2.0}, decision_function_shape='ovr'))\n", + "classifier.fit(X_train_XG_SVC, y_train).score(X_dev_XG_SVC, y_dev)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "prediction1 = classifier.predict_proba(X_dev_XG_SVC)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "preds1 = np.where(prediction1 < 0.5, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Classification Report')\n", + "target_names = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "print(classification_report(y_true, preds1, target_names=target_names))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "joblib.dump(xgb1, 'Classifier1.pkl')#save model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Xgboost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xgb1 = xgb.sklearn.XGBClassifier(\n", + " learning_rate =0.1,\n", + " n_estimators=1000,\n", + " max_depth=5,\n", + " min_child_weight=11,\n", + " gamma=0.1,\n", + " subsample=0.8,\n", + " colsample_bytree=0.7,\n", + " objective='multi:softprob',\n", + " n_jobs=-1,\n", + " scale_pos_weight=1,\n", + " seed=seed)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xgb1.fit(X_train_XG_SVC, y_train).score(X_dev_XG_SVC, y_dev)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred_xgb = xgb1.predict_proba(X_val_XG_SVC)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "preds2 = np.where(y_pred_xgb < 0.5, 0, 1) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Classification Report')\n", + "target_names = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "print(classification_report(y_true, preds2, target_names=target_names))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "joblib.dump(xgb1, 'Classifier2.pkl')#save model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stacked model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "final_prediction = (preds + preds1 + preds2) / 3\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_train = l[['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']].values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "final_prediction = np.where(final_prediction < 0.5, 0, 1) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Classification Report')\n", + "target_names = ['any','epidural','intraparenchymal','intraventricular', 'subarachnoid','subdural']\n", + "print(classification_report(y_true, final_prediction, target_names=target_names))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "joblib.dump(final_prediction, 'final_Classifier.pkl')#save model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}