{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"4e266c6f-39b5-4ce2-d478-6f063b7c96e7"},"outputs":[],"source":"import matplotlib.pyplot as plt\nimport numpy as np\nfrom random import shuffle\n\nimport os\nimport cv2\n\ntrain_path = \"../input/train\"\n\nROWS = 128\nCOLS = 128\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), dtype=np.float32)\nlabels = np.ndarray(len(train_list), dtype=np.float32)\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\n\nimport tensorflow as tf\nnum_labels = 2\nnum_channels = 3 # rg\n\n\nprint ('Training set', train.shape, labels.shape)\nprint ('Validation set', valid.shape, valid_labels.shape)\n\nbatch_size = 16\npatch_size = 5\ndepth = 16\nnum_hidden = 64\n\ngraph = tf.Graph()\n\nwith graph.as_default():\n\n  # Input data.\n  tf_train_dataset = tf.placeholder(\n    tf.float64, shape=(batch_size, ROWS, COLS, num_channels))\n  tf_train_labels = tf.placeholder(tf.float64, shape=(batch_size, num_labels))\n  tf_valid_dataset = tf.constant(valid)\n  \n  # Variables.\n  layer1_weights = tf.Variable(tf.truncated_normal(\n      [patch_size, patch_size, num_channels, depth], stddev=0.1))\n  layer1_biases = tf.Variable(tf.zeros([depth]))\n  layer2_weights = tf.Variable(tf.truncated_normal(\n      [patch_size, patch_size, depth, depth], stddev=0.1))\n  layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n  layer3_weights = tf.Variable(tf.truncated_normal(\n      [int (ROWS / 4 * COLS / 4 * depth), num_hidden], stddev=0.1))\n  layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n  layer4_weights = tf.Variable(tf.truncated_normal(\n      [num_hidden, num_labels], stddev=0.1))\n  layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]))\n  \n  # Model.\n  def model(data):\n    conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')\n    hidden = tf.nn.relu(conv + layer1_biases)\n    conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')\n    hidden = tf.nn.relu(conv + layer2_biases)\n    shape = hidden.get_shape().as_list()\n    reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])\n    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)\n    return tf.matmul(hidden, layer4_weights) + layer4_biases\n  \n  # Training computation.\n  logits = model(tf_train_dataset)\n  loss = tf.reduce_mean(\n    tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n    \n  # Optimizer.\n  optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)\n  \n  # Predictions for the training, validation, and test data.\n  train_prediction = tf.nn.softmax(logits)\n  valid_prediction = tf.nn.softmax(model(tf_valid_dataset))\n\ndef accuracy(predictions, labels):\n   return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1)) / predictions.shape[0])\n\nnum_steps = 1001\nwith tf.Session(graph=graph) as session:\n  tf.global_variables_initializer().run()\n  print (\"Initialized\")\n  for step in range(num_steps):\n    offset = (step * batch_size) % (labels.shape[0] - batch_size)\n    batch_data = train[offset:(offset + batch_size), :, :, :]\n    batch_labels = labels[offset:(offset + batch_size), :]\n    feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n    _, l, predictions = session.run(\n      [optimizer, loss, train_prediction], feed_dict=feed_dict)\n    if (step % 50 == 0):\n      print (\"Minibatch loss at step\", step, \":\", l)\n      print (\"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels))\n      print (\"Validation accuracy: %.1f%%\" % accuracy(valid_prediction.eval(), valid_labels))"}],"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}