rueki

4.신경망 구현 - Hidden layer 추가 본문

Tensorflow

4.신경망 구현 - Hidden layer 추가

륵기 2019. 7. 17. 09:12
728x90
반응형

이전 게시글에서는 입력층(특성에 관련)과 출력층(새의 종류)만 고려해서 Neural network를 구현해보았다.

이번 시간에는 입력층과 출력층 사이에 hidden layer를 넣어서 이전과는 어떻게 결과값이 달라지는지 알아보겠다.

 

import tensorflow as tf
import numpy as np

먼저 필요한 라이브러리를 불러오도록 하자.

# [털, 날개]
x_data = np.array(
    [[0, 0], [1, 0], [1, 1], [0, 0], [0, 0], [0, 1]])
# [기타, 포유류, 조류]
y_data = np.array([
    [1, 0, 0],  # 기타
    [0, 1, 0],  # 포유류
    [0, 0, 1],  # 조류
    [1, 0, 0],
    [1, 0, 0],
    [0, 0, 1]
])

입력값과 출력값에 대한 데이터는 동일하다. 이제 신경망 모델을 구현해보자.

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

W1 = tf.Variable(tf.random_uniform([2,10],-1.,1.)) #입력 2 은닉층 10
W2 = tf.Variable(tf.random_uniform([10,3],-1.,1.)) #은닉층 10 , 출력 3

b1 = tf.Variable(tf.zeros([10])) #편향을 각각 각 레이어의 아웃풋 갯수로 설정
b2 = tf.Variable(tf.zeros([3]))

가중치와 편향을 하나씩 더 추가함으로써, 입력층 -> 은닉층 -> 출력층 으로 연결이 가능해졌다.

여기서 Layer간의 연결을 실제로 구현해보자.

L1 = tf.add(tf.matmul(X,W1),b1) # h = W*X + b
L1 = tf.nn.relu(L1) #활성화 함수

model =tf.add(tf.matmul(L1,W2),b2)

#비용함수, model을 softmax로 활성화
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y,logits=model))

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

지금까지 신경망 모델을 만들어보았으니, 이제 train을 해볼 차례이다.

#세션 초기화
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for step in range(100):
    sess.run(train_op, feed_dict = {X : x_data, Y: y_data})
    
    if(step + 1)%10 == 0:
        print(step + 1, sess.run(cost, feed_dict={X : x_data, Y : y_data}))
        

.
.
.
.
.
#결과
10 0.8056719
20 0.62943
30 0.49681878
40 0.3970381
50 0.32101646
60 0.26009843
70 0.21078207
80 0.17097372
90 0.13904795
100 0.113528706

모델을 훈련하는 과정까지 지금 알아보았다. 이제 훈련 데이터 셋이 아닌, 다른 데이터 셋에 어떻게

예측을 하는지 확인해보자.

prediction = tf.argmax(model, 1)
target = tf.argmax(Y, 1)
print("예측값:", sess.run(prediction, feed_dict={X : x_data}))
print("실제값:", sess.run(target, feed_dict={Y : y_data}))

is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도:%.2f' % sess.run(accuracy *100, feed_dict={X : x_data, Y : y_data}))

#결과
예측값: [0 1 2 0 0 2]
실제값: [0 1 2 0 0 2]
정확도:100.00

이전에 은닉층이 없던 모델에서는 16% 였던것이 100%로를 나타내고 있다.

Hidden layer가 있고 없고의 차이가 매우 크다는 것을 알 수 있었던 시간이였다.

728x90
반응형

'Tensorflow' 카테고리의 다른 글

TensorFlow 01. 사용법 알아보기  (0) 2019.12.03
5. Mnist 예제  (0) 2019.07.18
3. 신경망 구현  (0) 2019.07.16
2. 선형회귀 구현  (0) 2019.07.16
1. 텐서플로우의 기초 및 변수  (0) 2019.07.16
Comments