CNN_Softmax classifier
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)))