Python

Tensorflow를 이용한 Deep Neural Network 기본 예제

xangmin 2020. 4. 13. 00:59
반응형

Deep Neural Network의 기본 예제를 Tensorflow를 통해 다루어 보고자 한다.

 

 Training Data인 입력 A가 가우시안 랜덤 분포를 따른 Neural Network를 거치면서 Target인 B를 출력하게 된다. (Feedforward) 우리는 이것을 Database(DB)로 사용할 것이다.

 

 DB의 Neural Network와 다른 Training할  Neural Network를 만든다. (Weight, Bias를 가우시안 랜덤으로 다시 초기화한다.)

 그리고 입력 A와 출력 B를 가지고 새로운 Neural Network를 Training한다. (Weight, Bias Update) 그리고 Cost가 제대로 수렴하는지 확인하고 수렴한다면 그 때의 Weight와 Bias값을 기존 DB Neural Network와 비교한다.

 

< DB Neural Network Weight >

 

< Training Neural Netwrok Weight >

학습이 진행될 수록 Epoch마다 cost가 줄어드는 것을 확인할 수 있다. 하지만 cost는 0에 가까이 수렴하지만 정확히 0에 수렴하지는 않는다. 왜냐하면 DB의 Neural Network가 global minimum이고 우리가 추정한 Neural Network는 local minimum이된다. 즉, 위의 표를 비교하게되면 weight는 초기의 weight값과 전혀 다른 값을 갖지만 cost는 줄어드는 방향으로 update가 되는 것을 볼 수 있다.

 

Version 1.

import tensorflow as tf
import numpy as np

tf.reset_default_graph()
tf.set_random_seed(777)

learning_rate = 0.1
training_cnt = 1000
data_num   = 10000
input_num  = 10
hidden_num = 10
output_num = 10

X = tf.placeholder(tf.float32, [data_num, input_num])
input = np.random.normal(size=(data_num, input_num))
Y = tf.placeholder(tf.float32, [data_num, output_num])

W1 = tf.Variable(tf.random_normal([input_num, hidden_num]), name='weight1')
b1 = tf.Variable(tf.random_normal([hidden_num]), name='bias1')
L1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([hidden_num, output_num]), name='weight2')
b2 = tf.Variable(tf.random_normal([output_num]), name='bias2')
L2 = tf.sigmoid(tf.matmul(L1, W2) + b2)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
w1 = sess.run(W1)
OUT = sess.run(L2, feed_dict={X: input})
output = OUT

W1 = tf.Variable(tf.random_normal([input_num, hidden_num]), name='weight1')
b1 = tf.Variable(tf.random_normal([hidden_num]), name='bias1')
L1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([hidden_num, output_num]), name='weight2')
b2 = tf.Variable(tf.random_normal([output_num]), name='bias2')
pred = tf.sigmoid(tf.matmul(L1, W2) + b2)


cost = tf.reduce_mean(tf.square(pred-Y))
# 경사하강법으로 최적화
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
op_train = optimizer.minimize(cost)

# 텐서플로우 초기화
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 반복학습 부분.
for step in range(training_cnt):
    sess.run(op_train, feed_dict={X: input, Y: output})
    if step % 100 == 0:
        w2 = sess.run(W1)
        print(step, sess.run(cost, feed_dict={X: input, Y: output}))

 

 두 번째 실험으로는 초기화를 랜덤이 아닌 Global minimum이 가지고 있는 Weight와 Bias에 가깝게 설정한다.

즉, 초기의 Weight와 Bias에 noise를 섞어서 Global minimum으로 수렴하는지 Local minimum으로 수렴하는지 확인한다.

 

noise가 클수록 local로 빠질 확률이 크고 noise가 작을수록 global로 수렴할 확률이 크다.

Version 2.

import tensorflow as tf
import numpy as np

tf.reset_default_graph()
tf.set_random_seed(777)

learning_rate = 0.01
training_cnt = 1000
data_num   = 1000
input_num  = 10
hidden_num = 8
output_num = 5
#-------------------------------------------------------
# Input Output Node를 설계합니다. 열:-, 행-개의 행렬 구조입니다.
X = tf.placeholder(tf.float32, [data_num, input_num])
input = np.random.normal(size=(data_num, input_num))
#print("DB_input:", input)
Y = tf.placeholder(tf.float32, [data_num, output_num])

# 가중치를 설계합니다. 열:-, 행-개의 행렬 구조입니다.
W1 = tf.Variable(tf.random_normal([input_num, hidden_num]), name='weight1')
b1 = tf.Variable(tf.random_normal([hidden_num]), name='bias1')
L1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([hidden_num, output_num]), name='weight2')
b2 = tf.Variable(tf.random_normal([output_num]), name='bias2')
L2 = tf.sigmoid(tf.matmul(L1, W2) + b2)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
w1 = sess.run(W1)
OUT = sess.run(L2, feed_dict={X: input})
#print("DB_out :", OUT)
output = OUT


#-------------------------------------------------------
noise1 = tf.Variable(tf.random_normal([hidden_num]), name='noise')
L1 = tf.sigmoid((tf.matmul(X, W1) + b1) + (2 * noise1))

noise2 = tf.Variable(tf.random_normal([output_num]), name='noise')
pred = tf.sigmoid((tf.matmul(L1, W2) + b2) + (2 * noise2))

# 오차함수는 logistic regression 문제이기 때문에 cross entropy 함수 사용.
cost = tf.reduce_mean(tf.square(pred-Y))
# 경사하강법으로 최적화
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
op_train = optimizer.minimize(cost)

# 텐서플로우 초기화
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 반복학습 부분.
for step in range(training_cnt):
    sess.run(op_train, feed_dict={X: input, Y: output})
    if step % 100 == 0:
        w2 = sess.run(W1)
        print(step, sess.run(cost, feed_dict={X: input, Y: output}))

 

반응형