#!/usr/bin/env python # coding: utf-8 # # Digit Recognizer using Multiclass Clasification # * https://www.kaggle.com/c/digit-recognizer # In[1]: import numpy as np import pandas as pd import tensorflow as tf # ## prepareing data # Download data from https://www.kaggle.com/c/digit-recognizer/data # In[2]: n_input = 784 # MNIST data input (img shape: 28*28) n_classes = 10 # MNIST total classes (0-9 digits) validation_size = 2000 # In[39]: train = pd.read_csv('../input/digit-recognizer/train.csv') test = pd.read_csv('../input/digit-recognizer/test.csv') # In[40]: print(train.shape) print(test.shape) # In[5]: train.head() # In[6]: test.head() # split train data to labels and pixels. # In[7]: features = (train.ix[:,1:].values).astype('float32') labels = pd.get_dummies(train.ix[:,0]).astype('float32') # one hot encoding # In[8]: print(features.shape) print(labels.shape) # In[9]: # split data into training & validation valid_features = features[:validation_size] valid_labels = labels[:validation_size] train_features = features[validation_size:] train_labels = labels[validation_size:] # In[10]: print(train_features.shape) print(train_labels.shape) print(valid_features.shape) print(valid_labels.shape) # In[11]: test_features = (test.values).astype('float32') # In[12]: print(test_features.shape) # ## Make a TensorFlow Graph # In[13]: # Features and Labels features = tf.placeholder(tf.float32, [None, n_input]) labels = tf.placeholder(tf.float32, [None, n_classes]) # Weights & bias weights = tf.Variable(tf.random_normal([n_input, n_classes])) bias = tf.Variable(tf.random_normal([n_classes])) # Logits - xW + b logits = tf.add(tf.matmul(features, weights), bias) # Define loss and optimizer learning_rate = tf.placeholder(tf.float32) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # Calculate accuracy predict = tf.argmax(logits, 1) correct_prediction = tf.equal(predict, tf.argmax(labels, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) init = tf.global_variables_initializer() # ## Training # Define helper functions. # In[14]: def print_epoch_stats(epoch_i, sess, last_features, last_labels): """ Print cost and validation accuracy of an epoch """ current_cost = sess.run( cost, feed_dict={features: last_features, labels: last_labels}) valid_accuracy = sess.run( accuracy, feed_dict={features: valid_features, labels: valid_labels}) print('Epoch: {:<4} - Cost: {:<8.3} Valid Accuracy: {:<5.3}'.format( epoch_i, current_cost, valid_accuracy)) # In[15]: import math def batches(batch_size, features, labels): """ Create batches of features and labels :param batch_size: The batch size :param features: List of features :param labels: List of labels :return: Batches of (Features, Labels) """ assert len(features) == len(labels) outout_batches = [] sample_size = len(features) for start_i in range(0, sample_size, batch_size): end_i = start_i + batch_size batch = [features[start_i:end_i], labels[start_i:end_i]] outout_batches.append(batch) return outout_batches # HyperParameters # In[16]: batch_size = 128 epochs = 100 learn_rate = 0.0001 # In[17]: train_batches = batches(batch_size, train_features, train_labels) # In[37]: with tf.Session() as sess: sess.run(init) # Training cycle for epoch_i in range(epochs): # Loop over all batches for batch_features, batch_labels in train_batches: train_feed_dict = { features: batch_features, labels: batch_labels, learning_rate: learn_rate} sess.run(optimizer, feed_dict=train_feed_dict) # Print cost and validation accuracy of an epoch print_epoch_stats(epoch_i, sess, batch_features, batch_labels) predictions = sess.run( predict, feed_dict={features: test_features}) # ## Write to file # In[38]: submissions = pd.DataFrame({"ImageId": list(range(1, len(predictions)+1)), "Label": predictions}) submissions.to_csv("output.csv", index=False, header=True) # In[ ]: