Skip to content

Commit eac93d1

Browse files
nicewookkkweon
authored andcommitted
supplement code for "Out of Memory" issue (#131)
fix: OOM issue MNIST.test data set is too big for some system so that makes Out of Memory issue. Commented code split dataset and predict to avoid "OOM" issue 1. Leave comments referring to the optional file 2. Add the optional file (lab-11-X-mnist_cnn_low_memory.py)
1 parent a01716d commit eac93d1

File tree

2 files changed

+190
-1
lines changed

2 files changed

+190
-1
lines changed

lab-11-2-mnist_deep_cnn.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@
121121
print('Learning Finished!')
122122

123123
# Test model and check accuracy
124+
125+
# if you have a OOM error, please refer to lab-11-X-mnist_deep_cnn_low_memory.py
126+
124127
correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))
125128
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
126129
print('Accuracy:', sess.run(accuracy, feed_dict={
@@ -155,4 +158,4 @@
155158
Epoch: 0015 cost = 0.024607201
156159
Learning Finished!
157160
Accuracy: 0.9938
158-
'''
161+
'''

lab-11-X-mnist_cnn_low_memory.py

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
# Lab 10 MNIST and Deep learning CNN
2+
import tensorflow as tf
3+
import random
4+
# import matplotlib.pyplot as plt
5+
6+
from tensorflow.examples.tutorials.mnist import input_data
7+
8+
tf.set_random_seed(777) # reproducibility
9+
10+
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
11+
# Check out https://www.tensorflow.org/get_started/mnist/beginners for
12+
# more information about the mnist dataset
13+
14+
# hyper parameters
15+
learning_rate = 0.001
16+
training_epochs = 15
17+
batch_size = 100
18+
19+
# dropout (keep_prob) rate 0.7~0.5 on training, but should be 1 for testing
20+
keep_prob = tf.placeholder(tf.float32)
21+
22+
# input place holders
23+
X = tf.placeholder(tf.float32, [None, 784])
24+
X_img = tf.reshape(X, [-1, 28, 28, 1]) # img 28x28x1 (black/white)
25+
Y = tf.placeholder(tf.float32, [None, 10])
26+
27+
# L1 ImgIn shape=(?, 28, 28, 1)
28+
W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))
29+
# Conv -> (?, 28, 28, 32)
30+
# Pool -> (?, 14, 14, 32)
31+
L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')
32+
L1 = tf.nn.relu(L1)
33+
L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1],
34+
strides=[1, 2, 2, 1], padding='SAME')
35+
L1 = tf.nn.dropout(L1, keep_prob=keep_prob)
36+
'''
37+
Tensor("Conv2D:0", shape=(?, 28, 28, 32), dtype=float32)
38+
Tensor("Relu:0", shape=(?, 28, 28, 32), dtype=float32)
39+
Tensor("MaxPool:0", shape=(?, 14, 14, 32), dtype=float32)
40+
Tensor("dropout/mul:0", shape=(?, 14, 14, 32), dtype=float32)
41+
'''
42+
43+
# L2 ImgIn shape=(?, 14, 14, 32)
44+
W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev=0.01))
45+
# Conv ->(?, 14, 14, 64)
46+
# Pool ->(?, 7, 7, 64)
47+
L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME')
48+
L2 = tf.nn.relu(L2)
49+
L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1],
50+
strides=[1, 2, 2, 1], padding='SAME')
51+
L2 = tf.nn.dropout(L2, keep_prob=keep_prob)
52+
'''
53+
Tensor("Conv2D_1:0", shape=(?, 14, 14, 64), dtype=float32)
54+
Tensor("Relu_1:0", shape=(?, 14, 14, 64), dtype=float32)
55+
Tensor("MaxPool_1:0", shape=(?, 7, 7, 64), dtype=float32)
56+
Tensor("dropout_1/mul:0", shape=(?, 7, 7, 64), dtype=float32)
57+
'''
58+
59+
# L3 ImgIn shape=(?, 7, 7, 64)
60+
W3 = tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=0.01))
61+
# Conv ->(?, 7, 7, 128)
62+
# Pool ->(?, 4, 4, 128)
63+
# Reshape ->(?, 4 * 4 * 128) # Flatten them for FC
64+
L3 = tf.nn.conv2d(L2, W3, strides=[1, 1, 1, 1], padding='SAME')
65+
L3 = tf.nn.relu(L3)
66+
L3 = tf.nn.max_pool(L3, ksize=[1, 2, 2, 1], strides=[
67+
1, 2, 2, 1], padding='SAME')
68+
L3 = tf.nn.dropout(L3, keep_prob=keep_prob)
69+
L3 = tf.reshape(L3, [-1, 128 * 4 * 4])
70+
'''
71+
Tensor("Conv2D_2:0", shape=(?, 7, 7, 128), dtype=float32)
72+
Tensor("Relu_2:0", shape=(?, 7, 7, 128), dtype=float32)
73+
Tensor("MaxPool_2:0", shape=(?, 4, 4, 128), dtype=float32)
74+
Tensor("dropout_2/mul:0", shape=(?, 4, 4, 128), dtype=float32)
75+
Tensor("Reshape_1:0", shape=(?, 2048), dtype=float32)
76+
'''
77+
78+
# L4 FC 4x4x128 inputs -> 625 outputs
79+
W4 = tf.get_variable("W4", shape=[128 * 4 * 4, 625],
80+
initializer=tf.contrib.layers.xavier_initializer())
81+
b4 = tf.Variable(tf.random_normal([625]))
82+
L4 = tf.nn.relu(tf.matmul(L3, W4) + b4)
83+
L4 = tf.nn.dropout(L4, keep_prob=keep_prob)
84+
'''
85+
Tensor("Relu_3:0", shape=(?, 625), dtype=float32)
86+
Tensor("dropout_3/mul:0", shape=(?, 625), dtype=float32)
87+
'''
88+
89+
# L5 Final FC 625 inputs -> 10 outputs
90+
W5 = tf.get_variable("W5", shape=[625, 10],
91+
initializer=tf.contrib.layers.xavier_initializer())
92+
b5 = tf.Variable(tf.random_normal([10]))
93+
hypothesis = tf.matmul(L4, W5) + b5
94+
'''
95+
Tensor("add_1:0", shape=(?, 10), dtype=float32)
96+
'''
97+
98+
# define cost/loss & optimizer
99+
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
100+
logits=hypothesis, labels=Y))
101+
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
102+
103+
# initialize
104+
sess = tf.Session()
105+
sess.run(tf.global_variables_initializer())
106+
107+
# train my model
108+
print('Learning stared. It takes sometime.')
109+
for epoch in range(training_epochs):
110+
avg_cost = 0
111+
total_batch = int(mnist.train.num_examples / batch_size)
112+
113+
for i in range(total_batch):
114+
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
115+
feed_dict = {X: batch_xs, Y: batch_ys, keep_prob: 0.7}
116+
c, _, = sess.run([cost, optimizer], feed_dict=feed_dict)
117+
avg_cost += c / total_batch
118+
119+
print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
120+
121+
print('Learning Finished!')
122+
123+
# Test model and check accuracy
124+
correct_prediction = tf.equal(tf.argmax(hypothesis, 1), tf.argmax(Y, 1))
125+
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
126+
127+
128+
def evaluate(X_sample, y_sample, batch_size=512):
129+
"""Run a minibatch accuracy op"""
130+
131+
N = X_sample.shape[0]
132+
correct_sample = 0
133+
134+
for i in range(0, N, batch_size):
135+
X_batch = X_sample[i: i + batch_size]
136+
y_batch = y_sample[i: i + batch_size]
137+
N_batch = X_batch.shape[0]
138+
139+
feed = {
140+
X: X_batch,
141+
Y: y_batch,
142+
keep_prob: 1
143+
}
144+
145+
correct_sample += sess.run(accuracy, feed_dict=feed) * N_batch
146+
147+
return correct_sample / N
148+
149+
print("\nAccuracy Evaluates")
150+
print("-------------------------------")
151+
print('Train Accuracy:', evaluate(mnist.train.images, mnist.train.labels))
152+
print('Test Accuracy:', evaluate(mnist.test.images, mnist.test.labels))
153+
154+
155+
# Get one and predict
156+
print("\nGet one and predict")
157+
print("-------------------------------")
158+
r = random.randint(0, mnist.test.num_examples - 1)
159+
print("Label: ", sess.run(tf.argmax(mnist.test.labels[r:r + 1], 1)))
160+
print("Prediction: ", sess.run(
161+
tf.argmax(hypothesis, 1), {X: mnist.test.images[r:r + 1], keep_prob: 1}))
162+
163+
# plt.imshow(mnist.test.images[r:r + 1].
164+
# reshape(28, 28), cmap='Greys', interpolation='nearest')
165+
# plt.show()
166+
167+
'''
168+
Learning stared. It takes sometime.
169+
Epoch: 0001 cost = 0.385748474
170+
Epoch: 0002 cost = 0.092017397
171+
Epoch: 0003 cost = 0.065854684
172+
Epoch: 0004 cost = 0.055604566
173+
Epoch: 0005 cost = 0.045996377
174+
Epoch: 0006 cost = 0.040913645
175+
Epoch: 0007 cost = 0.036924479
176+
Epoch: 0008 cost = 0.032808939
177+
Epoch: 0009 cost = 0.031791007
178+
Epoch: 0010 cost = 0.030224456
179+
Epoch: 0011 cost = 0.026849916
180+
Epoch: 0012 cost = 0.026826763
181+
Epoch: 0013 cost = 0.027188021
182+
Epoch: 0014 cost = 0.023604777
183+
Epoch: 0015 cost = 0.024607201
184+
Learning Finished!
185+
Accuracy: 0.9938
186+
'''

0 commit comments

Comments
 (0)