{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"69eaca4c-8dc0-e5f5-e658-e1240147d91c"},"outputs":[],"source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pylab as plt\nfrom random import shuffle\n\nimport os\nimport cv2"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"2aa38f5e-02fd-d9dd-c4c0-33588ccaf96c"},"outputs":[],"source":"train_path = \"../input/train\"\n\nROWS = 128\nCOLS = 128\nCHANNELS = 3\n\nimages = [img for img in os.listdir(train_path)]\nimages_dog = [img for img in os.listdir(train_path) if \"dog\" in img]\nimages_cat = [img for img in os.listdir(train_path) if \"cat\" in img]\n\n#only taking a subset (less accuracy but faster training)\ntrain_dog = images_dog[:1000]\ntrain_cat = images_cat[:1000]\nvalid_dog = images_dog[1000:1100]\nvalid_cat = images_cat[1000:1100]\n\ntrain_list = train_dog + train_cat\nvalid_list = valid_dog + valid_cat\n\nshuffle(train_list)\n\ntrain = np.ndarray(shape=(len(train_list),ROWS, COLS))\nlabels = np.ndarray(len(train_list))\n\nfor i, img_path in enumerate(train_list):\n    img = cv2.imread(os.path.join(train_path, img_path), 0)\n    img = cv2.resize(img, (ROWS, COLS), interpolation=cv2.INTER_CUBIC)\n    \n    train[i] = img\n    if \"dog\" in img_path:\n        labels[i] = 0\n    else:\n        labels[i] = 1\n\nvalid = np.ndarray(shape=(len(valid_list), ROWS, COLS))\nvalid_labels = np.ndarray(len(valid_list))\n\nfor i, img_path in enumerate(valid_list):\n    img = cv2.imread(os.path.join(train_path, img_path), 0)\n    img = cv2.resize(img, (ROWS, COLS), interpolation=cv2.INTER_CUBIC)\n    \n    valid[i] = img\n    if \"dog\" in img_path:\n        valid_labels[i] = 0\n    else:\n        valid_labels[i] = 1"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"33416eed-a0f6-bf21-7972-edfb103310e2"},"outputs":[],"source":"def average(data):\n    minimum = np.min(data)\n    maximum = np.max(data)\n    data = (data-minimum)/(maximum-minimum)\n    data = data - np.mean(data)\n    return data\n\ntrain = average(train)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"c9523b5a-5c17-1623-7533-11e21919cdad"},"outputs":[],"source":"import tensorflow as tf\n\ntf.reset_default_graph() \n\nnp.random.seed(20170209)\ntf.set_random_seed(20170209)\n\n# define first layer\nnum_filters1 = 32\n\nx = tf.placeholder(tf.float32, [50, 128, 128, 3])\nx_image = tf.reshape(x, [-1,128,128,1])\n\nW_conv1 = tf.Variable(tf.truncated_normal([5,5,1,num_filters1],\n                                          stddev=0.1))\nh_conv1 = tf.nn.conv2d(x_image, W_conv1,\n                       strides=[1,1,1,1], padding='SAME')\n\nb_conv1 = tf.Variable(tf.constant(0.1, shape=[num_filters1]))\nh_conv1_cutoff = tf.nn.relu(h_conv1 + b_conv1)\n\nh_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1,2,2,1],\n                         strides=[1,2,2,1], padding='SAME')\n\n# define second layer\nnum_filters2 = 64\n\nW_conv2 = tf.Variable(\n            tf.truncated_normal([5,5,num_filters1,num_filters2],\n                                stddev=0.1))\nh_conv2 = tf.nn.conv2d(h_pool1, W_conv2,\n                       strides=[1,1,1,1], padding='SAME')\n\nb_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]))\nh_conv2_cutoff = tf.nn.relu(h_conv2 + b_conv2)\n\nh_pool2 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1,2,2,1],\n                         strides=[1,2,2,1], padding='SAME')\n\n# define fully connected layer\nh_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*num_filters2])\n\nnum_units1 = 7*7*num_filters2\nnum_units2 = 1024\n\nw2 = tf.Variable(tf.truncated_normal([num_units1, num_units2]))\nb2 = tf.Variable(tf.constant(0.1, shape=[num_units2]))\nhidden2 = tf.nn.relu(tf.matmul(h_pool2_flat, w2) + b2)\n\nkeep_prob = tf.placeholder(tf.float32)\nhidden2_drop = tf.nn.dropout(hidden2, keep_prob)\n\nw0 = tf.Variable(tf.zeros([num_units2, 10]))\nb0 = tf.Variable(tf.zeros([10]))\nk = tf.matmul(hidden2_drop, w0) + b0\np = tf.nn.softmax(k)\n\n#define loss (cost) function\nt = tf.placeholder(tf.float32, [None, 10])\nloss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(k,t)) \ntrain_step = tf.train.AdamOptimizer(0.0001).minimize(loss)\ncorrect_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1))\naccuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n\n# prepare session\nsess = tf.InteractiveSession()\nsess.run(tf.global_variables_initializer())\nsaver = tf.train.Saver()\n\n# start training\ni = 0\nfor _ in range(1000):\n    i += 1\n    batch_xs = train[(i-1)*50:i*50]\n    batch_ts = labels[(i-1)*50:i*50]\n    \n    sess.run(train_step,\n             feed_dict={x:batch_xs, t:batch_ts, keep_prob:0.5})\n    if i % 500 == 0:\n        loss_vals, acc_vals = [], []\n        for c in range(4):\n            start = len(valid_labels) / 4 * c\n            end = len(valid_labels) / 4 * (c+1)\n            loss_val, acc_val = sess.run([loss, accuracy],\n                feed_dict={x:valid[start:end],\n                           t:valid[start:end],\n                           keep_prob:1.0})\n            loss_vals.append(loss_val)\n            acc_vals.append(acc_val)\n        loss_val = np.sum(loss_vals)\n        acc_val = np.mean(acc_vals)\n        print ('Step: %d, Loss: %f, Accuracy: %f'\n               % (i, loss_val, acc_val))\n\nsaver.save(sess, 'cnn_session')\nsess.close()"}],"metadata":{"_change_revision":0,"_is_fork":false,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.0"}},"nbformat":4,"nbformat_minor":0}