{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nprint(os.listdir(\"../input/dogs-vs-cats\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(os.listdir(\"/kaggle/working/\"))\nos.chdir(\"/kaggle/working/\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import zipfile\ntrain_data = \"../input/dogs-vs-cats/train.zip\"\ntest_data = \"../input/dogs-vs-cats/test1.zip\"\n\nwith zipfile.ZipFile(train_data,\"r\") as z:\n    z.extractall(\".\")\nwith zipfile.ZipFile(test_data,\"r\") as z:\n    z.extractall(\".\")\n    \nprint(os.listdir(\"/kaggle/working/train\")[:5])\nprint(os.listdir(\"/kaggle/working/test1\")[:5])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nfrom keras.preprocessing.image import ImageDataGenerator, load_img\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport random","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# define image related constants\nFAST_RUN = False\nIMAGE_WIDTH=128\nIMAGE_HEIGHT=128\nIMAGE_SIZE=(IMAGE_WIDTH, IMAGE_HEIGHT)\nIMAGE_CHANNELS=3 #TGB channels","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"#filenames = os.listdir(\"C:/temp/DogsandCats/train\") #local PC\nfilenames = os.listdir(\"/kaggle/working/train\")\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == 'dog':\n        categories.append(1)\n    else:\n        categories.append(0)\n\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})\nprint(df.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# see total in counts\ndf['category'].value_counts().plot.bar()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# check a sample image\nsample = random.choice(filenames)\n#image = load_img(\"C:/temp/DogsandCats/train/\"+sample) # local PC\nimage = load_img(\"/kaggle/working/train/\"+sample)\nplt.imshow(image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#build model with keras\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPool2D, Dropout, Flatten, Dense, Activation, BatchNormalization","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(32, (3 , 3), activation='relu', input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS)))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2,2))) # default is (2,2)\nmodel.add(Dropout(rate=0.25))\n\nmodel.add(Conv2D(64, (3,3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2,2))) # default is (2,2)\nmodel.add(Dropout(rate=0.25))\n\nmodel.add(Conv2D(128, (3,3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2,2))) # default is (2,2)\nmodel.add(Dropout(rate=0.25))\n\nmodel.add(Conv2D(256, (3,3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2,2))) # default is (2,2)\nmodel.add(Dropout(rate=0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(units=512, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(rate=0.5))\nmodel.add(Dense(units=2, activation='sigmoid'))\n\nmodel.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# callbacks - early stop & learning rate reduction\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"earlystop = EarlyStopping(patience=10)\nlearn_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience=2, verbose=1, factor=0.5, min_lr=0.0001)\ncallbacks = [earlystop, learn_rate_reduction]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# data preparation\ndf[\"category\"] = df[\"category\"].replace({0:'cat', 1:'dog'}) # dog is target\ndf_train, df_test = train_test_split(df, test_size=0.1, random_state = 42)\ndf_train = df_train.reset_index(drop=True)\ndf_test = df_test.reset_index(drop=True)\ndf_train[\"category\"].value_counts().plot.bar()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test[\"category\"].value_counts().plot.bar()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"total_train = df_train.shape[0]\ntotal_test = df_test.shape[0]\nbatch_size = 20","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# image data argumentation\n# training generator\ntrain_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)","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n    df_train,\n    directory=\"/kaggle/working/train/\",\n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    class_mode='categorical',\n    batch_size=batch_size\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"test_generator = test_datagen.flow_from_dataframe(\n    df_test,\n    directory=\"/kaggle/working/train/\",\n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    class_mode='categorical',\n    batch_size=batch_size\n)","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"# check performance of data argumentation\ndf_example = df_train.sample(n=1).reset_index(drop=True)\nexample_generator = train_datagen.flow_from_dataframe(\n    df_example,\n    directory=\"/kaggle/working/train/\",\n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    class_mode='categorical'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(12,12))\nfor i in range(0,15):\n    plt.subplot(5,3,i+1)\n    for X_batch, Y_batch in example_generator:\n        image = X_batch[0]\n        plt.imshow(image)\n        break\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"# fit model\nepochs = 3 if FAST_RUN else 50 # 1 epoch meaning \"one pass over the entire database\" \n# with GPU enabled, about 150s per epoch and 135ms per step\nhistory = model.fit(\n    train_generator,\n    epochs=epochs,\n    validation_data=test_generator,\n    validation_steps=total_test//batch_size,\n    steps_per_epoch=total_train//batch_size,\n    callbacks=callbacks\n)\n# created new branch of 15","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# save trained model weights\nmodel.save_weights(\"modelAug19.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# virtualize training\nfig, (ax1, ax2) = plt.subplots(2, 1, figsize = (12, 12))\nax1.plot(history.history['loss'], color='b',label=\"Training loss\")\nax1.plot(history.history['val_loss'], color='r',label=\"Testing loss\")\nax1.set_xticks(np.arange(1, epochs, 1))\nax1.set_yticks(np.arange(0, 1, 0.1))\n\nax2.plot(history.history['accuracy'], color='b',label=\"Training accuracy\")\nax2.plot(history.history['val_accuracy'], color='r',label=\"Testing accuracy\")\nax2.set_xticks(np.arange(1, epochs, 1))\n#ax2.set_yticks(np.arrange(0, 1, 0.1)) # accuracy should be between 0 to 1 but not always true\n\nlegend = plt.legend(loc='best', shadow=True)\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# prepare independent valdiation data\nfilenames_val = os.listdir(\"/kaggle/working/test1\")\ndf_val = pd.DataFrame({\n    'filename': filenames_val\n})\nn_samples = df_val.shape[0]","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"# testing generator\nval_gen = ImageDataGenerator(rescale=1./255)\nval_generator = val_gen.flow_from_dataframe(\n    df_val,\n    directory=\"/kaggle/working/test1\",\n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=IMAGE_SIZE,\n    batch_size=batch_size,\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"# prediction on independent validation sample\npredict = model.predict_generator(val_generator, steps=np.ceil(n_samples/batch_size))","execution_count":null,"outputs":[]},{"metadata":{"tags":[],"trusted":true},"cell_type":"code","source":"df_val['category'] = np.argmax(predict, axis=-1)\nlabel_map = dict((v,k) for k,v in train_generator.class_indices.items())\nprint(label_map)\ndf_val['category'] = df_val['category'].replace(label_map)\ndf_val['category'] = df_val['category'].replace({'cat':0, 'dog':1})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# visualize prediction\ndf_val['category'].value_counts().plot.bar()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_val = df_val.head(18)\nplt.figure(figsize=(12,24))\nfor index, row in sample_val.iterrows():\n    filename = row['filename']\n    catefory = row['category']\n    img = load_img(\"/kaggle/working/test1/\"+filename, target_size=IMAGE_SIZE)\n    plt.subplot(6,3,index+1)\n    plt.imshow(img)\n    plt.xlabel(filename+'('+\"{}\".format(category)+')')\nplt.tight_layout()\nplt.show","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# output to csv/excel file for checking\ndf_output = df_val.copy()\ndf_output['id'] = df_output['filename'].str.split('.').str[0]\ndf_output['label'] = df_output['category']\ndf_output.drop(['filename','category'],axis=1,inplace=True)\ndf_output.to_csv('predicted_output.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}