{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os, shutil\nimport cv2\nimport matplotlib.image as mpimg\nimport seaborn as sns\n%matplotlib inline\nplt.style.use('ggplot')","metadata":{"execution":{"iopub.status.busy":"2024-04-26T15:28:47.233176Z","iopub.execute_input":"2024-04-26T15:28:47.233580Z","iopub.status.idle":"2024-04-26T15:28:48.751346Z","shell.execute_reply.started":"2024-04-26T15:28:47.233548Z","shell.execute_reply":"2024-04-26T15:28:48.749965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Dataset\nimport zipfile\n\nz = zipfile.ZipFile('archive.zip')\n\nz.extractall()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folder = 'brain_tumor_dataset/yes/'\ncount = 1\n\nfor filename in os.listdir(folder):\n    source = folder + filename\n    destination = folder + \"Y_\" +str(count)+\".jpg\"\n    os.rename(source, destination)\n    count+=1\nprint(\"All files are renamed in the yes dir.\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folder = 'brain_tumor_dataset/no/'\ncount = 1\n\nfor filename in os.listdir(folder):\n    source = folder + filename\n    destination = folder + \"N_\" +str(count)+\".jpg\"\n    os.rename(source, destination)\n    count+=1\nprint(\"All files are renamed in the no dir.\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA(Exploratory Data Analysis)","metadata":{}},{"cell_type":"code","source":"listyes = os.listdir(\"brain_tumor_dataset/yes/\")\nnumber_files_yes = len(listyes)\nprint(number_files_yes)\n\nlistno = os.listdir(\"brain_tumor_dataset/no/\")\nnumber_files_no = len(listno)\nprint(number_files_no)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot","metadata":{}},{"cell_type":"code","source":"data = {'tumorous': number_files_yes, 'non-tumorous': number_files_no}\n\ntypex = data.keys()\nvalues = data.values()\n\nfig = plt.figure(figsize=(5,7))\n\nplt.bar(typex, values, color=\"red\")\n\nplt.xlabel(\"Data\")\nplt.ylabel(\"No of Brain Tumor Images\")\nplt.title(\"Count of Brain Tumor Images\")\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Augmentation","metadata":{}},{"cell_type":"code","source":"# 155(61%), 98(39%)\n# imbalance","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Flatten, Dense, Dropout\nfrom tensorflow.keras.applications.vgg19 import VGG19\nfrom tensorflow.keras.optimizers import SGD, Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def timing(sec_elapsed):\n    h = int(sec_elapsed / (60*60))\n    m = int(sec_elapsed % (60*60) / 60)\n    s = sec_elapsed % 60\n    return f\"{h}:{m}:{s}\"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def augmented_data(file_dir, n_generated_samples, save_to_dir):\n    data_gen = ImageDataGenerator(rotation_range=10, \n                      width_shift_range=0.1,\n                      height_shift_range=0.1,\n                      shear_range=0.1,\n                      brightness_range=(0.3, 1.0),\n                      horizontal_flip=True,\n                      vertical_flip=True,\n                      fill_mode='nearest')\n    for filename in os.listdir(file_dir):\n        image = cv2.imread(file_dir + '/' + filename)\n        image = image.reshape((1,) + image.shape)\n        save_prefix = 'aug_' + filename[:-4]\n        i=0\n        for batch in data_gen.flow(x = image, batch_size = 1, save_to_dir = save_to_dir, save_prefix = save_prefix, save_format = \"jpg\"):\n            i+=1\n            if i>n_generated_samples:\n                break","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\nstart_time = time.time()\n\nyes_path = 'brain_tumor_dataset/yes' \nno_path = 'brain_tumor_dataset/no'\n\naugmented_data_path = 'augmented_data/'\n\naugmented_data(file_dir = yes_path, n_generated_samples=6, save_to_dir=augmented_data_path+'yes')\naugmented_data(file_dir = no_path, n_generated_samples=9, save_to_dir=augmented_data_path+'no')\n\nend_time = time.time()\nexecution_time = end_time - start_time\nprint(timing(execution_time))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_summary(main_path):\n    yes_path = \"augmented_data/yes/\" \n    no_path = \"augmented_data/no/\"\n    \n    n_pos = len(os.listdir(yes_path))\n    n_neg = len(os.listdir(no_path))\n    \n    n = (n_pos + n_neg)\n    \n    pos_per = (n_pos*100)/n\n    neg_per = (n_neg*100)/n\n    \n    print(f\"Number of sample: {n}\")\n    print(f\"{n_pos} Number of positive sample in percentage: {pos_per}%\")\n    print(f\"{n_neg} Number of negative sample in percentage: {neg_per}%\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_summary(augmented_data_path)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"listyes = os.listdir(\"augmented_data/yes/\")\nnumber_files_yes = len(listyes)\nprint(number_files_yes)\n\nlistno = os.listdir(\"augmented_data/no/\")\nnumber_files_no = len(listno)\nprint(number_files_no)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = {'tumorous': number_files_yes, 'non-tumorous': number_files_no}\n\ntypex = data.keys()\nvalues = data.values()\n\nfig = plt.figure(figsize=(5,7))\n\nplt.bar(typex, values, color=\"red\")\n\nplt.xlabel(\"Data\")\nplt.ylabel(\"No of Brain Tumor Images\")\nplt.title(\"Count of Brain Tumor Images\")\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preprocessing","metadata":{}},{"cell_type":"code","source":"# Convert BGR TO GRAY\n# GaussianBlur\n# Threshold\n# Erode\n# Dilate\n# Find Contours","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import imutils\ndef crop_brain_tumor(image, plot=False):\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    gray = cv2.GaussianBlur(gray, (5,5), 0)\n    \n    thres = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]\n    thres =cv2.erode(thres, None, iterations = 2)\n    thres = cv2.dilate(thres, None, iterations = 2)\n    \n    cnts = cv2.findContours(thres.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n    cnts = imutils.grab_contours(cnts)\n    c = max(cnts, key = cv2.contourArea)\n    \n    extLeft = tuple(c[c[:,:,0].argmin()][0])\n    extRight = tuple(c[c[:,:,0].argmax()][0])\n    extTop = tuple(c[c[:,:,1].argmin()][0])\n    extBot = tuple(c[c[:,:,1].argmax()][0])\n    \n    new_image = image[extTop[1]:extBot[1], extLeft[0]:extRight[0]] \n    \n    if plot:\n        plt.figure()\n        plt.subplot(1, 2, 1)\n        plt.imshow(image)\n        \n        plt.tick_params(axis='both', which='both', \n                        top=False, bottom=False, left=False, right=False,\n                        labelbottom=False, labeltop=False, labelleft=False, labelright=False)\n        \n        plt.title('Original Image')\n            \n        plt.subplot(1, 2, 2)\n        plt.imshow(new_image)\n\n        plt.tick_params(axis='both', which='both', \n                        top=False, bottom=False, left=False, right=False,\n                        labelbottom=False, labeltop=False, labelleft=False, labelright=False)\n\n        plt.title('Cropped Image')\n        plt.show()\n    return new_image\n    ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = cv2.imread('augmented_data/yes/aug_Y_1_0_1760.jpg')\ncrop_brain_tumor(img, True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = cv2.imread('augmented_data/no/aug_N_1_0_109.jpg')\ncrop_brain_tumor(img, True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folder1 = 'augmented_data/no/'\nfolder2 = 'augmented_data/yes/'\n\nfor filename in os.listdir(folder1):\n    img = cv2.imread(folder1 + filename)\n    img = crop_brain_tumor(img, False)\n    cv2.imwrite(folder1 + filename, img)\nfor filename in os.listdir(folder2):\n    img = cv2.imread(folder2 + filename)\n    img = crop_brain_tumor(img, False)\n    cv2.imwrite(folder2 + filename, img)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# image loading","metadata":{}},{"cell_type":"code","source":"from sklearn.utils import shuffle\ndef load_data(dir_list, image_size):\n    X=[]\n    y=[]\n    \n    image_width, image_height=image_size\n    \n    for directory in dir_list:\n        for filename in os.listdir(directory):\n            image = cv2.imread(directory + '/' + filename)\n            image = crop_brain_tumor(image, plot=False)\n            image = cv2.resize(image, dsize=(image_width, image_height), interpolation = cv2.INTER_CUBIC)\n            image = image/255.00\n            X.append(image)\n            if directory[-3:] == \"yes\":\n                y.append(1)\n            else:\n                y.append(0)\n    X=np.array(X)\n    y=np.array(y)\n    \n    X,y = shuffle(X,y)\n    print(f\"Number of example is : {len(X)}\")\n    print(f\"X SHAPE is : {X.shape}\")\n    print(f\"y SHAPE is : {y.shape}\")\n    return X,y\n            ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"augmented_path = 'augmented_data/'\naugmeneted_yes = augmented_path + 'yes'\naugmeneted_no = augmented_path + 'no'\n\nIMAGE_WIDTH, IMAGE_HEIGHT = (240,240)\n\nX,y = load_data([augmeneted_yes, augmeneted_no], (IMAGE_WIDTH, IMAGE_HEIGHT))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_sample_images(X, y, n=50):\n\n    for label in [0,1]:\n        images = X[np.argwhere(y == label)]\n        n_images = images[:n]\n        \n        columns_n = 10\n        rows_n = int(n/ columns_n)\n\n        plt.figure(figsize=(20, 10))\n        \n        i = 1        \n        for image in n_images:\n            plt.subplot(rows_n, columns_n, i)\n            plt.imshow(image[0])\n            \n            plt.tick_params(axis='both', which='both', \n                            top=False, bottom=False, left=False, right=False,\n                            labelbottom=False, labeltop=False, labelleft=False,\n                            labelright=False)\n            \n            i += 1\n        \n        label_to_str = lambda label: \"Yes\" if label == 1 else \"No\"\n        plt.suptitle(f\"Brain Tumor: {label_to_str(label)}\")\n        plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_sample_images(X,y)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Spliting","metadata":{}},{"cell_type":"code","source":"# Train\n# Test\n# Validation","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('tumorous_and_nontumorous'):\n    base_dir = 'tumorous_and_nontumorous'\n    os.mkdir(base_dir)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('tumorous_and_nontumorous/train'):\n    train_dir = os.path.join(base_dir , 'train')\n    os.mkdir(train_dir)\nif not os.path.isdir('tumorous_and_nontumorous/test'):\n    test_dir = os.path.join(base_dir , 'test')\n    os.mkdir(test_dir)\nif not os.path.isdir('tumorous_and_nontumorous/valid'):\n    valid_dir = os.path.join(base_dir , 'valid')\n    os.mkdir(valid_dir)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('tumorous_and_nontumorous/train/tumorous'):\n    infected_train_dir = os.path.join(train_dir, 'tumorous')\n    os.mkdir(infected_train_dir)\nif not os.path.isdir('tumorous_and_nontumorous/test/tumorous'):\n    infected_test_dir = os.path.join(test_dir, 'tumorous')\n    os.mkdir(infected_test_dir)\nif not os.path.isdir('tumorous_and_nontumorous/valid/tumorous'):\n    infected_valid_dir = os.path.join(valid_dir, 'tumorous')\n    os.mkdir(infected_valid_dir)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('tumorous_and_nontumorous/train/nontumorous'):\n    healthy_train_dir = os.path.join(train_dir, 'nontumorous')\n    os.mkdir(healthy_train_dir)\nif not os.path.isdir('tumorous_and_nontumorous/test/nontumorous'):\n    healthy_test_dir = os.path.join(test_dir, 'nontumorous')\n    os.mkdir(healthy_test_dir)\nif not os.path.isdir('tumorous_and_nontumorous/valid/nontumorous'):\n    healthy_valid_dir = os.path.join(valid_dir, 'nontumorous')\n    os.mkdir(healthy_valid_dir)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_dataset_tumorours = os.path.join('augmented_data','yes/')\noriginal_dataset_nontumorours = os.path.join('augmented_data','no/')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/yes/')\nfnames = []\nfor i in range(0,759):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_tumorours, fname)\n    dst = os.path.join(infected_train_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/yes/')\nfnames = []\nfor i in range(759,922):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_tumorours, fname)\n    dst = os.path.join(infected_test_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/yes/')\nfnames = []\nfor i in range(922,1085):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_tumorours, fname)\n    dst = os.path.join(infected_valid_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 80% 10% 10%","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/no/')\nfnames = []\nfor i in range(0,686):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_nontumorours, fname)\n    dst = os.path.join(healthy_train_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/no/')\nfnames = []\nfor i in range(686,833):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_nontumorours, fname)\n    dst = os.path.join(healthy_test_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = os.listdir('augmented_data/no/')\nfnames = []\nfor i in range(833,979):\n    fnames.append(files[i])\nfor fname in fnames:\n    src = os.path.join(original_dataset_nontumorours, fname)\n    dst = os.path.join(healthy_valid_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Buliding","metadata":{}},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255,\n                  horizontal_flip=0.4,\n                  vertical_flip=0.4,\n                  rotation_range=40,\n                  shear_range=0.2,\n                  width_shift_range=0.4,\n                  height_shift_range=0.4,\n                  fill_mode='nearest')\ntest_data_gen = ImageDataGenerator(rescale=1.0/255)\nvalid_data_gen = ImageDataGenerator(rescale=1.0/255)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_directory('tumorous_and_nontumorous/train/', batch_size=32, target_size=(240,240), class_mode='categorical',shuffle=True, seed = 42, color_mode = 'rgb')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = train_datagen.flow_from_directory('tumorous_and_nontumorous/test/', batch_size=32, target_size=(240,240), class_mode='categorical',shuffle=True, seed = 42, color_mode = 'rgb')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_generator = train_datagen.flow_from_directory('tumorous_and_nontumorous/valid/', batch_size=32, target_size=(240,240), class_mode='categorical',shuffle=True, seed = 42, color_mode = 'rgb')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_labels = train_generator.class_indices\nclass_name = {value: key for (key,value) in class_labels.items()}","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_name","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = VGG19(input_shape = (240,240,3), include_top=False, weights='imagenet')\n\nfor layer in base_model.layers:\n    layer.trainable=False\n\nx=base_model.output\nflat = Flatten()(x)\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndrop_out = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(drop_out)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_01 = Model(base_model.input, output)\nmodel_01.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# callback","metadata":{}},{"cell_type":"code","source":"filepath = 'model.h5'\nes = EarlyStopping(monitor='val_loss', verbose = 1, mode='min',patience=4)\ncp = ModelCheckpoint(filepath, monitor='val_loss', verbose = 1, save_best_only=True, save_weights_only=False, mode='auto',save_freq='epoch')\nlrr = ReduceLROnPlateau(monitor='val_accuarcy', patience=3, verbose = 1, factor = 0.5, min_lr = 0.0001)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum = 0.9, nesterov = True)\nmodel_01.compile(loss='categorical_crossentropy', optimizer = sgd, metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_01 = model_01.fit(train_generator, steps_per_epoch=10, epochs = 2, callbacks=[es,cp,lrr], validation_data=valid_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot performance\nfig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12,6))\nfig.suptitle(\"Model Training (Frozen CNN)\", fontsize=12)\nmax_epoch = len(history_01.history['accuracy'])+1\nepochs_list = list(range(1, max_epoch))\n\nax1.plot(epochs_list, history_01.history['accuracy'], color='b', linestyle='-', label='Training Data')\nax1.plot(epochs_list, history_01.history['val_accuracy'], color='r', linestyle='-', label='Validation Data')\nax1.set_title('Training Accuracy', fontsize=12)\nax1.set_xlabel('Epochs', fontsize=12)\nax1.set_ylabel('Accuracy', fontsize=12)\nax1.legend(frameon=False, loc='lower center', ncol=2)\n\nax2.plot(epochs_list, history_01.history['loss'], color='b', linestyle='-', label='Training Data')\nax2.plot(epochs_list, history_01.history['val_loss'], color='r', linestyle='-', label='Validation Data')\nax2.set_title('Training Loss', fontsize=12)\nax2.set_xlabel('Epochs', fontsize=12)\nax2.set_ylabel('Loss', fontsize=12)\nax2.legend(frameon=False, loc='upper center', ncol=2)\nplt.savefig(\"training_frozencnn.jpeg\", format='jpeg', dpi=100, bbox_inches='tight')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('model_weights/'):\n    os.mkdir('model_weights/')\nmodel_01.save_weights(filepath=\"model_weights/vgg19_model_01.h5\", overwrite=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_01.load_weights(\"model_weights/vgg19_model_01.h5\")\nvgg_val_eval_01 = model_01.evaluate(valid_generator)\nvgg_test_eval_01 = model_01.evaluate(test_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Validation Loss: {vgg_val_eval_01[0]}')\nprint(f'Validation Acc: {vgg_val_eval_01[1]}')\nprint(f'Testing Loss: {vgg_test_eval_01[0]}')\nprint(f'Testing Acc: {vgg_test_eval_01[1]}')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = test_generator.filenames\nnb_sample = len(filenames)\n\nvgg_prediction_01 = model_01.predict(test_generator, steps=nb_sample, verbose = 1)\ny_pred = np.argmax(vgg_prediction_01, axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Increamental unfreezing and fine tuning","metadata":{}},{"cell_type":"code","source":"base_model = VGG19(include_top=False, input_shape=(240,240,3))\nbase_model_layer_names = [layer.name for layer in base_model.layers] \nbase_model_layer_names","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = VGG19(include_top=False, input_shape=(240,240,3))\nbase_model_layer_names = [layer.name for layer in base_model.layers] \nbase_model_layer_names\n\nx=base_model.output\nflat = Flatten()(x)\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndrop_out = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(drop_out)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_02 = Model(base_model.inputs, output)\nmodel_02.load_weights('model_weights/vgg19_model_01.h5')\n\nset_trainable=False\nfor layer in base_model.layers:\n    if layer.name in ['block5_conv4','block5_conv3']:\n        set_trainable=True\n    if set_trainable:\n        layer.trainable=True\n    else:\n        layer.trainable=False\n\nprint(model_02.summary())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum = 0.9, nesterov = True)\nmodel_02.compile(loss='categorical_crossentropy', optimizer = sgd, metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_02 = model_02.fit(train_generator, steps_per_epoch=10, epochs = 2, callbacks=[es,cp,lrr], validation_data=valid_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot performance\nfig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12,6))\nfig.suptitle(\"Model Training (Frozen CNN)\", fontsize=12)\nmax_epoch = len(history_01.history['accuracy'])+1\nepochs_list = list(range(1, max_epoch))\n\nax1.plot(epochs_list, history_02.history['accuracy'], color='b', linestyle='-', label='Training Data')\nax1.plot(epochs_list, history_02.history['val_accuracy'], color='r', linestyle='-', label='Validation Data')\nax1.set_title('Training Accuracy', fontsize=12)\nax1.set_xlabel('Epochs', fontsize=12)\nax1.set_ylabel('Accuracy', fontsize=12)\nax1.legend(frameon=False, loc='lower center', ncol=2)\n\nax2.plot(epochs_list, history_02.history['loss'], color='b', linestyle='-', label='Training Data')\nax2.plot(epochs_list, history_02.history['val_loss'], color='r', linestyle='-', label='Validation Data')\nax2.set_title('Training Loss', fontsize=12)\nax2.set_xlabel('Epochs', fontsize=12)\nax2.set_ylabel('Loss', fontsize=12)\nax2.legend(frameon=False, loc='upper center', ncol=2)\nplt.savefig(\"training_frozencnn.jpeg\", format='jpeg', dpi=100, bbox_inches='tight')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.isdir('model_weights/'):\n    os.mkdir('model_weights/')\nmodel_02.save_weights(filepath=\"model_weights/vgg19_model_02.h5\", overwrite=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_02.load_weights(\"model_weights/vgg19_model_02.h5\")\nvgg_val_eval_02 = model_02.evaluate(valid_generator)\nvgg_test_eval_02 = model_02.evaluate(test_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Unfreezing the entire network","metadata":{}},{"cell_type":"code","source":"base_model = VGG19(include_top=False, input_shape=(240,240,3))\nbase_model_layer_names = [layer.name for layer in base_model.layers] \nbase_model_layer_names\n\nx=base_model.output\nflat = Flatten()(x)\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndrop_out = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(drop_out)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_03 = Model(base_model.inputs, output)\nmodel_03.load_weights('model_weights/vgg19_model_02.h5')\n\nsgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum = 0.9, nesterov = True)\nmodel_03.compile(loss='categorical_crossentropy', optimizer = sgd, metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_03.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_03 = model_03.fit(train_generator, steps_per_epoch=10, epochs = 2, callbacks=[es,cp,lrr], validation_data=valid_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_03.load_weights(\"model_weights/vgg_unfrozen.h5\")\nvgg_val_eval_03 = model_03.evaluate(valid_generator)\nvgg_test_eval_03 = model_03.evaluate(test_generator)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}