티스토리 뷰

1. Softmax function


XW 의 식을 tf.matmul(X,W)+b 의 식으로 간단하게 Tensorflow로 나타낼 수 있고 , Softmax를 구하기 위해서는 tf.nn.softmax(tf.matmul(X,W)+b)로 나타낼 수 있다.




2. Cost Function

Cost값을 구할때는 reduce_mean을 사용하여 평균값을 구한후, 위의 식대로 간단하게 표현이 가능하다. 

이렇게 구한 cost값을 사용하여 경사의 Minimize값을 구하게 될것인데, 이때 GradientDescentOptimizer를 사용하여 최소값을 구하게 될 수 있다. 여기서 Step의 하나하나의 a 값은 변동값을 업데이트를 하기위함이다.


3. 실습하기

Data value is onehot expression. 



설명 :

1) x_data , y_data를 정의 해준다. X-data 4개의 shape , y-data 3개의 레이블 shape의 값을 가지게된다.

2) X,Y의 노드를 생성하는데, 이때 주의해야할것이, shape값에 따라 노드를 생성을 한다는것이다.

3) nb_classes = 3 을 정의하는데, 이것은 클래스의 개수를 의미한다.

4) w, b 를 Variable 함수를 이용하여 구한다. 그 이후에 hypothesis를 softmax함수의 matmul로 간단히 구할 수 있다. softmax함수는 클래스의 합을 = 1 로 만들게 해준다.

5) 이렇게 구해진 hypothesis를 이용하여 평균을 구하게 되는데, cost function의 식에따라 대입을 하여 구하게 한다.

6) 이제 경사면의 cost값을 구하기 위해서 GradientDescentOptimizer 클래스를 이용하여 최소값을 구해준다.

7) with 키워드를 이용하여 context 가 돌면서 세션을 생성한후, sess을 run하게 된다.

8) 2001 범위까지 step이 계속 실행 되어지는데, step이 되어진다는것은 경사면을 내려가면서 최소값을 구하기 위한 하나의 학습과정이라고 생각하면 된다. 최적의 조건을 만들기위한, 그러면서 sess이 run되는동안 

feed_dict에서 x_data,y_data를 던져주게 되면서 학습을 하게 된다. 그 이후 step이 200번에 한번씩 그 값을 출력시키는 코드이다.

4. Test & One-hot encoding 


softmax를 이용하여 3개의 클래스의 값의 합을 1로 분리한뒤, arg_max를 사용하여 세개의 클래스중에서 가장 나은 최강자를 구해줄 수 있다. 이것의 반환값은 가장 높은값을 돌려주게 된다.

그리고 원하는 soft max 값을 우리가 원하는 lable 로 바꾸기 위해서는 softmax()함수를 사용할 수 있다.




5. 최종 코드


import tensorflow as tf
tf.set_random_seed(777) # for reproducibility

x_data = [[1, 2, 1, 1],
[2, 1, 3, 2],
[3, 1, 3, 4],
[4, 1, 5, 5],
[1, 7, 5, 5],
[1, 2, 5, 6],
[1, 6, 6, 6],
[1, 7, 7, 7]]
y_data = [[0, 0, 1],
[0, 0, 1],
[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0],
[1, 0, 0],
[1, 0, 0]]

X = tf.placeholder("float", [None, 4])
Y = tf.placeholder("float", [None, 3])
nb_classes = 3

W = tf.Variable(tf.random_normal([4, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')

# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())

for step in range(2001):
sess.run(optimizer, feed_dict={X: x_data, Y: y_data})
if step % 200 == 0:
print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}))

print('--------------')

# Testing & One-hot encoding
a = sess.run(hypothesis, feed_dict={X: [[1, 11, 7, 9]]})
print(a, sess.run(tf.argmax(a, 1)))

print('--------------')

b = sess.run(hypothesis, feed_dict={X: [[1, 3, 4, 3]]})
print(b, sess.run(tf.argmax(b, 1)))

print('--------------')

c = sess.run(hypothesis, feed_dict={X: [[1, 1, 0, 1]]})
print(c, sess.run(tf.argmax(c, 1)))

print('--------------')

all = sess.run(hypothesis, feed_dict={
X: [[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]})
print(all, sess.run(tf.argmax(all, 1)))


6. 결과


(0, 5.048624)
(200, 0.5484252)
(400, 0.43214852)
(600, 0.3524663)
(800, 0.2768294)
(1000, 0.23268294)
(1200, 0.21055308)
(1400, 0.19221492)
(1600, 0.17675184)
(1800, 0.16353412)
(2000, 0.15210836)
--------------
(array([[1.3890432e-03, 9.9860197e-01, 9.0612402e-06]], dtype=float32), array([1]))
--------------
(array([[0.93119204, 0.06290206, 0.00590588]], dtype=float32), array([0]))
--------------
(array([[1.2732767e-08, 3.3411323e-04, 9.9966586e-01]], dtype=float32), array([2]))
--------------
(array([[1.3890432e-03, 9.9860197e-01, 9.0612402e-06],
       [9.3119204e-01, 6.2902056e-02, 5.9058843e-03],
       [1.2732767e-08, 3.3411323e-04, 9.9966586e-01]], dtype=float32), array([1, 0, 2]))



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함