{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":true},"cell_type":"code","source":"import cv2 # pip3 install opencv-python\nimport numpy as np\nimport os\nfrom random import shuffle\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train_dir = '../input/train/'\ntest_dir = '../input/test/'\nimg_size = 50\nlr = 1e-3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"8b799db342bfa960562a7f8535c3cdfb8f5b82ee"},"cell_type":"code","source":"# one hot encoding\ndef label_img(img):\n    word_label = img.split('.')[-3]\n    if word_label == 'cat': return [1,0]\n    elif word_label == 'dog': return [0,1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"87380fc92559fa731f9a3f249661f6f2ec54633c"},"cell_type":"code","source":"def create_train_data():\n    training_data = []\n    for img in tqdm(os.listdir(train_dir)):\n        if (not img.endswith('.jpg')):\n            continue\n        label = label_img(img)\n        path = os.path.join(train_dir, img)\n        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)  # greyscale\n        img = cv2.resize(img, (img_size, img_size) )  # unite the figure size\n        training_data.append([np.array(img), np.array(label)])\n    shuffle(training_data)\n    return training_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"07451af9096efda09118e6e5a4fed1b2d6235a59"},"cell_type":"code","source":"train_data = create_train_data()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"0e505f68c1f49890ea97b9a7d465e1481b648e8d"},"cell_type":"code","source":"def process_test_data():\n    testing_data = []\n    for img in tqdm(os.listdir(test_dir)):\n        if (not img.endswith('.jpg')):\n            continue\n        path = os.path.join(test_dir,img)\n        img_num = img.split('.')[0]\n        img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)\n        img = cv2.resize(img, (img_size, img_size))\n        testing_data.append([np.array(img), img_num]) # no label\n        \n    shuffle(testing_data)\n    return testing_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"88a7a4a47dc655fe66467e98df6ee41ddbbb9f30"},"cell_type":"code","source":"test_data = process_test_data()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"884e80a8d8317d08b00ebcd7d6657ec5ab901bc1"},"cell_type":"code","source":"import tflearn # need to install tensorflow first\nfrom tflearn.layers.conv import conv_2d, max_pool_2d  # 2d_CNN and max pooling\nfrom tflearn.layers.core import input_data, dropout, fully_connected\nfrom tflearn.layers.estimator import regression # cross entropy","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"a2b8fa0c93776a453ae9c6c82b9601f0a52ce361"},"cell_type":"code","source":"import tensorflow as tf\ntf.reset_default_graph() # need to reset the default graph for multiple running","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"409c82cff5331dcc261918da498a8d76e894308e"},"cell_type":"code","source":"convnet = input_data(shape = [None, img_size, img_size, 1], name = 'input')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a2cec3b1ee5fcab8274a9607583e38c7e8c4b583"},"cell_type":"markdown","source":"**5xCNN layers, 5xMax pooling layer, 5x5xChannel**"},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"92187a736f407fe933ebbd102abe344c4e05b8e6"},"cell_type":"code","source":"convnet = conv_2d(convnet, 32, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 64, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 128, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 64, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 32, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7513339a5ae04a94c70e1fcc182ec98bd3e734ad"},"cell_type":"markdown","source":"**2xFully connected layers and a predict layer**"},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"22ad1b77744dbb1b400aa5f82d06273c0c6ee87b"},"cell_type":"code","source":"convnet = fully_connected(convnet, 1024, activation = 'relu')\nconvnet = dropout(convnet, 0.8)\n\nconvnet = fully_connected(convnet, 2, activation='softmax')\nconvnet = regression(convnet, optimizer='adam', learning_rate = lr, loss='categorical_crossentropy', name='targets')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3aba1c5816be6fc34ee1ecb1fd521abacf63c55a"},"cell_type":"markdown","source":"**Set up model, trainning set and test set**"},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"48805dad42299af4a91aefb9c2959e8da922e256"},"cell_type":"code","source":"model = tflearn.DNN(convnet, tensorboard_dir='log')\ntrain = train_data[:-500]\ntest = train_data[-500:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"88f124b7351aa9cab958be99ab840fce6970bc7a"},"cell_type":"code","source":"X = np.array([i[0] for i in train], dtype=np.float64).reshape(-1, img_size, img_size, 1)\ny = np.array([i[1] for i in train], dtype=np.float64)\nXtest = np.array([i[0] for i in test], dtype=np.float64).reshape(-1, img_size, img_size, 1)\nytest = np.array([i[1] for i in test], dtype=np.float64)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b5df95993ad1d191f3aa1a6238f3f0767ab4e022"},"cell_type":"markdown","source":"**Model train**"},{"metadata":{"trusted":true,"_uuid":"8c7f369df6403443566fd8f578f2c938416e96fd"},"cell_type":"code","source":"model.fit({'input': X}, {'targets': y}, n_epoch=3, validation_set=({'input': Xtest}, {'targets': ytest}), snapshot_step=500, show_metric=True, run_id='model' )","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2f2b6602df6c0d5a1f7c66e0a9b2dfc4e1e097c4"},"cell_type":"markdown","source":"**Predict on test dataset and check the results**"},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"3731b68dc6db9554b099085e02a3347ac3477dae"},"cell_type":"code","source":"fig = plt.figure()\nfor num,data in enumerate(test_data[:16]):\n    img_num = data[1]\n    img_data = data[0]\n    y = fig.add_subplot(4, 4, num+1)\n    orig = img_data\n    data = img_data.reshape(img_size, img_size, 1)\n    model_out = model.predict([data])[0]\n    if np.argmax(model_out) == 1: \n        label = 'Dog'\n    else: \n        label = 'Cat'\n    y.imshow(orig, cmap='gray')\n    plt.title(label)\n    y.axes.get_xaxis().set_visible(False)\n    y.axes.get_yaxis().set_visible(False)\n    \nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}