z2soo's Blog

Deep learning 예제: CNN 활용 과정 1 본문

Big data & AI

Deep learning 예제: CNN 활용 과정 1

z2soo 2020. 1. 14. 19:47
반응형

목차

지금까지 배운 이미지 학습 내용을 가지고 tensorflow에서 제공하는 mnist 이미지 데이터로 학습을 진행해보도록 한다.

 

  1. Data pre-processing
  2. Convolution layer process
  3. Multi-layer process

Data pre-processing

1. 모듈 삽입

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
import numpy as np

2. 데이터 로딩

raw data를 사용하면 convolution 작업 이전에 데이터 전처리(이상치, 결측치, 정규화)를 비롯하여 test data, train data 분할 작업도 필요로 된다. 단, 지금은 tensorflow에서 제공해주는 정제된 mnist 데이터를 사용하기 때문에 불필요하다. 

mnist = input_data.read_data_sets('./data/mnist', one_hot = True)

3. 그래프 초기화

tf.reset_default_graph()

4. Placeholder

X = tf.placeholder(shape = [None, 784], dtype=tf.float32)
Y = tf.placeholder(shape = [None, 10], dtype=tf.float32)
keep_rate = tf.placeholder(dtype=tf.float32)

Convolution layer process

1. image data 설정

위에서 불러들인 2차원 데이터에 대해 이미지 학습을 위한 4차원 데이터로 reshape 해준다.

 

  • tf.reshape( 대상 데이터, [ -1, width, weight, depth ] ) : 총 데이터  갯수는 모르니 -1 설정, 나머지는 필요에 따라 설정
x_img = tf.reshape(X, [-1,28,28,1])

2. Convolution 진행

filter 설정에 있어서 depth는 위에서 설정한 image data의 depth와 동일하게 맞춰주고, filter 갯수는 개인이 임의 설정한다.

  • Filter 설정 > Convolution (stride, padding 설정) > ReLU > max_pool (개인이 임의 설정)
  • Filter =  tf.Variable(tf.random_normal( [ width, height, depth, filter 개수 ] ), name =" " )
F1 = tf.Variable(tf.random_normal([3,3,1,32]), name ='Filter1')
L1 = tf.nn.conv2d(x_img,
                  F1,
                  strides=[1,1,1,1],
                  padding='SAME')
L1 = tf.nn.relu(L1)
L1 = tf.nn.max_pool(L1,
                    ksize=[1,2,2,1],
                    strides=[1,2,2,1],
                    padding='SAME')


F2 = tf.Variable(tf.random_normal([3,3,32,64]), name ='Filter2')
L2 = tf.nn.conv2d(L1,
                  F2,
                  strides=[1,1,1,1],
                  padding='SAME')
L2 = tf.nn.relu(L2)
L2 = tf.nn.max_pool(L2,
                    ksize=[1,2,2,1],
                    strides=[1,2,2,1],
                    padding='SAME')
print(L2.shape)

# (?, 7, 7, 64)

Multi-layer multinomial logistic process

1. Data 설정

Convolution 출력값인 4차원의 데이터를 학습을 위해 다시 2차원으로 변환한다.

L2 = tf.reshape(L2, [-1, 7*7*64])
conv = L2
print(conv.shape)

# (?, 3136)

2. Multi-layer 설정

  • W, b 설정 > layer 설정: ReLU, dropout

dropout 함수에 대한 drop rate 설정시, 유의할 점!

rate로 인자를 주려고 할 때, 오류가 나는 것은 이전 버전이기 때문이고 keep_prob 을 사용하면 된다.

똑같이 0.3 으로 설정하더라도 30% 사용, 70% 사용 으로 다르게 작동한다. 

마찬가지로 마지막 test data에 대해서도 rate = 0 으로 줬다면, keep_prob = 1 로 설정해줘야 한다. 

 

  • tf.nn.dropout( 해당 데이터, keep_prob = 위에서 설정한 placeholder 인자 ) 
  • tf.nn.dropout( 해당 데이터, rate = 위에서 설정한 placeholder 인자 ) 
  • keep_prob : 사용할 node 비율을 설정
  • rate : 사용하지 않을 node 비율을 설정
W1 = tf.get_variable("weight1", 
                     shape = [7*7*64,256],  #256은 임의의 logistic 노드 갯수
                     initializer = tf.contrib.layers.xavier_initializer())
b1 = tf.Variable(tf.random_normal(shape = [256]), name = 'bias1')

_layer1 = tf.nn.relu(tf.matmul(conv, W1) + b1)
layer1 = tf.nn.dropout(_layer1, keep_prob = keep_rate)  

W2 = tf.get_variable("weight2", 
                     shape = [256,10],  #최종 값은 label의 갯수: 10
                     initializer = tf.contrib.layers.xavier_initializer())
b2 = tf.Variable(tf.random_normal(shape = [10]), name = 'bias2')

3. Hypothesis

logit = tf.matmul(layer1, W2) + b2
H = tf.nn.relu(logit)

4. Cost

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

5. Train

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

6. Session, 변수 초기화

sess = tf.Session()
sess.run(tf.global_variables_initializer())

7. 학습

num_of_epoch = 30
batch_size = 100

for step in range(num_of_epoch):
    num_of_iter = int(mnist.train.num_examples / batch_size)
    
    for i in range(num_of_iter):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        _, val_cost = sess.run([train, cost],
                               feed_dict = {X: batch_x,
                                            Y: batch_y,
                                            keep_rate: 0.7})
    if step % 1 == 0:
        print(f'cost값: {val_cost}')
        
# print(f'cost값: {val_cost}') 마지막 출력 
# cost값: 0.001109772827476263        

8. 정확도

앞서 multi-layer 과정에서 언급한 바와 같이, test data에 대한 dropout 설정에 유의한다.

 

  • keep_prob : 1
  • rate : 0
predict = tf.argmax(H,1)
correct = tf.equal(predict, tf.argmax(Y,1))
accuracy = tf.reduce_mean(tf.cast(correct, dtype=tf.float32 ))

sess.run(accuracy, feed_dict = {X: mnist.test.images,
                                Y: mnist.test.labels,
                                keep_rate: 1})
                                
# 0.9867
반응형

'Big data & AI' 카테고리의 다른 글

Deep learning: CNN 개념  (0) 2020.01.14
Deep learning: 과적합 해결 dropout  (0) 2020.01.13
Deep learning: Xavier 초기값 및 초기화  (0) 2020.01.13
Deep learning: ReLU 함수  (0) 2020.01.13
Deep learning 예제: MNIST  (0) 2020.01.13
Comments