코딩이것저것

CNN_Softmax classifier

황TL 2017. 8. 4. 22:37


multinomial 은 logistic을 여러번 하는것과 같다.

위 그래프를 맨왼쪽부터 1번이라고 하자

1) C이면 1 아니면 0(A 또는 B)

2) B이면 1 아니면 0(A 또는 C)
3) A이면 1 아니면 0(B 또는 C)




multinomial을 구현하기 위하여 logistic에서 구현했던 방법과는 다르게 행렬의 형태가 필요하다

위는 그 형태를 보여주는 전개도이다.






softmax에 대한 내용이다.


Y에 대한 값을 확률로 나타내는 함수이다.

위 그림에서 Y=[[2.0],[1,0],[0.1]] 값을 갖는다.

이때 각각의 값이 나올 확률을 계산했을때 0.7, 0.2, 0.1이 나온다고 소개된다.

따라서 Y값이 나올 확률을 계산하는것이 softmax의 기능이라고 볼 수 있다.







Y 값 -> Y 값이 나올 확률 -> argmax를 이용한 최대값 선별


위 과정을 통하여 각각의 변수에서 예측값이 가장 큰 Y값을 출력할 수 있다.


# Lab 6 Softmax Classifier

import tensorflow as tf

tf.set_random_seed(777)  # for reproducibility

#8행 4열의 data set


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노드와 Y노드 정의. 행은 어느값이든 상관없다, X노드는 4열 Y노드는 3열의 형태를 알려줌

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

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

nb_classes = 3


#X노드가 (8x4)의 행렬이다. Y값의 출력을 (None x 3) 의 형태로 하기 위해서는 W는 (4x3)의 형태가 되어야 한다

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)

#위에서 배운 softmax함수를 구현하기 위한 코드

hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)


# Cross entropy cost/loss

#logistic regression과 비슷하게 cost함수가 복잡하게 만들어져있다.

cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))


#경사하강법을 이용한 비용함수 최소화, 학습비율은 0.1

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


# Launch graph

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())


#노드에 X,Y데이터 삽입.

#step, cost출력

    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

#X 노드에 [1,11,7,9]를 넣었을때 나오는 Y값(hypothesis) = a

#a는 softmax에 의하여 3개의 변수가 확률로 나온다.

#각각 확률은 arg_max에 의해 0,1,2로 변환된다. 

#가장 큰값부터 순서대로 2,1,0으로 분류되어진다.

    a = sess.run(hypothesis, feed_dict={X: [[1, 11, 7, 9]]})

    print(a, sess.run(tf.arg_max(a, 1)))


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


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

    print(b, sess.run(tf.arg_max(b, 1)))


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


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

    print(c, sess.run(tf.arg_max(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.arg_max(all, 1)))