{"cells":[{"metadata":{"collapsed":true,"trusted":false,"_uuid":"8afff4852e3b5b2df2493a565344d39a496292d6"},"cell_type":"markdown","source":"Kaggle: https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/notebooks"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nfrom random import shuffle\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nfrom random import shuffle\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import zipfile\n\nwith zipfile.ZipFile(\"../input/train.zip\",\"r\") as z:\n    z.extractall(\".\")\nwith zipfile.ZipFile(\"../input/test.zip\",\"r\") as z:\n    z.extractall(\".\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_DIR = '/kaggle/working/train/'\nTEST_DIR = '/kaggle/working/test/'","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Explantory Data Analyisis"},{"metadata":{"trusted":true},"cell_type":"code","source":"import cv2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training_files = os.listdir(TRAIN_DIR)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training_files[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cv2.imread(TRAIN_DIR + training_files[0]).shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_files = os.listdir(TEST_DIR)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_files[0]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Prepare Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"IMG_SIZE = 50","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def create_dataset(folder_path, flag_training=True):\n    def identify_label(file_name):\n        dog_or_cat = file_name.split('.')[0]\n        if dog_or_cat == 'cat':\n            return np.array([1, 0])\n        elif dog_or_cat == 'dog':\n            return np.array([0, 1])\n        \n    def identify_image_id(file_name):\n        return file_name.split('.')[0]\n    \n    result = []\n    for file_name in tqdm(os.listdir(folder_path)):\n        file_path = os.path.join(folder_path, file_name)\n        img = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)\n        img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n        if flag_training:\n            img_data = np.array(img)\n            label = identify_label(file_name)\n            result.append([img_data, label])\n        else:\n            img_data = np.array(img)\n            img_id = identify_image_id(file_name)\n            result.append([img_data, img_id])\n    return result","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dataset = create_dataset(TRAIN_DIR)\ntest_dataset = create_dataset(TEST_DIR, flag_training=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# CNN Model"},{"metadata":{},"cell_type":"markdown","source":"1.Model Definition"},{"metadata":{"trusted":true},"cell_type":"code","source":"import tflearn\nfrom tflearn.layers.conv import conv_2d, max_pool_2d\nfrom tflearn.layers.core import input_data, dropout, fully_connected\nfrom tflearn.layers.estimator import regression","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FILTER_SIZE = 10\nLR = 1e-3\nEPOCH = 3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CNN:\n    def __init__(self):\n        self.model = self.__build_cnn()\n    \n    def fit(self, train_dataset):\n        x_train, y_train, x_val, y_val = self.__load_training_validation(train_dataset)\n        self.model.fit({'input': x_train}, {'targets': y_train}, \\\n                  validation_set=({'input': x_val}, {'targets': y_val}), \\\n                  n_epoch=EPOCH, snapshot_step=500, show_metric=True, run_id='model' )\n        \n    def predict(self, input_data_list):\n        return self.model.predict(input_data_list)\n               \n    def __build_cnn(self):\n        # Note: Input\n        cnn = input_data(shape = [None, IMG_SIZE, IMG_SIZE, 1], name = 'input')\n        \n        # Note:conv_2d - http://tflearn.org/layers/conv/\n        #       The default padding will make output image size the same.\n        #       The default step size is 1.\n        #       max_pool_2d - http://tflearn.org/layers/conv/#max-pooling-2d\n        \n        # Note: Layer 1 CNN with 32 filters and 5*5 filter size. \n        #       Dimension: (?, 50, 50, 1) -> (?, 50, 50, 32) -> (?, 10, 10, 32)\n        cnn = conv_2d(cnn, 32, FILTER_SIZE, activation='relu')\n        cnn = max_pool_2d(cnn, FILTER_SIZE)\n        # Note: Layer 2 CNN with 64 filters and 5*5 filter size.\n        #       Dimension: (?, 10, 10, 32) -> (?, 10, 10, 64) -> (?, 2, 2, 64)\n        cnn = conv_2d(cnn, 64, FILTER_SIZE, activation='relu')\n        cnn = max_pool_2d(cnn, FILTER_SIZE)\n        # Note: Layer 3 CNN with 128 filters and 5*5 filter size.\n        #       Dimension: (?, 2, 2, 64) -> (?, 2, 2, 128) -> (?, 1, 1, 128)\n        cnn = conv_2d(cnn, 128, FILTER_SIZE, activation='relu')\n        cnn = max_pool_2d(cnn, FILTER_SIZE)      \n        # Note: Layer 4 CNN with 64 filters and 5*5 filter size.\n        #       Output: (?, 1, 1, 128) -> (?, 1, 1, 64) -> (?, 1, 1, 64)\n        cnn = conv_2d(cnn, 64, FILTER_SIZE, activation='relu')\n        cnn = max_pool_2d(cnn, FILTER_SIZE)               \n        # Note: Layer 5 CNN with 32 filters and 5*5 filter size.\n        #       Output: (?, 1, 1, 64) -> (?, 1, 1, 32) -> (?, 1, 1, 32)\n        cnn = conv_2d(cnn, 32, FILTER_SIZE, activation='relu')\n        cnn = max_pool_2d(cnn, FILTER_SIZE)\n        \n        # Note: Layer 6 Fully Connected\n        #       Output: (?, 1, 1, 32) -> (?, 1024)\n        cnn = fully_connected(cnn, 1024, activation = 'relu')\n        # Note: Layer 7 Dropout\n        cnn = dropout(cnn, 0.8)\n        # Note: Layer 8 Fully Connected\n        #       Output: (?, 1024) -> (?, 2)\n        cnn = fully_connected(cnn, 2, activation='softmax')\n        \n        # Note: Output\n        cnn = regression(cnn, optimizer='adam', learning_rate = LR, \\\n                         loss='categorical_crossentropy', name='targets')\n        model = tflearn.DNN(cnn, tensorboard_dir='log')\n        \n        return model\n        \n    def __load_training_validation(self, train_dataset, validation_portion=0.2):\n        num_of_obs = len(train_dataset)\n        cutoff = int(num_of_obs * (1 - validation_portion))\n        train, validation = train_dataset[:cutoff], train_dataset[cutoff:]\n        \n        x_train = np.array([i[0] for i in train], dtype=np.float64).reshape(-1, IMG_SIZE, IMG_SIZE, 1)\n        y_train = np.array([i[1] for i in train], dtype=np.float64)\n        x_val = np.array([i[0] for i in validation], dtype=np.float64).reshape(-1, IMG_SIZE, IMG_SIZE, 1)\n        y_val = np.array([i[1] for i in validation], dtype=np.float64)\n        return x_train, y_train, x_val, y_val","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2.Train"},{"metadata":{"trusted":true},"cell_type":"code","source":"cnn = CNN()\ncnn.fit(train_dataset)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3.Predict"},{"metadata":{"trusted":true},"cell_type":"code","source":"def predict_some_test_samples_and_show(test_dataset):\n    fig = plt.figure()\n    for num, data in enumerate(test_dataset[:16]):\n        img_data, img_num = data[0], data[1]\n        img_data = img_data.reshape(IMG_SIZE, IMG_SIZE, 1)\n        pred_prob = cnn.predict([img_data])[0]\n        pred_label = 'Dog' if np.argmax(pred_prob) == 1 else 'Cat'\n        \n        subplot = fig.add_subplot(4, 4, num+1)\n        subplot.imshow(data[0], cmap='gray')\n        plt.title(pred_label)\n        subplot.axes.get_xaxis().set_visible(False)\n        subplot.axes.get_yaxis().set_visible(False)\n    \n    plt.tight_layout()\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def predict_for_all_examples(test_dataset):\n    img_ids, img_labels = [], []\n    for sample in tqdm(test_dataset):\n        img_data, img_id = sample[0], sample[1]\n        img_data = img_data.reshape(IMG_SIZE, IMG_SIZE, 1)\n        pred_prob = cnn.predict([img_data])[0]\n        pred_label = 1 if np.argmax(pred_prob) == 1 else 0 # Note: 1=dog, 0=cat\n        img_ids.append(img_id)\n        img_labels.append(pred_label)\n    return pd.DataFrame({'id': img_ids, 'label': img_labels})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict_some_test_samples_and_show(test_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = predict_for_all_examples(test_dataset)\nsubmission.to_csv('submission.csv', index=False,header=True)","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}