rueki

3. 신경망 구현 본문

Tensorflow

3. 신경망 구현

륵기 2019. 7. 16. 12:10
728x90
반응형

털과 날개가 있는지 없는지에 따라, 포유류인지 조류인지 분류하는 신경망 모델을 만들어보자

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]
])

실제로 데이터를 적용시킬 때는 one-hot 인코딩을 해주어야한다. 지금은 인위적으로 one-hot 형태로 만들었다.

classification에서 많이 사용되는 기법이기 때문에 기억해두자

 

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

이번 모델에서는 입력이 2개( 특성이 2개) -> 출력 3개( 기타, 포유류, 조류) 로 인해

가중치 설정을 [2, 3]으로 하겠다.

#입력 2(특성), 출력 3(레이블) -> 2차원으로
W = tf.Variable(tf.random_uniform([2,3],-1.,1.))
b = tf.Variable(tf.zeros([3])) # 각 레이어의 아웃풋 개수로 설정

가중치와 편향을 정했으니 신경망의 Layer를 구현해보자

보통 Layer에 대해서 가설을 바탕으로 활성화를 하는데, 활성화 함수로 Relu 함수를 쓰는게 일반적이다.

활성화한 값에 대해서 뉴런의 출력 값을 정규화하기 위해 Softmax를 사용한다.

 

Softmax(소프트맥스)는 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력 값들의 총합은 항상 1이 되는 특성을 가진 함수이다.

 

L = tf.add(tf.matmul(X, W), b)
L = tf.nn.relu(L) #활성화함수 relu 사용
# softmax 함수는 다음처럼 결과값을 전체합이 1인 확률로 만들어주는 함수
model = tf.nn.softmax(L)

신경망에서 최적의 매개변수를 구하는 지표는 손실함수가 최소값이 될 때이다.

손실함수로 보통 cross-entropy를 사용하는 것이 일반적이다.

 

cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(model), axis=1)) #cross-entropy 사용
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)

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 1.0754195
20 1.0687649
30 1.0622092
40 1.0558904
50 1.0496674
60 1.0435673
70 1.0376261
80 1.0318366
90 1.0261918
100 1.0206093

모델을 훈련했으니, 이제 실제 데이터를 통해서 얼마나 정확한 지 확인을 할 차례이다.

argmax함수를 통해서 최대값만을 뽑아내서 그 값을 비교하도록 하자.

prediction = tf.argmax(model, 1)
target = tf.argmax(Y, 1)
# 0: 기타 1: 포유류, 2: 조류
print("예측값:", sess.run(prediction, feed_dict={X:x_data}))
print("실제값:", sess.run(target, feed_dict={Y:y_data}))


예측값: [2 2 2 2 2 1]
실제값: [0 1 2 0 0 2]

예측값과 실제값을 보았을 때, 정확히 일치한 값이 1개밖에 보이지 않는다.

정확도를 확인해보자.

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

정확도: 16.67

정확도가 상당히 안 좋은 모델인 것으로 나왔다....

728x90
반응형

'Tensorflow' 카테고리의 다른 글

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