{"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":"markdown","source":"## Impots","metadata":{}},{"cell_type":"code","source":"import zipfile\nimport os\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow import keras\nimport numpy as nps\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-10-01T08:16:16.613535Z","iopub.execute_input":"2021-10-01T08:16:16.614148Z","iopub.status.idle":"2021-10-01T08:16:21.665366Z","shell.execute_reply.started":"2021-10-01T08:16:16.614033Z","shell.execute_reply":"2021-10-01T08:16:21.664654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Get The Images","metadata":{}},{"cell_type":"code","source":"with zipfile.ZipFile('../input/dogs-vs-cats/train.zip', 'r') as z :\n    z.extractall()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:21.666850Z","iopub.execute_input":"2021-10-01T08:16:21.667394Z","iopub.status.idle":"2021-10-01T08:16:33.278472Z","shell.execute_reply.started":"2021-10-01T08:16:21.667359Z","shell.execute_reply":"2021-10-01T08:16:33.277705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = os.listdir(\"./train\")\ncategories = []\nfor image in filenames :\n    category = image.split('.')[0]\n    if category == 'dog' :\n        categories.append(1)\n    else :    \n        categories.append(0)","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:33.279862Z","iopub.execute_input":"2021-10-01T08:16:33.280143Z","iopub.status.idle":"2021-10-01T08:16:33.309468Z","shell.execute_reply.started":"2021-10-01T08:16:33.280085Z","shell.execute_reply":"2021-10-01T08:16:33.308849Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame({'filename' : filenames, 'category' : categories})\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:33.311514Z","iopub.execute_input":"2021-10-01T08:16:33.311766Z","iopub.status.idle":"2021-10-01T08:16:33.348775Z","shell.execute_reply.started":"2021-10-01T08:16:33.311734Z","shell.execute_reply":"2021-10-01T08:16:33.348013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['category'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:33.350039Z","iopub.execute_input":"2021-10-01T08:16:33.350332Z","iopub.status.idle":"2021-10-01T08:16:33.360352Z","shell.execute_reply.started":"2021-10-01T08:16:33.350276Z","shell.execute_reply":"2021-10-01T08:16:33.359541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Show some images ","metadata":{}},{"cell_type":"code","source":"for i in range(10) :\n    sample = filenames[i+10]\n    image = tf.keras.preprocessing.image.load_img('./train/' + sample)\n    plt.imshow(image)\n    plt.title('dog' if categories[i+10]==1 else 'cat')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:33.361678Z","iopub.execute_input":"2021-10-01T08:16:33.361929Z","iopub.status.idle":"2021-10-01T08:16:35.508412Z","shell.execute_reply.started":"2021-10-01T08:16:33.361895Z","shell.execute_reply":"2021-10-01T08:16:35.507766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create The Model ","metadata":{}},{"cell_type":"code","source":"#model \nmodel = keras.models.Sequential()\n\n##  Conv_1\nmodel.add(keras.layers.Conv2D(32, 3,input_shape = [128, 128, 3], activation = 'relu', padding = 'same'))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.MaxPool2D(2))\nmodel.add(keras.layers.Dropout(0.2))\n\n## Conv_2\nmodel.add(keras.layers.Conv2D(64, 3, activation = 'relu', padding = 'same'))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.MaxPool2D(2))\nmodel.add(keras.layers.Dropout(0.2))\n\n## Conv_3\nmodel.add(keras.layers.Conv2D(128, 3, activation = 'relu', padding = 'same'))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.MaxPool2D(2))\nmodel.add(keras.layers.Dropout(0.2))\n\n## Conv_4\nmodel.add(keras.layers.Conv2D(256, 3, activation = 'relu', padding = 'same'))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.MaxPool2D(2))\nmodel.add(keras.layers.Dropout(0.2))\n\n## Flatten\nmodel.add(keras.layers.Flatten())\n\n## fc_1\nmodel.add(keras.layers.Dense(1024, activation = 'relu'))\nmodel.add(keras.layers.Dropout(0.25))\n\n## fc_2\nmodel.add(keras.layers.Dense(2, activation = 'sigmoid'))\n\n## optimizer and loss\n#optimizer = keras.optimizers.RMSprop(lr = 0.01)\nmodel.compile(loss = 'categorical_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:35.509584Z","iopub.execute_input":"2021-10-01T08:16:35.509911Z","iopub.status.idle":"2021-10-01T08:16:37.703766Z","shell.execute_reply.started":"2021-10-01T08:16:35.509875Z","shell.execute_reply":"2021-10-01T08:16:37.703097Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"earlystop = keras.callbacks.EarlyStopping(patience=10)\nlearning_rate_reduction = keras.callbacks.ReduceLROnPlateau(monitor='val_acc', \n                                            patience=2, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\ncallbacks = [earlystop, learning_rate_reduction]","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.705158Z","iopub.execute_input":"2021-10-01T08:16:37.705406Z","iopub.status.idle":"2021-10-01T08:16:37.712339Z","shell.execute_reply.started":"2021-10-01T08:16:37.705373Z","shell.execute_reply":"2021-10-01T08:16:37.711676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Preparation\n","metadata":{}},{"cell_type":"markdown","source":"1. Encoding labels","metadata":{}},{"cell_type":"code","source":"df['category'] = df['category'].map({0 : 'cat', 1 : 'dog'})","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.713674Z","iopub.execute_input":"2021-10-01T08:16:37.713991Z","iopub.status.idle":"2021-10-01T08:16:37.723506Z","shell.execute_reply.started":"2021-10-01T08:16:37.713939Z","shell.execute_reply":"2021-10-01T08:16:37.722777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"2. Create Validation Set","metadata":{}},{"cell_type":"code","source":"train_df, valid_df = train_test_split(df, test_size=0.2, random_state=42)\ntrain_df = train_df.reset_index(drop=True)\nvalid_df = valid_df.reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.727003Z","iopub.execute_input":"2021-10-01T08:16:37.727215Z","iopub.status.idle":"2021-10-01T08:16:37.737739Z","shell.execute_reply.started":"2021-10-01T08:16:37.727193Z","shell.execute_reply":"2021-10-01T08:16:37.737078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_train = train_df.shape[0]\ntotal_valid = valid_df.shape[0]\nbatch_size = 10","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.738751Z","iopub.execute_input":"2021-10-01T08:16:37.739064Z","iopub.status.idle":"2021-10-01T08:16:37.743606Z","shell.execute_reply.started":"2021-10-01T08:16:37.739030Z","shell.execute_reply":"2021-10-01T08:16:37.742908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train Generator","metadata":{}},{"cell_type":"code","source":"train_data = keras.preprocessing.image.ImageDataGenerator(rotation_range=20,\n                                                         rescale = 1./255,\n                                                         horizontal_flip=True)\ntrain_generator = train_data.flow_from_dataframe(train_df,\n                                                './train/',\n                                                x_col = 'filename',\n                                                y_col = 'category',\n                                                target_size=[128,128],\n                                                class_mode='categorical',\n                                                batch_size=batch_size)\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.744648Z","iopub.execute_input":"2021-10-01T08:16:37.745153Z","iopub.status.idle":"2021-10-01T08:16:37.957760Z","shell.execute_reply.started":"2021-10-01T08:16:37.745098Z","shell.execute_reply":"2021-10-01T08:16:37.956852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Valid Generator","metadata":{}},{"cell_type":"code","source":"valid_data = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)\n                                                         \n                                                         \nvalid_generator = valid_data.flow_from_dataframe(valid_df,\n                                                './train/',\n                                                x_col = 'filename',\n                                                y_col = 'category',\n                                                target_size=[128,128],\n                                                class_mode='categorical',\n                                                batch_size=batch_size)\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:37.958956Z","iopub.execute_input":"2021-10-01T08:16:37.959362Z","iopub.status.idle":"2021-10-01T08:16:38.018908Z","shell.execute_reply.started":"2021-10-01T08:16:37.959320Z","shell.execute_reply":"2021-10-01T08:16:38.017884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training Model ","metadata":{}},{"cell_type":"code","source":"epochs = 30\nhistory = model.fit_generator(\n    train_generator, \n    epochs=epochs,\n    validation_data=valid_generator,\n    validation_steps=total_valid//batch_size,\n    steps_per_epoch=total_train//batch_size,\n    callbacks=callbacks)\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T08:16:38.020340Z","iopub.execute_input":"2021-10-01T08:16:38.020680Z","iopub.status.idle":"2021-10-01T09:24:02.285550Z","shell.execute_reply.started":"2021-10-01T08:16:38.020646Z","shell.execute_reply":"2021-10-01T09:24:02.284820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Saving Parameters","metadata":{}},{"cell_type":"code","source":"model.save_weights(\"model.h5\")","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:02.288380Z","iopub.execute_input":"2021-10-01T09:24:02.288601Z","iopub.status.idle":"2021-10-01T09:24:02.448425Z","shell.execute_reply.started":"2021-10-01T09:24:02.288577Z","shell.execute_reply":"2021-10-01T09:24:02.447641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nplt.plot(history.history['loss'], color='b', label=\"Training loss\")\nplt.plot(history.history['val_loss'], color='r', label=\"validation loss\")\nplt.xticks(np.arange(1, epochs, 1))\nplt.yticks(np.arange(0, 1, 0.1))\nplt.legend()\nplt.title('Training Loss VS Validation Loss')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:02.449799Z","iopub.execute_input":"2021-10-01T09:24:02.450060Z","iopub.status.idle":"2021-10-01T09:24:02.672145Z","shell.execute_reply.started":"2021-10-01T09:24:02.450024Z","shell.execute_reply":"2021-10-01T09:24:02.671367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['accuracy'], color='b', label=\"Training accuracy\")\nplt.plot(history.history['val_accuracy'], color='r',label=\"Validation accuracy\")\nplt.xticks(np.arange(1, epochs, 1))\nplt.title('Training Accuracy VS Validation Accuracy')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:02.673413Z","iopub.execute_input":"2021-10-01T09:24:02.673709Z","iopub.status.idle":"2021-10-01T09:24:02.963809Z","shell.execute_reply.started":"2021-10-01T09:24:02.673670Z","shell.execute_reply":"2021-10-01T09:24:02.963076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prepaing Test Data","metadata":{}},{"cell_type":"code","source":"with zipfile.ZipFile('../input/dogs-vs-cats/test1.zip', 'r') as z :\n    z.extractall()","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:02.965095Z","iopub.execute_input":"2021-10-01T09:24:02.965481Z","iopub.status.idle":"2021-10-01T09:24:09.567846Z","shell.execute_reply.started":"2021-10-01T09:24:02.965445Z","shell.execute_reply":"2021-10-01T09:24:09.567076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = os.listdir(\"./test1\")\ntest_df = pd.DataFrame({'filename' : filenames})    \nsamples = test_df.shape[0]","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:09.569315Z","iopub.execute_input":"2021-10-01T09:24:09.569571Z","iopub.status.idle":"2021-10-01T09:24:09.584906Z","shell.execute_reply.started":"2021-10-01T09:24:09.569536Z","shell.execute_reply":"2021-10-01T09:24:09.584256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_generator = test_data.flow_from_dataframe(\n    test_df, \n    \"./test1/\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=[128,128],\n    batch_size=batch_size,\n    shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:09.586003Z","iopub.execute_input":"2021-10-01T09:24:09.586436Z","iopub.status.idle":"2021-10-01T09:24:09.693667Z","shell.execute_reply.started":"2021-10-01T09:24:09.586401Z","shell.execute_reply":"2021-10-01T09:24:09.692860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict = model.predict_generator(test_generator, steps=np.ceil(samples/batch_size))\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:09.694864Z","iopub.execute_input":"2021-10-01T09:24:09.695258Z","iopub.status.idle":"2021-10-01T09:24:41.428793Z","shell.execute_reply.started":"2021-10-01T09:24:09.695224Z","shell.execute_reply":"2021-10-01T09:24:41.428031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['category'] = np.argmax(predict, axis=-1)\ntest_df['category'] = test_df['category'].replace({ 'dog': 1, 'cat': 0 })","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:41.432058Z","iopub.execute_input":"2021-10-01T09:24:41.432545Z","iopub.status.idle":"2021-10-01T09:24:41.440394Z","shell.execute_reply.started":"2021-10-01T09:24:41.432515Z","shell.execute_reply":"2021-10-01T09:24:41.439626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = test_df.copy()\nsubmission_df['id'] = submission_df['filename'].str.split('.').str[0]\nsubmission_df['label'] = submission_df['category']\nsubmission_df.drop(['filename', 'category'], axis=1, inplace=True)\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-01T09:24:41.443105Z","iopub.execute_input":"2021-10-01T09:24:41.444827Z","iopub.status.idle":"2021-10-01T09:24:41.495625Z","shell.execute_reply.started":"2021-10-01T09:24:41.444802Z","shell.execute_reply":"2021-10-01T09:24:41.495059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}