machineLearning

Relu를 이용한 신경망 mnist

탄생 2018. 5. 9. 19:20

● MNIST 데이터

mnist 데이터

갯수 

역할 

mnist.train 

55,000

학습데이터 

mnist.test 

10,000 

테스트데이터 

mnist.validation 

5,000 

검증데이터 

mnist는 이미지를 분석을 위한 데이터의 모임이다

mnist의 데이터는 총 7만개로 이중 55,000개는 학습에 사용하고 10,000개는 테스트에 5,000개는 검증에 사용하기 위해 나누어 놓은것입니다.

mnist는 지도학습 알고리즘의 데이터로서 활용하며 각 데이터들은 image와 label이 세트로 존재합니다.

학습에 사용되는 image와 그 결과를 담은것이 label입니다.


● Relu를 이용한 분류모델(전체소스)

import tensorflow as tf
import numpy as np
 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./mnist/data./', one_hot=True)
 
# 신경망 모델 구성
= tf.placeholder(tf.float32, [None, 784])
= tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)
 
W1 = tf.Variable(tf.random_normal([784256], stddev=0.01))
L1 = tf.nn.relu(tf.matmul(X, W1))
L1 = tf.nn.dropout(L1, keep_prob)
 
W2 = tf.Variable(tf.random_normal([256,256], stddev=0.01))
L2 = tf.nn.relu(tf.matmul(L1, W2))
L2 = tf.nn.dropout(L2, keep_prob)
 
W3 = tf.Variable(tf.random_normal([25610], stddev=0.01))
model = tf.matmul(L2, W3)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=model, labels=Y))
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)
 
# 신경망 모델학습
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
batch_size = 100
total_batch = int(mnist.train.num_examples / batch_size) 
 
for epoch in range(10):
    total_cost = 0
    
    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        
        _, cost_val = sess.run([optimizer, cost], feed_dict={X:batch_xs, Y:batch_ys, keep_prob:0.8})
        total_cost += cost_val
        
    print('epoch:''%04d' % (epoch+1), 'Avg. cost = ''{:3f}'.format(total_cost/total_batch))
 
print('최적화완료')
 
#결과확인
is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도:', sess.run(accuracy, feed_dict={X:mnist.test.images, Y:mnist.test.labels, keep_prob: 1}))


- 실행결과

epoch: 0001 Avg. cost =  0.431793
epoch: 0002 Avg. cost =  0.166872
epoch: 0003 Avg. cost =  0.115187
epoch: 0004 Avg. cost =  0.086878
epoch: 0005 Avg. cost =  0.073775
epoch: 0006 Avg. cost =  0.061122
epoch: 0007 Avg. cost =  0.051616
epoch: 0008 Avg. cost =  0.046551
epoch: 0009 Avg. cost =  0.045054
epoch: 0010 Avg. cost =  0.037457
최적화완료
정확도: 0.9782




● 분류보델 설명

1. MNIST의 import

import tensorflow as tf
import numpy as np
 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./mnist/data./', one_hot=True)

mnist의 데이터를 불러온다


2. 신경망 모델구성

# 신경망 모델 구성
= tf.placeholder(tf.float32, [None, 784])
= tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)
 
W1 = tf.Variable(tf.random_normal([784256], stddev=0.01))
L1 = tf.nn.relu(tf.matmul(X, W1))
L1 = tf.nn.dropout(L1, keep_prob)
 
W2 = tf.Variable(tf.random_normal([256,256], stddev=0.01))
L2 = tf.nn.relu(tf.matmul(L1, W2))
L2 = tf.nn.dropout(L2, keep_prob)
 
W3 = tf.Variable(tf.random_normal([25610], stddev=0.01))
model = tf.matmul(L2, W3)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=model, labels=Y))
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)


신경망을 구축하고 relu를 이용하여 학습을 시킵니다.
- 과적합 발생
   머신러닝을 위한 학습 데이터는 항상 학습용과 테스트용으로 분리해서 사용합니다. 학습데이터는 학습을 시킬때 사용하고 테스트데이터는 학습이 잘 되었는지 확인하는데 사용합니다. 학습데이터로는 예측 정확도가 매우 높게 나오지만 학습 데이터에 포함되지 않은 새로운 데이터를 예측하면 정확도가 매우 떨어지는 경우가 발생하기 때문입니다.
이를 과적합(overfitting)이라고 합니다.
dropout은 이런 과적합을 해결하는 방법중 하나입니다. 전체 신경망을 모두 사용하는 것이 아니라 일부만 사용하여 특징을 고정화 시키지 않고 균형 잡히도록 학습시키는 방법입니다. 모든 신경망을 사용하지 않기 때문에 학습하는데 시간이 더 오래 걸립니다.

- softmax는 학습데이터를 백분율과 같이 환산하여 나온 값의 합이 1을 만드는 방법입니다
- 그리고 비용을 계산하는데에는 AdamOptimizer을 활용하여 학습비용을 빠르게 계산하도록 하였습니다.

3. 신경망 모델학습
# 신경망 모델학습
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
batch_size = 100
total_batch = int(mnist.train.num_examples / batch_size) 
 
for epoch in range(10):
    total_cost = 0
    
    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        
        _, cost_val = sess.run([optimizer, cost], feed_dict={X:batch_xs, Y:batch_ys, keep_prob:0.8})
        total_cost += cost_val
        
    print('epoch:''%04d' % (epoch+1), 'Avg. cost = ''{:3f}'.format(total_cost/total_batch))
 
print('최적화완료')
 
#결과확인
is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도:', sess.run(accuracy, feed_dict={X:mnist.test.images, Y:mnist.test.labels, keep_prob: 1}))


- epoch : 에포크는 학습데이터를 전체 한번 학습하는 것입니다. 10포크는 전체 학습데이터를 10번 학습시키는 것입니다.

             전체 데이터를 여러번 학습시켜 정확도를 높일 수 있습니다.

- 미니배치 : 모든 데이터를 한꺼번에 저장하고 학습을 시키게 되면 메모리나 컴퓨터 성능이 저하될수 있으므로 batch_size만큼 나누어 학습하는 방법입니다.

- 이렇게 학습이 된것을 검증하여 학습결과와 실제값(label)을 비교하여 정확도를 확인합니다.