Skip to content

Instantly share code, notes, and snippets.

@ParthaSSatpathy
Created August 28, 2017 02:53
Show Gist options
  • Save ParthaSSatpathy/b79904d2b803a61c5b89583b72813bf4 to your computer and use it in GitHub Desktop.
Save ParthaSSatpathy/b79904d2b803a61c5b89583b72813bf4 to your computer and use it in GitHub Desktop.
Fashion MNIST - Using Tensorflow
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fashion MNIST Tensorflow"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dataset and Description available on https://github.com/zalandoresearch/fashion-mnist"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-- Download the repo using \n",
"\n",
"git clone git@github.com:zalandoresearch/fashion-mnist.git\n",
"\n",
"-- Append the path of the repo from your local repo using sys.path.append\n",
"\n",
"-- Read the files "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append(\"C:/Users/parth/Desktop/Git/Projects/fashion-mnist\")\n",
"from utils import mnist_reader"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the train and test file"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_train, y_train = mnist_reader.load_mnist('C:/Users/parth/Desktop/Git/Projects/fashion-mnist/data/fashion', kind='train')\n",
"X_test, y_test = mnist_reader.load_mnist('C:/Users/parth/Desktop/Git/Projects/fashion-mnist/data/fashion', kind='t10k')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Checking the shapes of the files."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(60000, 784)\n",
"(60000,)\n",
"(10000, 784)\n",
"(10000,)\n"
]
}
],
"source": [
"print(X_train.shape)\n",
"print(y_train.shape)\n",
"print(X_test.shape)\n",
"print(y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's visualize few of the images"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: [2, 9, 6, 0, 3, 4, 4, 5]\n"
]
},
{
"data": {
"image/png": "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\nkskAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1de8338f2b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.cm as cm\n",
"import seaborn as sns\n",
"%matplotlib inline\n",
"\n",
"print('Labels: ',[i for i in y_train[:8]])\n",
"\n",
"for i in range(8):\n",
" image = X_train[i].reshape(28,28)\n",
" #print(image)\n",
" plt.subplot(2,4,i+1)\n",
" plt.axis('off')\n",
" plt.imshow(image,cmap=cm.binary)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"# Standardize the data\n",
"X_train = np.multiply(X_train, 1.0 / 255.0)\n",
"X_test = np.multiply(X_test, 1.0 / 255.0)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.unique(y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The outout labels have 10 labels -> 0 to 9.\n",
"Let's use One Hot Encoder on the labels"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"y_train(60000,10)\n",
"y_train[0] => [0 0 1 0 0 0 0 0 0 0]\n"
]
}
],
"source": [
"def dense_to_one_hot(labels_dense, num_classes):\n",
" num_labels = labels_dense.shape[0]\n",
" index_offset = np.arange(num_labels) * num_classes\n",
" labels_one_hot = np.zeros((num_labels, num_classes))\n",
" labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1\n",
" return labels_one_hot\n",
"\n",
"y_train = dense_to_one_hot(y_train, 10)\n",
"y_train = y_train.astype(np.uint8)\n",
"\n",
"print('y_train({0[0]},{0[1]})'.format(y_train.shape))\n",
"print ('y_train[{0}] => {1}'.format(0,y_train[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create Train and Validation sets from the train data"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(48000, 784)\n",
"(48000, 10)\n",
"(12000, 784)\n",
"(12000, 10)\n"
]
}
],
"source": [
"'''\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"X_train, X_val, Y_train, Y_val = train_test_split(train_images, labels, test_size=0.2,random_state=42)\n",
"\n",
"print(X_train.shape)\n",
"print(Y_train.shape)\n",
"print(X_val.shape)\n",
"print(Y_val.shape)\n",
"'''"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tensorflow Graph Initialization:\n",
"--------------------------------\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import Tensorflow"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import tensorflow as tf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Weight and Bias Initialization"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def weight_variable(shape):\n",
" initial = tf.truncated_normal(shape,stddev=0.1)\n",
" return tf.Variable(initial)\n",
"\n",
"def bias_variable(shape):\n",
" initial = tf.constant(0.1,shape=shape)\n",
" return tf.Variable(initial)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define Convolution and Max Pooling function"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def conv2d(x,W):\n",
" return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')\n",
"def max_pool_2x2(x):\n",
" return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create placeholders for input and output"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# input & output of NN\n",
"# images\n",
"x = tf.placeholder('float', shape=[None, 784])\n",
"# labels\n",
"y_ = tf.placeholder('float', shape=[None, 10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First Convolution Layer:\n",
"------------------------\n",
"\n",
"It will consist of convolution, followed by max pooling. The convolution will compute 32 features for each 5x5 patch. Its weight tensor will have a shape of [5, 5, 1, 32]. The first two dimensions are the patch size, the next is the number of input channels, and the last is the number of output channels. We will also have a bias vector with a component for each output channel."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W_conv1 = weight_variable([5,5,1,32])\n",
"b_conv1 = bias_variable([32])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To apply the layer, we first reshape x to a 4d tensor, with the second and third dimensions corresponding to image width and height, and the final dimension corresponding to the number of color channels.\n",
"\n",
"We then convolve x_image with the weight tensor, add the bias, apply the ReLU function, and finally max pool. The max_pool_2x2 method will reduce the image size to 14x14."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x_image = tf.reshape(x,[-1,28,28,1])\n",
"h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)\n",
"h_pool = max_pool_2x2(h_conv1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Second Convolutional Network:\n",
"-----------------------------\n",
"In order to build a deep network, we stack several layers of this type. The second layer will have 64 features for each 5x5 patch."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W_conv2 = weight_variable([5, 5, 32, 64])\n",
"b_conv2 = bias_variable([64])\n",
"\n",
"h_conv2 = tf.nn.relu(conv2d(h_pool,W_conv2)+b_conv2)\n",
"h_pool2 = max_pool_2x2(h_conv2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Densely Connected Layer:\n",
"------------------------\n",
"\n",
"Now that the image size has been reduced to 7x7, we add a fully-connected layer with 1024 neurons to allow processing on the entire image. We reshape the tensor from the pooling layer into a batch of vectors, multiply by a weight matrix, add a bias, and apply a ReLU."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W_fc1 = weight_variable([7*7*64,1024])\n",
"b_fc1 = bias_variable([1024])\n",
"\n",
"h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])\n",
"h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dropout:\n",
"-------\n",
"\n",
"To reduce overfitting, we will apply dropout before the readout layer. We create a placeholder for the probability that a neuron's output is kept during dropout. This allows us to turn dropout on during training, and turn it off during testing. TensorFlow's tf.nn.dropout op automatically handles scaling neuron outputs in addition to masking them, so dropout just works without any additional scaling.1"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"keep_prob = tf.placeholder(tf.float32)\n",
"h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SoftMax Regression Layer:\n",
"-------------------------"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W_fc2= weight_variable([1024,10])\n",
"b_fc2 = bias_variable([10])\n",
"\n",
"y = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2) + b_fc2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Loss function and Optimizer definition"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y))\n",
"train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)\n",
"\n",
"correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))\n",
"accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Prediction"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"predict = tf.argmax(y,1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Execute the session. Initialize the Session"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sess = tf.InteractiveSession()\n",
"sess.run(tf.global_variables_initializer())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define a function to select a random batch from the train data for training"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import math\n",
"\n",
"# A mildly random version....simply pick one of the (consecutive) slices of size \"size\"\n",
"from random import randint\n",
"\n",
"# This is used below, for simplicity and for faster convergence ;)\n",
"def random_batch(data,labels,size):\n",
" value = math.floor(len(data) / size) \n",
" intervall = randint(0,value-1)\n",
" return data[intervall*size:intervall*(size+1)],labels[intervall*size:intervall*(size+1)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Train the model:\n",
"---------------"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"step 0, training accuracy 0.0714286\n",
"step 1000, training accuracy 0.767164\n",
"step 2000, training accuracy 0.82266\n",
"step 3000, training accuracy 0.825996\n",
"step 4000, training accuracy 0.77907\n",
"step 5000, training accuracy 0.875\n",
"step 6000, training accuracy 0.820588\n",
"step 7000, training accuracy 0.789474\n",
"step 8000, training accuracy 0.927273\n",
"step 9000, training accuracy 0.785714\n"
]
}
],
"source": [
"for i in range(10000):\n",
" batch_xs, batch_ys = random_batch(X_train,y_train,100)\n",
" if i%1000 == 0:\n",
" train_accuracy = accuracy.eval(feed_dict={x:batch_xs, y_: batch_ys, keep_prob: 1.0})\n",
" print(\"step %d, training accuracy %g\"%(i, train_accuracy))\n",
" train_step.run(feed_dict={x:batch_xs, y_: batch_ys, keep_prob: 0.5})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Prediction:\n",
"-----------"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"predicted_lables(10000)\n"
]
}
],
"source": [
"BATCH_SIZE = 50\n",
"predicted_lables = np.zeros(X_test.shape[0])\n",
"for i in range(0,X_test.shape[0]//BATCH_SIZE):\n",
" predicted_lables[i*BATCH_SIZE : (i+1)*BATCH_SIZE] = \\\n",
" predict.eval(feed_dict={x: X_test[i*BATCH_SIZE : (i+1)*BATCH_SIZE], keep_prob: 1.0})\n",
"\n",
"\n",
"print('predicted_lables({0})'.format(len(predicted_lables)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Accuracy:\n",
"---------"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[889, 0, 13, 9, 1, 0, 75, 0, 13, 0],\n",
" [ 2, 985, 1, 8, 1, 1, 2, 0, 0, 0],\n",
" [ 16, 0, 858, 10, 55, 0, 58, 0, 3, 0],\n",
" [ 44, 6, 8, 892, 31, 0, 17, 0, 2, 0],\n",
" [ 0, 0, 53, 21, 879, 0, 46, 0, 1, 0],\n",
" [ 0, 0, 0, 0, 0, 973, 0, 17, 2, 8],\n",
" [158, 2, 43, 15, 57, 0, 717, 0, 8, 0],\n",
" [ 0, 0, 0, 0, 0, 10, 0, 963, 0, 27],\n",
" [ 2, 1, 3, 0, 3, 2, 1, 1, 985, 2],\n",
" [ 0, 0, 0, 0, 0, 4, 0, 30, 1, 965]])"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import confusion_matrix\n",
"cnf_matrix = confusion_matrix(y_test, predicted_lables)\n",
"cnf_matrix"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.91059999999999997"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import accuracy_score\n",
"accuracy_score(y_test, predicted_lables)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment