{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport zipfile\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.optimizers import RMSprop\nfrom keras.optimizers import RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.preprocessing.image import load_img","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Extract all .zip in folder '/kaggle/working'"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"for input_zip in ['../input/dogs-vs-cats/train.zip','../input/dogs-vs-cats/test1.zip']:\n    ex_zip = zipfile.ZipFile(input_zip, 'r')\n    ex_zip.extractall('.')\n    ex_zip.close()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"See all files"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(os.listdir('./train'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Categorize"},{"metadata":{},"cell_type":"markdown","source":"Categorize each file using 'CATEGORY.xxx.jpg' mask"},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir('./train')\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == 'cat':\n        categories.append('cat')\n    else:\n        categories.append('dog')\n\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"See a few images of cats and dogs"},{"metadata":{"trusted":true},"cell_type":"code","source":"nrows = 5\nncols = 5\nimg_count = nrows+ncols\n\ndf_cats = df.loc[df['category'] == 'cat'].head(img_count)\ndf_dogs = df.loc[df['category'] == 'dog'].head(img_count)\n\nfig = plt.gcf()\nfig.set_size_inches(ncols*4, nrows*4)\n\nnext_cat_pix = [os.path.join('./train/', fname) \n                for fname in df_cats.loc[:,'filename'] \n               ]\n\nnext_dog_pix = [os.path.join('./train/', fname) \n                for fname in df_dogs.loc[:,'filename']\n               ]\n\nfor i, img_path in enumerate(next_cat_pix+next_dog_pix):\n    sp = plt.subplot(nrows, ncols, i + 1)\n    img = mpimg.imread(img_path)\n    plt.imshow(img)\n\nprint('First '+str(2*img_count)+' images of cats and dogs')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Training and validation generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df, validate_df = train_test_split(df, test_size=0.20, random_state=50)\ntrain_df = train_df.reset_index(drop=True)\nvalidate_df = validate_df.reset_index(drop=True)\n\nprint('Train: '+str(train_df.shape[0]))\nprint('Validate: '+str(validate_df.shape[0]))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Training GEN"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rotation_range=15,\n    rescale=1./255,\n    shear_range=0.1,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df, \n    './train/', \n    x_col='filename',\n    y_col='category',\n    target_size=(150,150),\n    class_mode='categorical',\n    batch_size=20\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Validation GEN"},{"metadata":{"trusted":true},"cell_type":"code","source":"validation_datagen = ImageDataGenerator(rescale=1./255)\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    validate_df, \n    './train/', \n    x_col='filename',\n    y_col='category',\n    target_size=(150,150),\n    class_mode='categorical',\n    batch_size=20\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Billding a Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Dropout(0.25),\n    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Dropout(0.25),\n    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Dropout(0.25),\n    tf.keras.layers.Flatten(), \n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(2, activation='softmax')  \n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Callback"},{"metadata":{"trusted":true},"cell_type":"code","source":"class myCallback(tf.keras.callbacks.Callback):\n    def on_epoch_end(self, epoch, logs={}):\n        if(logs.get('accuracy')>0.99):\n            print(\"\\nReached 99% accuracy so cancelling training!\")\n            self.model.stop_training = True\n\ncallbacks = myCallback()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"opt = RMSprop(lr=0.001)\n\nmodel.compile(optimizer=opt,\n              loss='binary_crossentropy',\n              metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_generator,\n                    validation_data=validation_generator,\n                    steps_per_epoch=20000//20,\n                    epochs=10,\n                    validation_steps=5000//20,\n                    verbose=1,\n                    callbacks=[callbacks]\n                   )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save_weights(\"model.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"acc      = history.history[     'accuracy' ]\nval_acc  = history.history[ 'val_accuracy' ]\nloss     = history.history[    'loss' ]\nval_loss = history.history['val_loss' ]\n\nepochs   = range(len(acc))\n\nplt.plot  ( epochs,     acc )\nplt.plot  ( epochs, val_acc )\nplt.title ('Training and validation accuracy')\nplt.figure()\n\nplt.plot  ( epochs,     loss )\nplt.plot  ( epochs, val_loss )\nplt.title ('Training and validation loss'   )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Test data"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_filenames = os.listdir('./test1')\ntest_df = pd.DataFrame({'filename': test_filenames})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_gen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_gen.flow_from_dataframe(\n    test_df, \n    './test1', \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=(150,150),\n    batch_size=20,\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict = model.predict_generator(test_generator, steps=np.ceil(12500/20))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df['category'] = np.argmax(predict, axis=-1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_map = dict((v,k) for k,v in train_generator.class_indices.items())\ntest_df['category'] = test_df['category'].replace(label_map)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df['category'] = test_df['category'].replace({ 'dog': 1, 'cat': 0 })\ntest_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"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)","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}