{"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-09-27T09:32:24.116553Z","iopub.execute_input":"2021-09-27T09:32:24.117132Z","iopub.status.idle":"2021-09-27T09:32:29.044635Z","shell.execute_reply.started":"2021-09-27T09:32:24.117064Z","shell.execute_reply":"2021-09-27T09:32:29.043818Z"},"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-09-27T09:32:29.046150Z","iopub.execute_input":"2021-09-27T09:32:29.046385Z","iopub.status.idle":"2021-09-27T09:32:41.397098Z","shell.execute_reply.started":"2021-09-27T09:32:29.046353Z","shell.execute_reply":"2021-09-27T09:32:41.396268Z"},"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-09-27T09:32:41.400172Z","iopub.execute_input":"2021-09-27T09:32:41.400382Z","iopub.status.idle":"2021-09-27T09:32:41.431594Z","shell.execute_reply.started":"2021-09-27T09:32:41.400357Z","shell.execute_reply":"2021-09-27T09:32:41.430959Z"},"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-09-27T09:32:41.433557Z","iopub.execute_input":"2021-09-27T09:32:41.433842Z","iopub.status.idle":"2021-09-27T09:32:41.471248Z","shell.execute_reply.started":"2021-09-27T09:32:41.433808Z","shell.execute_reply":"2021-09-27T09:32:41.470433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['category'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-09-27T09:32:41.472557Z","iopub.execute_input":"2021-09-27T09:32:41.472929Z","iopub.status.idle":"2021-09-27T09:32:41.483498Z","shell.execute_reply.started":"2021-09-27T09:32:41.472893Z","shell.execute_reply":"2021-09-27T09:32:41.482507Z"},"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-09-27T09:32:41.485063Z","iopub.execute_input":"2021-09-27T09:32:41.485562Z","iopub.status.idle":"2021-09-27T09:32:43.691951Z","shell.execute_reply.started":"2021-09-27T09:32:41.485525Z","shell.execute_reply":"2021-09-27T09:32:43.691281Z"},"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-09-27T09:32:43.693244Z","iopub.execute_input":"2021-09-27T09:32:43.693571Z","iopub.status.idle":"2021-09-27T09:32:45.894392Z","shell.execute_reply.started":"2021-09-27T09:32:43.693523Z","shell.execute_reply":"2021-09-27T09:32:45.891495Z"},"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-09-27T09:32:45.900650Z","iopub.execute_input":"2021-09-27T09:32:45.901290Z","iopub.status.idle":"2021-09-27T09:32:45.912231Z","shell.execute_reply.started":"2021-09-27T09:32:45.901249Z","shell.execute_reply":"2021-09-27T09:32:45.911225Z"},"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-09-27T09:32:45.914870Z","iopub.execute_input":"2021-09-27T09:32:45.921658Z","iopub.status.idle":"2021-09-27T09:32:45.943534Z","shell.execute_reply.started":"2021-09-27T09:32:45.921622Z","shell.execute_reply":"2021-09-27T09:32:45.942615Z"},"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-09-27T09:32:45.947893Z","iopub.execute_input":"2021-09-27T09:32:45.948639Z","iopub.status.idle":"2021-09-27T09:32:45.972278Z","shell.execute_reply.started":"2021-09-27T09:32:45.948604Z","shell.execute_reply":"2021-09-27T09:32:45.970998Z"},"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-09-27T09:32:45.974261Z","iopub.execute_input":"2021-09-27T09:32:45.974686Z","iopub.status.idle":"2021-09-27T09:32:45.979266Z","shell.execute_reply.started":"2021-09-27T09:32:45.974650Z","shell.execute_reply":"2021-09-27T09:32:45.978197Z"},"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-09-27T09:32:45.981295Z","iopub.execute_input":"2021-09-27T09:32:45.981862Z","iopub.status.idle":"2021-09-27T09:32:46.381404Z","shell.execute_reply.started":"2021-09-27T09:32:45.981829Z","shell.execute_reply":"2021-09-27T09:32:46.371778Z"},"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-09-27T09:32:46.411091Z","iopub.execute_input":"2021-09-27T09:32:46.413427Z","iopub.status.idle":"2021-09-27T09:32:46.542050Z","shell.execute_reply.started":"2021-09-27T09:32:46.413380Z","shell.execute_reply":"2021-09-27T09:32:46.540522Z"},"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-09-27T09:32:46.544985Z","iopub.execute_input":"2021-09-27T09:32:46.545186Z","iopub.status.idle":"2021-09-27T10:40:18.702380Z","shell.execute_reply.started":"2021-09-27T09:32:46.545162Z","shell.execute_reply":"2021-09-27T10:40:18.701642Z"},"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-09-27T10:40:18.707161Z","iopub.execute_input":"2021-09-27T10:40:18.709253Z","iopub.status.idle":"2021-09-27T10:40:18.904035Z","shell.execute_reply.started":"2021-09-27T10:40:18.709213Z","shell.execute_reply":"2021-09-27T10:40:18.903294Z"},"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-09-27T10:55:48.274165Z","iopub.execute_input":"2021-09-27T10:55:48.274436Z","iopub.status.idle":"2021-09-27T10:55:48.505839Z","shell.execute_reply.started":"2021-09-27T10:55:48.274406Z","shell.execute_reply":"2021-09-27T10:55:48.505189Z"},"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-09-27T10:55:49.683310Z","iopub.execute_input":"2021-09-27T10:55:49.683924Z","iopub.status.idle":"2021-09-27T10:55:49.974031Z","shell.execute_reply.started":"2021-09-27T10:55:49.683881Z","shell.execute_reply":"2021-09-27T10:55:49.973380Z"},"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-09-27T10:55:51.399177Z","iopub.execute_input":"2021-09-27T10:55:51.399697Z","iopub.status.idle":"2021-09-27T10:55:58.173531Z","shell.execute_reply.started":"2021-09-27T10:55:51.399663Z","shell.execute_reply":"2021-09-27T10:55:58.172818Z"},"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-09-27T10:55:58.175081Z","iopub.execute_input":"2021-09-27T10:55:58.175336Z","iopub.status.idle":"2021-09-27T10:55:58.190016Z","shell.execute_reply.started":"2021-09-27T10:55:58.175301Z","shell.execute_reply":"2021-09-27T10:55:58.189374Z"},"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-09-27T10:55:58.191058Z","iopub.execute_input":"2021-09-27T10:55:58.191311Z","iopub.status.idle":"2021-09-27T10:55:58.291407Z","shell.execute_reply.started":"2021-09-27T10:55:58.191279Z","shell.execute_reply":"2021-09-27T10:55:58.290625Z"},"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-09-27T10:55:58.293421Z","iopub.execute_input":"2021-09-27T10:55:58.293863Z","iopub.status.idle":"2021-09-27T10:56:30.060482Z","shell.execute_reply.started":"2021-09-27T10:55:58.293829Z","shell.execute_reply":"2021-09-27T10:56:30.059652Z"},"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-09-27T10:56:30.064070Z","iopub.execute_input":"2021-09-27T10:56:30.064286Z","iopub.status.idle":"2021-09-27T10:56:30.073325Z","shell.execute_reply.started":"2021-09-27T10:56:30.064262Z","shell.execute_reply":"2021-09-27T10:56:30.072670Z"},"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-09-27T10:56:30.075752Z","iopub.execute_input":"2021-09-27T10:56:30.076021Z","iopub.status.idle":"2021-09-27T10:56:30.139621Z","shell.execute_reply.started":"2021-09-27T10:56:30.075991Z","shell.execute_reply":"2021-09-27T10:56:30.139005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}