z2soo's Blog

Deep learning: Xavier 초기값 및 초기화 본문

Big data & AI

Deep learning: Xavier 초기값 및 초기화

z2soo 2020. 1. 13. 17:42
반응형

목차

정확도를 높이기 위해서 임의로 설정되도록 한 초기값을 Xavier를 사용하여 설정되도록 한다.

 

  1. Xavier Initialization
  2. 그래프 초기화
  3. Xavier 활용 MNIST 예제

Xavier Initialization

가중치 W에 대한 초기값이 랜덤으로 설정될 경우 운에 의해서 학습의 정확도가 달라진다.

bias의 경우 상수여서 임의로 설정해도 괜찮지만, W 값의 경우 가중치로써 가설까지 영향을 주기 때문에 중요하다.

이를 보다 효율적으로 설정하기 위해 Xavier initialization, He initialization 초기법이 등장하였으며, 여기서는 Xavier 초기법을 다루어보록 한다. 

 

  • W = tf.get_variable( name = '이름', shape = [n1,n2], initializer = tf.contrib.layers.xavier_initializer( ) )
초기값 임의 설정 W = tf.Variable( tf.random_normal( shape = [n1,n2 ] ), name = '이름' ) 
Xavier 설정법 W = tf.get_variable( name = '이름', shape = [n1,n2], initializer = tf.contrib.layers.xavier_initializer()

 

그래프 초기화

랜덤으로 가중치 W와 b에 대해 초기값이 설정되도록 했을 때에는 코드 실행시 마다 값이 변해서 상관이 없었지만, Xavier 초기값 설정 방법을 통해 초기값을 설정하는 경우 한 번 코드를 실행하면 W에 해당 값이 assign 되어진다. 

따라서 새로 코드를 실행시키면 이미 값이 assign 되었다고 오류가 뜨기 때문에, 다음과 같은 코드를 넣어 이와 같은 상황을 방지해주어야 한다. 해당 코드는 데이터 불러오기 다음에 실행한다. 

 

  • tf.reset_default_graph( ) : H 라는 그래프를 그리는 작업을 하고 있는 것이기에 이를 reset 해줌

Xavier 활용 MNIST 예제

1. 모듈 삽입

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import warnings
warnings.filterwarnings(action='ignore')

2. Data loading

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

3. 그래프 초기화

  • tf.reset_default_graph( ) : H 라는 그래프를 그리는 작업을 하고 있는 것이기에 이를 reset 해줌
tf.reset_default_graph()

4. Placeholder

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

5. W, b

이 과정에서 relu 함수가 쓰이는 것 확인하고 넘어가자!

  • W = tf.get_variable( name = '  ', shape = [  ], initializer = tf.contrib.layers.xavier_initializer( ) )
W1 = tf.get_variable("weight1", shape=[784,256], initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.Variable(tf.random_normal(shape=[256]), name='bias1')
layer1 = tf.nn.relu(tf.matmul(X,W1) + b1)

W2 = tf.get_variable("weight2", shape=[256,256], initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.Variable(tf.random_normal(shape=[256]), name='bias2')
layer2 = tf.nn.relu(tf.matmul(layer1,W2) + b2)

W3 = tf.get_variable("weight3", shape=[256,10], initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.Variable(tf.random_normal(shape=[10]), name='bias3')

6. Hypothesis

이 과정에서 relu 함수가 쓰이는 것 확인하고 넘어가자!

logit = tf.matmul(layer2, W3) + b3
H = tf.nn.relu(logit)

7. Cost

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

8. Train node

기존에 사용하던 경사하강법: tf.train.GradientDescentOptimiser( learning_rate = 숫자 ).minimize( cost )

기본적인 원리는 같지만 조금 더 최근에 나온 함수 AdamOptimizer를 사용한다. 

 

  • train = tf.train.AdamOptimizer( leanring_rate = 숫자 ).minimize( cost )
# AdamOptimizer 사용
train = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)

9. Session, 초기화

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

10. 학습

num_of_epoch = 30
batch_size = 100

for step in range(num_of_epoch):    
    num_of_iter = int(mnist.train.num_examples / batch_size)
    cost_val = 0
    
    for i in range(num_of_iter):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        _, cost_val = sess.run([train, cost], feed_dict={X: batch_x,
                                                    Y: batch_y})
    if step % 3 == 0:
        print(f'cost: {cost_val}')

11. 정확도

predict = tf.argmax(H,1)
correct = tf.equal(predict, tf.argmax(Y,1))
accuracy = tf.reduce_mean(tf.cast(correct, dtype=tf.float32))
print(f'정확도:{sess.run(accuracy, feed_dict={X:mnist.test.images, Y: mnist.test.labels})}')

# 정확도:0.9728000164031982
반응형

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

Deep learning 예제: CNN 활용 과정 1  (0) 2020.01.14
Deep learning: CNN 개념  (0) 2020.01.14
Deep learning: 과적합 해결 dropout  (0) 2020.01.13
Deep learning: ReLU 함수  (0) 2020.01.13
Deep learning 예제: MNIST  (0) 2020.01.13
Comments