{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport zipfile as zp\nimport tensorflow as tf\nimport tensorflow.keras\nimport shutil\nimport os\nfrom PIL import Image\nimport re\nimport random\nimport pickle\nimport gc\nimport dill\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Extracing zip files to working dir\ntrain_zp = zp.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip')\ntrain_zp.extractall('/kaggle/working/')\n\ntest_zp = zp.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip')\ntest_zp.extractall('/kaggle/working/')\n\n#Printing number of training and test samples\nprint('No of training samples  = ' + str(len(os.listdir('/kaggle/working/train'))))\nprint('No of test samples = ' + str(len(os.listdir('/kaggle/working/test'))))\ntrain_fnames = os.listdir('train/')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Creating dir structure for flow from directory API\ntry:\n    os.mkdir('train/cat')\n    os.mkdir('train/dog')\n    os.mkdir('validation')\n    os.mkdir('validation/cat')\n    os.mkdir('validation/dog')\nexcept:\n    pass","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Moving training pics to cat/dog subdir based on filename\ndef move_train_file(path1,path2,x):\n   #path specifies either train or test\n   #If cat move to cat subdir if not move to dog subdir\n    if x[:3] == 'cat':\n        shutil.move(path1+'/' +x, path2 + '/cat/'+x)\n    elif x[:3] == 'dog':\n        shutil.move(path1+'/' +x, path2 + '/dog/'+x)\n\npd.Series(train_fnames).apply(lambda x: move_train_file('train','train',x))\nprint(len(os.listdir('train/cat')), len(os.listdir('train/dog')))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Randomly pick 20% of training images and move to validation\ndef move_file(path1,path2,x):\n   #path specifies either train or test\n   #If cat move to cat subdir if not move to dog subdir\n    if x[:3] == 'cat':\n        shutil.move(path1+'/cat/' +x, path2 + '/cat/'+x)\n    elif x[:3] == 'dog':\n        shutil.move(path1 + '/dog/'+x, path2 + '/dog/'+x)\nvalid_fnames_cat = np.array(os.listdir('train/cat'))[np.random.choice(list(range(12500)), 2500, replace=False)]\nvalid_fnames_dog = np.array(os.listdir('train/dog'))[np.random.choice(list(range(12500)), 2500, replace=False)]\nprint(len(valid_fnames_cat), len(valid_fnames_dog))\npd.Series(valid_fnames_cat).apply(lambda x: move_file('train','validation',x))\npd.Series(valid_fnames_dog).apply(lambda x: move_file('train','validation',x))\nprint('Validation set is ',len(os.listdir('validation/cat')), ' and ',len(os.listdir('validation/dog')))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(rescale = 1/255.0,\n                                   #zoom_range = 0.2,\n                                   #shear_range = 0.2,\n                                   #horizontal_flip = True,\n                                    #rotation_range = 45,\n                                    #width_shift_range = 0.2,\n                                    #height_shift_range = 0.2,\n                                   #fill_mode = \"nearest\"\n                                   )\nvalid_datagen = ImageDataGenerator(rescale = 1/255.0,\n                                   #horizontal_flip = True,\n                                   #shear_range = 0.2,\n                                   #zoom_range = 0.2,\n                                   #fill_mode = 'nearest',\n                                   #height_shift_range = 0.2,\n                                   #width_shift_range = 0.2,\n                                   #rotation_range = 40\n                                   \n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout, BatchNormalization\nfrom tensorflow.keras.optimizers import Adam, RMSprop\nfrom tensorflow.keras.regularizers import l2\ntensorflow.compat.v1.disable_eager_execution()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Specify the model\nmodel = tensorflow.keras.Sequential([\n    \n    #Conv layer 1\n    tf.keras.layers.Conv2D(32, (3, 3), activation='elu',input_shape=(256,256,3), kernel_initializer='he_normal' ),\n    BatchNormalization(),\n    MaxPooling2D(2, 2),\n    #Conv layer 2\n    tf.keras.layers.Conv2D(64, (3, 3), activation='elu', kernel_initializer='he_normal'),\n    BatchNormalization(),\n    MaxPooling2D(2, 2),\n    #Conv layer 3\n    tf.keras.layers.Conv2D(128, (3, 3), activation='elu', kernel_initializer='he_normal'),\n    BatchNormalization(),\n    MaxPooling2D(2, 2),\n    #Conv layer 4\n    tf.keras.layers.Conv2D(256, (3, 3), activation='elu', kernel_initializer='he_normal'),\n    BatchNormalization(),\n    MaxPooling2D(2, 2),\n    #Conv layer 5\n    tf.keras.layers.Conv2D(256, (3, 3), activation='elu', kernel_initializer='he_normal'),\n    BatchNormalization(),\n    MaxPooling2D(2, 2),\n    #Flatten\n    Flatten(),\n    #Fully Connected layer\n    Dense(1024, activation='elu', kernel_regularizer=l2(0.001), kernel_initializer='he_normal'),\n    BatchNormalization(),\n    #Dropout\n    Dropout(0.5),\n    tf.keras.layers.Dense(1, activation='sigmoid', kernel_regularizer=l2(0.001), kernel_initializer='glorot_normal')\n\n])\nmy_callback_es = tensorflow.keras.callbacks.EarlyStopping(patience = 5, restore_best_weights = True)\nmy_callback_rlr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_accuracy', patience=3, factor=0.5, min_lr=0.00001, verbose=1)\nmodel.compile(optimizer = RMSprop(learning_rate=0.0005),loss = 'binary_crossentropy', metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batchsize = 16\nhistory = model.fit(train_datagen.flow_from_directory('train/', \n                                                      batch_size = batchsize,\n                                                      target_size=(256, 256),\n                                                     class_mode = 'binary'),\n                    validation_data = valid_datagen.flow_from_directory('validation/',\n                                                     batch_size = batchsize,\n                                                     target_size = (256,256),\n                                                     class_mode = 'binary'),\n                    steps_per_epoch = len(train_fnames)/10/batchsize,\n                    callbacks = [my_callback_es,my_callback_rlr],\n                    epochs = 50\n                   )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.xlabel('epochs')\nplt.ylabel('loss')\nplt.plot(history.history['loss'], label = 'loss')\nplt.plot(history.history['val_loss'], label = 'validation_loss')\nplt.legend()\nplt.plot()","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}