관리 메뉴

Storage Gonie

모두를 위한 딥러닝 제21강 ML lab 07-2: Meet MNIST Dataset 본문

데이터 사이언스/모두를 위한 딥러닝

모두를 위한 딥러닝 제21강 ML lab 07-2: Meet MNIST Dataset

Storage Gonie 2018. 9. 27. 18:49
반응형

# MNIST data 형태

- 28x28개의 네모칸에 숫자가 지나간 부분에 대해서 어두운 정도가 값으로 들어가 있음.

- X 는 28x28 = 784개의 features로 이루어 져있고 ex) [0, 0, ... , 0.932111, 0.212163, 0, 0]

- Y 는 one-hot 벡터로 0~9 를 나타내는 벡터로 이루어져 있다. ex) [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]



# 몇가지 용어

- epoch        : 전체 Training set을 한번 돈 것을 1epoch이라고 한다.

- batch_size : 전체 Training set 즉, 1epoch은 너무 양이 많으므로 이를 쪼개서 사용하는 크기가 batch_size이다.

- iterations  : 반복 횟수

- Q. 1000개의 training example이 있을 때 batch_size가 500이면 몇번을 반복해야 1epoch에 대한 훈련을 완료할 수 있겠는가? 

       => 답 : 2번


# 하나의 텐서만을 실행할 때 sess.run()를 대신할 수 있는 방법

- 특정텐서.eval()

- 여기서 session=sess 인자는 생략가능하다.

print("Accuracy: ", accuracy.eval(esssion=sess, feed_dict={X: minist.test.images, Y: mnist.test.labels}))

MNIST 분류하는 모델 만드는 예제

- 1epoch을 완료할 때 마다 출력하는 cost는 avg_cost이고 각 배치에서 나온 cost를 다 더해서 배치반복횟수로 이를 나눠준 것이다.

#-*- coding: euc-kr -*-
# Check out https://www.tensorflow.org/get_started/mnist/beginners for more information about the mnist dataset
import tensorflow as tf
import random
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

tf.set_random_seed(777) # for reproducibility

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

nb_classes = 10

X = tf.placeholder(tf.float32, [None, 784]) # MNIST data image of shape 28 * 28 = 784
Y = tf.placeholder(tf.float32, [None, nb_classes]) # 0 - 9 digits recognition = 10 classes

W = tf.Variable(tf.random_normal([784, nb_classes]))
b = tf.Variable(tf.random_normal([nb_classes]))

# Hypothesis (using softmax)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Test model
is_correct = tf.equal(tf.arg_max(hypothesis, 1), tf.arg_max(Y, 1))
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

# parameters
training_epochs = 15
batch_size = 100

with tf.Session() as sess:

sess.run(tf.global_variables_initializer()) # Initialize TensorFlow variables

for epoch in range(training_epochs): # Training cycle
avg_cost = 0
total_batch = int(mnist.train.num_examples / batch_size) # 1개의 epoch에 대해 배치를 몇번 돌려야하는가

for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
c, _ = sess.run([cost, optimizer], feed_dict={X: batch_xs, Y: batch_ys})
avg_cost += c / total_batch #여기서 avg_cost를 구할때 매번 나누는게 아니라 c만 다 더해서 출력전 total_batch로 나눠줄 것을 복잡하게 해둠

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

print("Learning finished")

# Test the model using test sets
print("Accuracy: ", accuracy.eval(session=sess, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))

# 주의!
# 아래에서 [r:r+1]을 해주는 이유는 [] 형태가 아닌 [[ ]]형태로 데이터를 얻기 위함임
# 앞에서 했던 모든 예제들에서 X데이터, Y데이터는 [ [ ], [ ], [ ] ] 이런식으로 되어있었다는 것을 생각하자.
# Get one and predict
r = random.randint(0, mnist.test.num_examples - 1) # 인덱스로 사용될 램덤한 숫자
print("Label: ", sess.run(tf.argmax(mnist.test.labels[r:r + 1], 1)))
print("Prediction: ", sess.run(tf.argmax(hypothesis, 1), feed_dict={X: mnist.test.images[r:r + 1]}))

plt.imshow(
mnist.test.images[r:r + 1].reshape(28, 28),
cmap='Greys',
interpolation='nearest')
plt.show()


'''
('Epoch:', '0001', 'cost =', '2.826302778')
('Epoch:', '0002', 'cost =', '1.061668980')
('Epoch:', '0003', 'cost =', '0.838061322')
('Epoch:', '0004', 'cost =', '0.733232752')
('Epoch:', '0005', 'cost =', '0.669279893')
('Epoch:', '0006', 'cost =', '0.624611845')
('Epoch:', '0007', 'cost =', '0.591160354')
('Epoch:', '0008', 'cost =', '0.563868992')
('Epoch:', '0009', 'cost =', '0.541745185')
('Epoch:', '0010', 'cost =', '0.522673587')
('Epoch:', '0011', 'cost =', '0.506782339')
('Epoch:', '0012', 'cost =', '0.492447647')
('Epoch:', '0013', 'cost =', '0.479955844')
('Epoch:', '0014', 'cost =', '0.468893675')
('Epoch:', '0015', 'cost =', '0.458703487')
Learning finished
('Accuracy: ', 0.8951)
('Label: ', array([1]))
('Prediction: ', array([1]))
'''


반응형
Comments