import tensorflow as tf

import matplotlib

matplotlib.use('agg')

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

import random

import itertools

from sklearn.manifold import TSNE

from tensorflow.examples.tutorials.mnist import input_data


def next_batch(data_count, data_x, data_y):

    idx = np.arange(0, len(data_x))

    np.random.shuffle(idx)

    idx = idx[:data_count]

    

    data_shuffle = [data_x[i] for i in idx]

    labels_shuffle = [data_y[i] for i in idx]


    return np.asarray(data_shuffle), np.asarray(labels_shuffle)


learning_rate = 0.001

training_epochs = 10

batch_size = 32


# load MNIST data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

    

# Network Model.    

tf.set_random_seed(777)


keep_prob = tf.placeholder(tf.float32)


X = tf.placeholder(tf.float32, [None, 784])

X_img = tf.reshape(X, [-1, 28, 28, 1])  

Y = tf.placeholder(tf.float32, [None, 10])


W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))

L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')

L1 = tf.layers.batch_normalization(L1, center=True, scale=True, training=True)

L1 = tf.nn.relu(L1)

L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

L1 = tf.nn.dropout(L1, keep_prob=keep_prob)


W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev=0.01))

L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME')

L2 = tf.layers.batch_normalization(L2, center=True, scale=True, training=True)

L2 = tf.nn.relu(L2)

L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

L2 = tf.nn.dropout(L2, keep_prob=keep_prob)


W3 = tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=0.01))

L3 = tf.nn.conv2d(L2, W3, strides=[1, 1, 1, 1], padding='SAME')

L3 = tf.layers.batch_normalization(L3, center=True, scale=True, training=True)

L3 = tf.nn.relu(L3)

L3 = tf.nn.max_pool(L3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

L3 = tf.nn.dropout(L3, keep_prob=keep_prob)

L3_flat = tf.reshape(L3, [-1, 128 * 4 * 4])


W4 = tf.get_variable("W19", shape=[128 * 4 * 4, 100], initializer=tf.contrib.layers.xavier_initializer())

b4 = tf.Variable(tf.random_normal([100]))

L4 = tf.nn.relu(tf.matmul(L3_flat, W4) + b4)

L4 = tf.nn.dropout(L4, keep_prob=keep_prob)


W5 = tf.get_variable("W20", shape=[100, 10], initializer=tf.contrib.layers.xavier_initializer())

b5 = tf.Variable(tf.random_normal([10]))


logits = tf.matmul(L4, W5) + b5

y_pred = tf.nn.softmax(logits)


cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=logits))

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)


correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(Y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


sess = tf.Session()

sess.run(tf.global_variables_initializer())


print('Learning start')

for epoch in range(training_epochs):

    avg_cost = 0

    avg_acc = 0

    

    total_batch = int(len(mnist.train.images) / batch_size)

    

    for i in range(total_batch):

        batch = next_batch(32, mnist.train.images, mnist.train.labels)

        feed_dict = {X: batch[0], Y: batch[1], keep_prob: 0.7}

        c, _ , acc = sess.run([cost, optimizer, accuracy], feed_dict=feed_dict)

        

        avg_cost += c / total_batch

        avg_acc += acc / total_batch


    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost), 'Accuracy =', '{:.9f}'.format(avg_acc))

print('Learning Finish')



print('----------TEST----------')

total_batch = int(len(mnist.test.images) / batch_size)


test_acc = 0

for i in range(total_batch):

    batch = next_batch(32, mnist.test.images, mnist.test.labels)

    feed_dict = {X: batch[0], Y: batch[1], keep_prob: 1.0}

    c, _ , acc = sess.run([cost, optimizer, accuracy], feed_dict=feed_dict)

    test_acc += acc / total_batch

    

print('Test Accuracy = {0}'.format(test_acc))

print('END ALL')

sess.close()


+ Recent posts