In [ ]:
import tensorflow as tf
import numpy as np

In [ ]:
from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets("data/MNIST/", one_hot=True)

In [ ]:
print(len(data.train.images))
print(len(data.test.images))
print(len(data.validation.images))

In [ ]:
data.train.cls = np.argmax(data.train.labels, axis = 1)
data.test.cls = np.argmax(data.test.labels, axis=1)
print(data.train.cls[:10])
print(data.test.cls[:10])

In [ ]:
data.train.labels.shape

In [ ]:
data.train.cls.shape

In [ ]:
image_size = 28
image_shape = (image_size, image_size)
image_flat = image_size*image_size
num_class = 10

In [ ]:
input_channel = 1
layer1_filter_size = 5
layer1_output_channel = 16
layer2_filter_size = 5
layer2_output_channel = 36
fc1_size = 128
fc2_size = 10

In [ ]:
def get_new_weight(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))

In [ ]:
def get_new_bias(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))

In [ ]:
def get_conv_layer(input, input_channel, output_channel, filter_size, max_pooling=True):
    weight = get_new_weight([filter_size, filter_size, input_channel, output_channel])
    bias = get_new_bias([output_channel])
    
    layer = tf.nn.conv2d(input, filter = weight, strides= [1,1,1,1], padding='SAME')
    
    layer = layer + bias
    
    if max_pooling:
        layer = tf.nn.max_pool(layer, strides = [1,2,2,1], ksize=[1,2,2,1], padding = 'SAME')
        
    layer = tf.nn.relu(layer)
    
    return layer, weight

In [ ]:
def get_flat_layer(layer):
    layer_shape = layer.get_shape()
    num_features = layer_shape[1:4].num_elements()
    layer_flat = tf.reshape(layer, [-1, num_features])
    return layer_flat, num_features

In [ ]:
def get_fc(flat_layer, input_size, output_size, relu=True):

    weight = get_new_weight([input_size, output_size])
    bias = get_new_bias([output_size])
    
    layer = tf.matmul(flat_layer, weight) + bias
    
    if relu:
        layer = tf.nn.relu(layer)
    return layer, weight

In [ ]:
x = tf.placeholder(tf.float32, [None, image_flat])

In [ ]:
y = tf.placeholder(tf.float32, [None, num_class])

In [ ]:
x_image = tf.reshape(x, [-1, image_size, image_size, input_channel])

In [ ]:
y_true_class = tf.argmax(y, axis = 1)

In [ ]:
layer1, weight1 = get_conv_layer(x_image, input_channel, layer1_output_channel, layer1_filter_size, max_pooling=True)

In [ ]:
layer1

In [ ]:
weight1

In [ ]:
layer2, weight2 = get_conv_layer(layer1, layer1_output_channel,layer2_output_channel , layer2_filter_size, max_pooling=True)

In [ ]:
layer2

In [ ]:
weight2

In [ ]:
flat_layer, num_features = get_flat_layer(layer2)

In [ ]:
flat_layer

In [ ]:
num_features

In [ ]:
layer_fc1, weight_fc1 = get_fc(flat_layer,num_features , fc1_size, relu=True)

In [ ]:
layer_fc1

In [ ]:
weight_fc1

In [ ]:
layer_fc2, weight_fc2 = get_fc(layer_fc1, fc1_size, fc2_size, relu=False)

In [ ]:
layer_fc2

In [ ]:
weight_fc2

In [ ]:
y_pred = tf.nn.softmax(layer_fc2)

In [ ]:
y_pred_class = tf.argmax(y_pred, axis =1)

In [ ]:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2,labels=y)

In [ ]:
cost = tf.reduce_mean(cross_entropy)

In [ ]:
optimizer = tf.train.AdamOptimizer(1e-4).minimize(cost)

In [ ]:
correct_pred= tf.equal(y_pred_class, y_true_class)

In [ ]:
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

In [ ]:
sess = tf.Session()

In [ ]:
sess.run(tf.global_variables_initializer())

In [ ]:
BATCH_SIZE = 64

In [ ]:
def optimization(training_iterations):
    for iteration in range(training_iterations):
        x_train, y_train = data.train.next_batch(BATCH_SIZE)
        feed_dict_train = {x:x_train, y:y_train}
        sess.run(optimizer, feed_dict = feed_dict_train)

In [ ]:
def get_accuracy():
    feed_dict_test = {x:data.test.images, y:data.test.labels, y_true_class:data.test.cls}
    print("Accuracy is {0}".format(sess.run(accuracy, feed_dict = feed_dict_test)))

In [ ]:
#get_accuracy()

In [ ]:
#optimization(1)

In [ ]:
optimization(1)

In [ ]: