{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-11T14:50:54.836703Z","iopub.execute_input":"2022-04-11T14:50:54.837437Z","iopub.status.idle":"2022-04-11T14:50:54.845203Z","shell.execute_reply.started":"2022-04-11T14:50:54.837399Z","shell.execute_reply":"2022-04-11T14:50:54.844309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport numpy as np\nimport os\nimport shutil\nnp.random.seed(42)\nimport zipfile\n","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:50:57.105619Z","iopub.execute_input":"2022-04-11T14:50:57.106194Z","iopub.status.idle":"2022-04-11T14:50:57.110815Z","shell.execute_reply.started":"2022-04-11T14:50:57.106153Z","shell.execute_reply":"2022-04-11T14:50:57.110028Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_dir = \"../input/dogs-vs-cats\"\ntrain_dir = os.path.join(base_dir, \"train.zip\")\ntest_dir = os.path.join(base_dir, \"test1.zip\")\n#extracting files to get the directories\nimport zipfile\nwith zipfile.ZipFile(train_dir,\"r\") as z:\n    z.extractall()\n\nwith zipfile.ZipFile(test_dir,\"r\") as t:\n    t.extractall()\n#using os to get directories\ntrainn_dir=os.listdir('./train')\n#saving directoris names\ntrainn_dir=['./train/'+i for i in trainn_dir]\n#test data\ntestt_dir=os.listdir('./test1')\ntestt_dir=['./test1/'+i for i in testt_dir]\n#showing what is in train\nfiles=os.listdir('./train')","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:50:58.706925Z","iopub.execute_input":"2022-04-11T14:50:58.707556Z","iopub.status.idle":"2022-04-11T14:51:16.723618Z","shell.execute_reply.started":"2022-04-11T14:50:58.70751Z","shell.execute_reply":"2022-04-11T14:51:16.722887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#giving the destination path\nTRAIN_PATH = \"../input/dogs-vs-cats/train.zip\"\nTEST_PATH = \"../input/dogs-vs-cats/test1.zip\"\n#here are unzipped files \nFILES = \"/kaggle/files/unzipped/\"\n#extracting files in train and test\nwith zipfile.ZipFile(TRAIN_PATH, 'r') as zipp:\n    zipp.extractall(FILES)\n   \n    \nwith zipfile.ZipFile(TEST_PATH, 'r') as zipp:\n    zipp.extractall(FILES)","metadata":{"execution":{"iopub.status.busy":"2022-04-07T06:45:53.677075Z","iopub.execute_input":"2022-04-07T06:45:53.677604Z","iopub.status.idle":"2022-04-07T06:46:09.968923Z","shell.execute_reply.started":"2022-04-07T06:45:53.677565Z","shell.execute_reply":"2022-04-07T06:46:09.968142Z"}}},{"cell_type":"code","source":"# seperating files\ncat_files = [fn for fn in files if 'cat' in fn]\ndog_files = [fn for fn in files if 'dog' in fn]\nlen(cat_files), len(dog_files)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:16.72518Z","iopub.execute_input":"2022-04-11T14:51:16.725456Z","iopub.status.idle":"2022-04-11T14:51:16.742058Z","shell.execute_reply.started":"2022-04-11T14:51:16.725417Z","shell.execute_reply":"2022-04-11T14:51:16.741209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#here train, validation and test datasets are selected randomely \ncat_train = np.random.choice(cat_files, size=1500, replace=False)\ndog_train = np.random.choice(dog_files, size=1500, replace=False)\ncat_files = list(set(cat_files) - set(cat_train))\ndog_files = list(set(dog_files) - set(dog_train))\n\ncat_val = np.random.choice(cat_files, size=500, replace=False)\ndog_val = np.random.choice(dog_files, size=500, replace=False)\ncat_files = list(set(cat_files) - set(cat_val))\ndog_files = list(set(dog_files) - set(dog_val))\n\ncat_test = np.random.choice(cat_files, size=500, replace=False)\ndog_test = np.random.choice(dog_files, size=500, replace=False)\n\nprint('Cat datasets:', cat_train.shape, cat_val.shape, cat_test.shape)\nprint('Dog datasets:', dog_train.shape, dog_val.shape, dog_test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:16.743478Z","iopub.execute_input":"2022-04-11T14:51:16.743726Z","iopub.status.idle":"2022-04-11T14:51:16.785189Z","shell.execute_reply.started":"2022-04-11T14:51:16.743691Z","shell.execute_reply":"2022-04-11T14:51:16.784435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"newpath=[]\nfor i in train_files:\n    if './train/'+i in directo:\n        newpath.append('./train/'+i) ","metadata":{}},{"cell_type":"code","source":"import glob\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array, array_to_img\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:16.788193Z","iopub.execute_input":"2022-04-11T14:51:16.788395Z","iopub.status.idle":"2022-04-11T14:51:16.796253Z","shell.execute_reply.started":"2022-04-11T14:51:16.788366Z","shell.execute_reply":"2022-04-11T14:51:16.795415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"import os.path\n\nif os.path.isfile(path + \"cat.9602.jpg\"):\n    print (\"File exist\")\nelse:\n    print (\"File not exist\")\n","metadata":{}},{"cell_type":"markdown","source":"from zipfile import ZipFile\nzip_path = '../input/dogs-vs-cats/train.zip'\nwith ZipFile(zip_path) as myzip:\n    files_in_zip = myzip.namelist()\nkk[1]=myzip.printdir()","metadata":{}},{"cell_type":"code","source":"train_dir = 'training_data'\nval_dir = 'validation_data'\ntest_dir = 'test_data'\ntrain_files = np.concatenate([cat_train, dog_train])\nvalidate_files = np.concatenate([cat_val, dog_val])\ntest_files = np.concatenate([cat_test, dog_test])\nos.mkdir(train_dir) if not os.path.isdir(train_dir) else None\nos.mkdir(val_dir) if not os.path.isdir(val_dir) else None\nos.mkdir(test_dir) if not os.path.isdir(test_dir) else None\n#finding train directory\ntrain_path=[]\nfor i in train_files:\n    if './train/'+i in trainn_dir:\n        train_path.append('./train/'+i) \n#finding val directory\n\nval_path=[]\nfor i in validate_files:\n    if './train/'+i in trainn_dir:\n        val_path.append('./train/'+i) \n#finding test directory\n        \ntest_path=[]\nfor i in test_files:\n    if './test1/'+i in testt_dir:\n        test_path.append('./test1/'+i) \n\n        \n#copying train to new directory\nfor fn in train_path:\n    shutil.copy(fn, train_dir)\n    #method in Python is used \n    #to copy the content of source\n    #file to destination file or directory.\n\n#copying val to new directory\nfor fn in val_path:\n    shutil.copy(fn, val_dir)\n\n#copying test to new directory\nfor fn in testt_dir:\n    shutil.copy(fn, test_dir)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:16.798564Z","iopub.execute_input":"2022-04-11T14:51:16.79917Z","iopub.status.idle":"2022-04-11T14:51:19.847099Z","shell.execute_reply.started":"2022-04-11T14:51:16.799132Z","shell.execute_reply":"2022-04-11T14:51:19.846375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"if files_in_zip.count('train/'+'cat.0.jpg') > 0:\n    print(\"Chirp\")","metadata":{}},{"cell_type":"markdown","source":"newpath=[]\nfor i in train_files:\n    if './train/'+i in directo:\n        newpath.append('./train/'+i)  ","metadata":{}},{"cell_type":"code","source":"IMG_DIM = (150, 150)\n#gettin all files in training_data directory\ntrain_files = glob.glob('training_data/*')\n#transforms images to arrays\ntrain_imgs = [img_to_array(load_img(img, target_size=IMG_DIM)) for img in train_files]\n#transforms to numpy arrays\ntrain_imgs = np.array(train_imgs)\n#gets images labels\ntrain_labels = [fn.split('/')[1].split('.')[0].strip() for fn in train_files]\n\n#gettin all files in validating_data directory\nvalidation_files = glob.glob('validation_data/*')\nvalidation_imgs = [img_to_array(load_img(img, target_size=IMG_DIM)) for img in validation_files]\nvalidation_imgs = np.array(validation_imgs)\nvalidation_labels = [fn.split('/')[1].split('.')[0].strip() for fn in validation_files]\n\nprint('Train dataset shape:', train_imgs.shape, \n      '\\tValidation dataset shape:', validation_imgs.shape)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:26.991913Z","iopub.execute_input":"2022-04-11T14:51:26.992224Z","iopub.status.idle":"2022-04-11T14:51:37.519008Z","shell.execute_reply.started":"2022-04-11T14:51:26.99219Z","shell.execute_reply":"2022-04-11T14:51:37.5182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#scaling values process\ntrain_imgs_scaled = train_imgs.astype('float32')\nvalidation_imgs_scaled  = validation_imgs.astype('float32')\ntrain_imgs_scaled /= 255\nvalidation_imgs_scaled /= 255\n\nprint(train_imgs[0].shape)\narray_to_img(train_imgs[0])","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:37.520671Z","iopub.execute_input":"2022-04-11T14:51:37.520923Z","iopub.status.idle":"2022-04-11T14:51:38.098897Z","shell.execute_reply.started":"2022-04-11T14:51:37.520888Z","shell.execute_reply":"2022-04-11T14:51:38.098154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 30\nnum_classes = 2\nepochs = 30\ninput_shape = (150, 150, 3)\n\n# encode text category labels\nfrom sklearn.preprocessing import LabelEncoder\n#Encode target labels with value between 0 and n_classes-1.\nle = LabelEncoder()\n#gets labels  and calculates mean and dev\nle.fit(train_labels)\n#and changes them to numeric values\ntrain_labels_enc = le.transform(train_labels)\nvalidation_labels_enc = le.transform(validation_labels)\n\nprint(train_labels[1495:1505], train_labels_enc[1495:1505])","metadata":{"execution":{"iopub.status.busy":"2022-04-11T14:51:42.301729Z","iopub.execute_input":"2022-04-11T14:51:42.302291Z","iopub.status.idle":"2022-04-11T14:51:42.842651Z","shell.execute_reply.started":"2022-04-11T14:51:42.302252Z","shell.execute_reply":"2022-04-11T14:51:42.841946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom keras.models import Sequential\n#from keras import optimizers\nfrom tensorflow.keras import optimizers\nmodel = Sequential()\n\nmodel.add(Conv2D(16, kernel_size=(3, 3), activation='relu', \n                 input_shape=input_shape))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dense(1, activation='sigmoid'))\n\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(),\n              metrics=['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(x=train_imgs_scaled, y=train_labels_enc,\n                    validation_data=(validation_imgs_scaled, validation_labels_enc),\n                    batch_size=batch_size,\n                    epochs=epochs,\n                    verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plotting shows overfitting\nf, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))\nt = f.suptitle('Basic CNN Performance', fontsize=12)\nf.subplots_adjust(top=0.85, wspace=0.3)\n\nepoch_list = list(range(1,31))\nax1.plot(epoch_list, history.history['accuracy'], label='Train Accuracy')\nax1.plot(epoch_list, history.history['val_accuracy'], label='Validation Accuracy')\nax1.set_xticks(np.arange(0, 31, 5))\nax1.set_ylabel('Accuracy Value')\nax1.set_xlabel('Epoch')\nax1.set_title('Accuracy')\nl1 = ax1.legend(loc=\"best\")\n\nax2.plot(epoch_list, history.history['loss'], label='Train Loss')\nax2.plot(epoch_list, history.history['val_loss'], label='Validation Loss')\nax2.set_xticks(np.arange(0, 31, 5))\nax2.set_ylabel('Loss Value')\nax2.set_xlabel('Epoch')\nax2.set_title('Loss')\nl2 = ax2.legend(loc=\"best\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmodel = Sequential()\n\nmodel.add(Conv2D(16, kernel_size=(3, 3), activation='relu', \n                 input_shape=input_shape))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n#adding extra conv\nmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\n#adding dropout and extra dense layer\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(),\n              metrics=['accuracy'])\n              \n              \nhistory = model.fit(x=train_imgs_scaled, y=train_labels_enc,\n                    validation_data=(validation_imgs_scaled, validation_labels_enc),\n                    batch_size=batch_size,\n                    epochs=epochs,\n                    verbose=1)   \n\n#it works better than the preceding one","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#savign the later model\nmodel.save('cats_dogs_basic_cnn.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#using image data generator (augmentation) to get more varied data\ntrain_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\n\nval_datagen = ImageDataGenerator(rescale=1./255)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T02:22:44.667432Z","iopub.execute_input":"2022-04-11T02:22:44.667694Z","iopub.status.idle":"2022-04-11T02:22:44.673783Z","shell.execute_reply.started":"2022-04-11T02:22:44.667667Z","shell.execute_reply":"2022-04-11T02:22:44.672617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_id = 2595\ncat_generator = train_datagen.flow(train_imgs[img_id:img_id+1], train_labels[img_id:img_id+1],\n                                   batch_size=1)\ncat = [next(cat_generator) for i in range(0,5)]\nfig, ax = plt.subplots(1,5, figsize=(16, 6))\nprint('Labels:', [item[1][0] for item in cat])\nl = [ax[i].imshow(cat[i][0][0]) for i in range(0,5)]","metadata":{"execution":{"iopub.status.busy":"2022-04-11T02:22:47.575533Z","iopub.execute_input":"2022-04-11T02:22:47.576205Z","iopub.status.idle":"2022-04-11T02:22:48.757661Z","shell.execute_reply.started":"2022-04-11T02:22:47.576171Z","shell.execute_reply":"2022-04-11T02:22:48.756602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#using augmentation\ntrain_generator = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_generator = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)\ninput_shape = (150, 150, 3)\n\n#from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\n#from keras.models import Sequential\n#from keras import optimizers\n\nmodel = Sequential()\n\nmodel.add(Conv2D(16, kernel_size=(3, 3), activation='relu', \n                 input_shape=input_shape))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=1e-4),\n              metrics=['accuracy'])\n              \nhistory = model.fit_generator(train_generator, steps_per_epoch=100, epochs=100,\n                              validation_data=val_generator, validation_steps=50, \n                              verbose=1)  ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('cats_dogs_cnn_img_aug.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# #from here transfer learning starts","metadata":{}},{"cell_type":"code","source":"vgg.trainable","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg.layers","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"xc = vgg.layers[-1].output\nxc = keras.layers.Flatten()(xc)\nvgg_model = Model(vgg.input, output)\n#freezing all the weights before compiling the model\nvgg_model.trainable = False\n# freezing all the weights works before & after compiling\nfor layer in vgg_model.layers:\n    layer.trainable = False","metadata":{}},{"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom keras.models import Sequential\n#from keras import optimizers\nfrom tensorflow.keras import optimizers\n#model = Sequential()\n\nfrom keras.applications import vgg16\nfrom keras.models import Model\nimport keras\ninput_shape = (150, 150, 3)\n#include_top: whether to include the 3 fully-connected layers at the top of the network.\n#weights: one of None (random initialization), 'imagenet' (pre-training on ImageNet),\n          #or the path to the weights file to be loaded.\nvgg = vgg16.VGG16(include_top=False, weights='imagenet', \n                                     input_shape=input_shape)\n#gives us maxpooling 2d--> created by layer 'block5_pool'\noutput = vgg.layers[-1].output\n# flattens the preceding output layer\noutput = keras.layers.Flatten()(output)\n# it seems that the both subciding codes do the same\nvgg_model = Model(vgg.input, output)\n#freezing all the weights before compiling the model\nvgg_model.trainable = False\n# freezing all the weights works before & after compiling\nfor layer in vgg_model.layers:\n    layer.trainable = False\n    \nimport pandas as pd\n#sets our table\npd.set_option('max_colwidth', -1)\n#sets parameters\nlayers = [(layer, layer.name, layer.trainable) for layer in vgg_model.layers]\n#feeds datas to our table\npd.DataFrame(layers, columns=['Layer Type', 'Layer Name', 'Layer Trainable']) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bottleneck_feature_example = vgg.predict(train_imgs_scaled[0:1])\nprint(bottleneck_feature_example.shape)\nplt.imshow(bottleneck_feature_example[0][:,:,0])\n#the third component can  be 0 to 511 which is the depth\n#output is (1, 4, 4, 512) because of the last max pool","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bottleneck_feature_example[0][:,:,96]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_bottleneck_features(model, input_imgs):\n    features = model.predict(input_imgs, verbose=0)\n    return features\n    \ntrain_features_vgg = get_bottleneck_features(vgg_model, train_imgs_scaled)\nvalidation_features_vgg = get_bottleneck_features(vgg_model, validation_imgs_scaled)\n\nprint('Train Bottleneck Features:', train_features_vgg.shape, \n      '\\tValidation Bottleneck Features:', validation_features_vgg.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer\n#from keras.models import Sequential\n#from keras import optimizers\n\ninput_shape = vgg_model.output_shape[1]\n\nmodel = Sequential()\nmodel.add(InputLayer(input_shape=(input_shape,)))\nmodel.add(Dense(512, activation='relu', input_dim=input_shape))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=1e-4),\n              metrics=['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(x=train_features_vgg, y=train_labels_enc,\n                    validation_data=(validation_features_vgg, validation_labels_enc),\n                    batch_size=batch_size,\n                    epochs=epochs,\n                    verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\n\nval_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_generator = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer\nfrom keras.models import Sequential\n#from keras import optimizers\nfrom tensorflow.keras import optimizers\n\nmodel = Sequential()\nmodel.add(vgg_model)\nmodel.add(Dense(512, activation='relu', input_dim=input_shape))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=2e-5),\n              metrics=['accuracy'])\n              \nhistory = model.fit_generator(train_generator, steps_per_epoch=100, epochs=30,\n                              validation_data=val_generator, validation_steps=50, \n                              verbose=1) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg_model.trainable = True\n\nset_trainable = False\nfor layer in vgg_model.layers:\n    if layer.name in ['block5_conv1', 'block4_conv1']:\n        set_trainable = True\n    if set_trainable:\n        layer.trainable = True\n    else:\n        layer.trainable = False\n        \nlayers = [(layer, layer.name, layer.trainable) for layer in vgg_model.layers]\npd.DataFrame(layers, columns=['Layer Type', 'Layer Name', 'Layer Trainable']) ","metadata":{"execution":{"iopub.status.busy":"2022-04-10T18:56:53.793982Z","iopub.execute_input":"2022-04-10T18:56:53.794249Z","iopub.status.idle":"2022-04-10T18:56:53.811688Z","shell.execute_reply.started":"2022-04-10T18:56:53.794219Z","shell.execute_reply":"2022-04-10T18:56:53.810885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\nval_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_generator = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)\n\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer\nfrom keras.models import Sequential\n#from keras import optimizers\n\nmodel = Sequential()\nmodel.add(vgg_model)\nmodel.add(Dense(512, activation='relu', input_dim=input_shape))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=1e-5),\n              metrics=['accuracy'])\n              \nhistory = model.fit_generator(train_generator, steps_per_epoch=100, epochs=30,\n                              validation_data=val_generator, validation_steps=50, \n                              verbose=1)    ","metadata":{"execution":{"iopub.status.busy":"2022-04-10T18:56:58.257348Z","iopub.execute_input":"2022-04-10T18:56:58.257891Z","iopub.status.idle":"2022-04-10T19:05:55.726125Z","shell.execute_reply.started":"2022-04-10T18:56:58.257853Z","shell.execute_reply":"2022-04-10T19:05:55.725379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#another form of the upper code\n#vgg_model.trainable = True\n\n#set_trainable = False\nfor layer in vgg_model.layers[:4]:\n    layer.trainable = False\n        \nlayers = [(layer, layer.name, layer.trainable) for layer in vgg_model.layers]\npd.DataFrame(layers, columns=['Layer Type', 'Layer Name', 'Layer Trainable']) ","metadata":{"execution":{"iopub.status.busy":"2022-04-11T02:24:38.81888Z","iopub.execute_input":"2022-04-11T02:24:38.819351Z","iopub.status.idle":"2022-04-11T02:24:38.890745Z","shell.execute_reply.started":"2022-04-11T02:24:38.81932Z","shell.execute_reply":"2022-04-11T02:24:38.88948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\nval_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_generator = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)\n\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer\nfrom keras.models import Sequential\n#from keras import optimizers\n\nmodel = Sequential()\nmodel.add(vgg_model)\nmodel.add(Dense(512, activation='relu', input_dim=input_shape))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=1e-5),\n              metrics=['accuracy'])\n              \nhistory = model.fit_generator(train_generator, steps_per_epoch=100, epochs=30,\n                              validation_data=val_generator, validation_steps=50, \n                              verbose=1)    ","metadata":{"execution":{"iopub.status.busy":"2022-04-10T19:05:55.743464Z","iopub.execute_input":"2022-04-10T19:05:55.743938Z","iopub.status.idle":"2022-04-10T19:14:37.483557Z","shell.execute_reply.started":"2022-04-10T19:05:55.743899Z","shell.execute_reply":"2022-04-10T19:14:37.482812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#this time we let all the layers to be trainable\nvgg_model.trainable = True\n\n#set_trainable = False\n#for layer in vgg_model.layers[:4]:\n#    layer.trainable = False\n        \nlayers = [(layer, layer.name, layer.trainable) for layer in vgg_model.layers]\npd.DataFrame(layers, columns=['Layer Type', 'Layer Name', 'Layer Trainable']) ","metadata":{"execution":{"iopub.status.busy":"2022-04-11T02:28:34.856333Z","iopub.execute_input":"2022-04-11T02:28:34.857067Z","iopub.status.idle":"2022-04-11T02:28:34.884727Z","shell.execute_reply.started":"2022-04-11T02:28:34.857034Z","shell.execute_reply":"2022-04-11T02:28:34.883733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\nval_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_generator = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)\n\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer\nfrom keras.models import Sequential\n#from keras import optimizers\n\nmodel = Sequential()\nmodel.add(vgg_model)\nmodel.add(Dense(512, activation='relu', input_dim=input_shape))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.RMSprop(lr=1e-5),\n              metrics=['accuracy'])\n              \nhistory = model.fit_generator(train_generator, steps_per_epoch=100, epochs=30,\n                              validation_data=val_generator, validation_steps=50, \n                              verbose=1)    ","metadata":{"execution":{"iopub.status.busy":"2022-04-11T02:28:57.083677Z","iopub.execute_input":"2022-04-11T02:28:57.083962Z","iopub.status.idle":"2022-04-11T02:32:45.834466Z","shell.execute_reply.started":"2022-04-11T02:28:57.083935Z","shell.execute_reply":"2022-04-11T02:32:45.831372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##inception","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.3, rotation_range=50,\n                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, \n                                   horizontal_flip=True, fill_mode='nearest')\nval_datagen = ImageDataGenerator(rescale=1./255)\ntrain_gen = train_datagen.flow(train_imgs, train_labels_enc, batch_size=30)\nval_gen = val_datagen.flow(validation_imgs, validation_labels_enc, batch_size=20)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"ROWS=150\nCOLS=150\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.inception_v3 import preprocess_input\ntrain_idg = ImageDataGenerator(vertical_flip=True,\n                               horizontal_flip=True,\n                               height_shift_range=0.1,\n                               width_shift_range=0.1,\n                               preprocessing_function=preprocess_input)\ntrain_gen = train_datagen.flow(\n    train_imgs,\n    target_size=(ROWS, COLS),\n    batch_size = 16\n)#train_datagen.flow","metadata":{}},{"cell_type":"code","source":"input_shape = (150, 150, 3)\nfrom keras.models import Sequential\nfrom keras.models import Model\nfrom keras.callbacks import ModelCheckpoint, LearningRateScheduler, EarlyStopping, ReduceLROnPlateau, TensorBoard\nfrom tensorflow.keras import optimizers, losses, activations, models\nfrom keras.layers import Convolution2D, Dense, Input, Flatten, Dropout, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D, Concatenate\nfrom tensorflow.keras import applications\n#input_shape = (ROWS, COLS, 3)\nnclass = 2\n\nbase_model = applications.InceptionV3(weights='imagenet', \n                                include_top=False, \n                                input_shape=(ROWS, COLS,3))\nbase_model.trainable = True\n#nclass=2\nadd_model = Sequential()\nadd_model.add(base_model)\nadd_model.add(GlobalAveragePooling2D())\nadd_model.add(Dropout(0.5))\nadd_model.add(Dense(1, \n                    activation='sigmoid'))\n\nmodel = add_model\nmodel.compile(loss=\"binary_crossentropy\", \n              optimizer=optimizers.SGD(lr=1e-4, \n                                       momentum=0.9),\n              metrics=['accuracy'])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-04-11T15:10:04.197689Z","iopub.execute_input":"2022-04-11T15:10:04.198318Z","iopub.status.idle":"2022-04-11T15:10:06.875886Z","shell.execute_reply.started":"2022-04-11T15:10:04.198277Z","shell.execute_reply":"2022-04-11T15:10:06.875206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"file_path=\"weights.best.hdf5\"\ncheckpoint = ModelCheckpoint(file_path, monitor='acc', verbose=1, save_best_only=True, mode='max')\n\nearly = EarlyStopping(monitor=\"acc\", mode=\"max\", patience=15)\n\ncallbacks_list = [checkpoint, early] #early\n\nhistory = model.fit_generator(train_gen, \n                              epochs=3,\n                              validation_data=val_gen, validation_steps=50,\n                              shuffle=True, \n                              verbose=True,\n                              callbacks=callbacks_list)","metadata":{"execution":{"iopub.status.busy":"2022-04-11T15:10:11.745499Z","iopub.execute_input":"2022-04-11T15:10:11.745784Z","iopub.status.idle":"2022-04-11T15:11:13.718111Z","shell.execute_reply.started":"2022-04-11T15:10:11.745734Z","shell.execute_reply":"2022-04-11T15:11:13.717363Z"},"trusted":true},"execution_count":null,"outputs":[]}]}