NeuroWhAI의 잡블로그

[TensorFlow] 간단한 분류 모델 - 심층 신경망 본문

개발 및 공부/라이브러리&프레임워크

[TensorFlow] 간단한 분류 모델 - 심층 신경망

NeuroWhAI 2018. 1. 10. 19:53


저번에 http://neurowhai.tistory.com/80 여기에서 간단한 분류 모델이라고 올렸었는데
이건 단층 신경망이라 제대로 학습이 안됬었습니다.
그래서 책의 다음 챕터에서 심층 신경망으로 변경하는데요.
따라 해봤습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tensorflow as tf
import numpy as np
 
# [털, 날개]
x_data = np.array(
    [[00], [10], [11], [00], [00], [01]]
)
 
y_data = np.array([
    [100], # 기타
    [010], # 포유류
    [001], # 조류
    [100],
    [100],
    [001],
])
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
W1 = tf.Variable(tf.random_uniform([210], -1.01.0))
b1 = tf.Variable(tf.zeros([10]))
 
W2 = tf.Variable(tf.random_uniform([103], -1.01.0))
b2 = tf.Variable(tf.zeros([3]))
 
L1 = tf.add(tf.matmul(X, W1), b1)
L1 = tf.nn.relu(L1)
 
model = tf.add(tf.matmul(L1, W2), b2)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
    labels=Y, logits=model
))
 
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)
 
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
 
    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}))
 
    prediction = tf.argmax(model, axis=1)
    target = tf.argmax(Y, axis=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}))
 
    
 
cs


달라진것만 적어보겠습니다.
먼저 W, b 이 한 레이어만 있었던 이전과 다르게 W1, b1과 W2, b2로 두개의 레이어가 생겼습니다.
W1, b1를 히든 레이어라고 하죠!
또한 히든 레이어의 출력은 10개로서 그 레이어의 뉴런이 10개라는걸 말합니다.
이렇게 많이 필요한진 모르겠는데 하이퍼 파라미터?라서 경험적으로 설정해줘야 한다는군요.

그리고 당연히 출력 계산식도 바뀌었습니다.
히든 레이어의 값을 먼저 계산한뒤 relu를 지나서 출력 레이어로 다시 먹입니다.
그리고 출력 레이어의 값을 계산한뒤 relu를... 먹이지 않았습니다.
책에서 출력 레이어엔 활성화 함수를 잘 안쓴다고 하네요. (물론 이것도 경험적으로 결정해야 합니다)

비용 함수로는 이전과 똑같이 크로스 엔트로피를 사용했는데
직접 구현하지 않고 텐서플로에 있는걸 가져다가 썼습니다.
하긴 없을리가 없져.
labels가 목표값, logits이 실제 출력값 입니다.
logits는 통계학 용어인것 같은데 변수의 확률들이라고 보면 될것같습니다.
그러니까 여기서는 기타 또는 포유류 또는 조류일 확률들 데이터라는 거죠.

최적화 함수로 AdamOptimizer를 사용했는데 경사 하강법보다 보편적으로 좋다고 합니다.

변경된 것은 이게 끝!

실행 결과 입니다.


정확도 100%를 찍었네요.




Comments