Created
August 17, 2017 23:04
-
-
Save noahfl/65b8c0e56b39e58affc5f63b4915dfd3 to your computer and use it in GitHub Desktop.
Stock implementation of TensorFlow's "Deep MNIST for Experts"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
# In[4]: | |
# reference: https://www.tensorflow.org/versions/r0.12/tutorials/mnist/pros/ | |
from tensorflow.examples.tutorials.mnist import input_data | |
# In[5]: | |
import tensorflow as tf | |
sess = tf.InteractiveSession() | |
# In[6]: | |
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) | |
# Create the model | |
x = tf.placeholder(tf.float32, [None, 784]) | |
W = tf.Variable(tf.zeros([784, 10])) | |
b = tf.Variable(tf.zeros([10])) | |
y = tf.matmul(x, W) + b | |
# Define loss and optimizer | |
y_ = tf.placeholder(tf.float32, [None, 10]) | |
# In[7]: | |
#initialize weights | |
def weight_variable(shape): | |
initial = tf.truncated_normal(shape, stddev=0.1) | |
return tf.Variable(initial) | |
#initialize neurons w/ small bias | |
def bias_variable(shape): | |
initial = tf.constant(0.1, shape=shape) | |
return tf.Variable(initial) | |
# In[8]: | |
#convolution | |
def conv2d(x, W): | |
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') | |
#max pooling | |
def max_pool_2x2(x): | |
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], | |
strides=[1, 2, 2, 1], padding='SAME') | |
# In[9]: | |
#creating first convolutional layer | |
W_conv1 = weight_variable([5, 5, 1, 32]) | |
b_conv1 = bias_variable([32]) | |
x_image = tf.reshape(x, [-1,28,28,1]) | |
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) | |
h_pool1 = max_pool_2x2(h_conv1) | |
#second convolutional layer | |
W_conv2 = weight_variable([5, 5, 32, 64]) | |
b_conv2 = bias_variable([64]) | |
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) | |
h_pool2 = max_pool_2x2(h_conv2) | |
#fully connected layer | |
W_fc1 = weight_variable([7 * 7 * 64, 1024]) | |
b_fc1 = bias_variable([1024]) | |
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) | |
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) | |
# In[10]: | |
""" | |
DROPOUT: this is where the magic happens | |
this is the stock version | |
""" | |
#holds probability that neuron's output is kept during dropout | |
keep_prob = tf.placeholder(tf.float32) | |
#TensorFlow's stock dropout function | |
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) | |
# In[11]: | |
#readout layer | |
W_fc2 = weight_variable([1024, 10]) | |
b_fc2 = bias_variable([10]) | |
y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 | |
# In[ ]: | |
#TESTING | |
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_conv, labels=y_)) | |
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) | |
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) | |
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) | |
sess.run(tf.global_variables_initializer()) | |
for i in range(20000): | |
#print(str(i + 1)) | |
batch = mnist.train.next_batch(50) | |
#print accuracy every 100 iterations | |
if i % 100 == 0: | |
train_accuracy = accuracy.eval(feed_dict={ | |
x:batch[0], y_: batch[1], keep_prob: 1.0}) | |
print("step %d, training accuracy %.4g"%(i, train_accuracy)) | |
#loss = tf.Print(cross_entropy, data=[cross_entropy], message="loss: ") | |
#sess.run(loss) | |
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) | |
print("test accuracy %.6g"%accuracy.eval(feed_dict={ | |
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment