티스토리 뷰

[Weight의 의미]


Softmax Regression을 진행하기 전에 먼저 데이터는 어떤 set을 가지고 있는지, 어떤 의미를 가지는지 정리하는게 좋을 것 같습니다. Hypothesis는 여전히 XW + b로 사용됩니다.

[그림1] Hypothesis를 통해 값이 나오는 과정


X행렬과 Y행렬의 shape은 알고 있으면 W행렬의 shape을 정할 수 있고 그 과정은 굉장히 중요하다는 걸 알고 있습니다. 저 연산과정의 의미를 조금더 이해해보려고 합니다.

A, B, C 등급으로 N명의 학생들의 최종학점을 매기기 위해서 4종류의 데이터(출석, 과제, 중간고사 점수, 기말고사 점수)를 가져왔다고 가정합니다. 그리고 연산이 끝난 뒤에는 하나의 Instance(한명의 학생) 당 A, B, C의 등급이 매겨져야하죠. A = [1 0 0], B = [0 1 0], C = [0 0 1]로 정의합니다. 그렇다면 예측한 성적값의 행렬은 N x 3의 shape이 됩니다. (이렇게 정의되는건 One-Hot Encoding이 적용되어야 합니다. 그 전에는 Softmax를 취해주면 확률값으로 나오겠죠.)

우리는 출석, 과제, 중간고사 점수, 기말고사 점수의 파라미터가 학점에 얼만큼의 영향을 주는지 몰라도 기계학습을 통해서 학점을 예측할 수 있습니다. 그건 바로 Weight 행렬이 있기 때문이죠. 빨간색의 원을 보시죠. 첫번째 학생의 점수들이 나와있습니다. 그리고 Weight 행렬에 빨간색 원으로 표시된 Weight값들은 "A학점 여부를 판별할 수 있는 4개의 파라미터에 대한 비중(weight)"입니다. 말이 조금 어렵나요. 점수와 그 점수에 대한 비중을 연산하면 A학점일 확률이 나오는거죠. 그리고 학습을 통해 저 학생의 실제 학점이 A학점이 아니라면 확률이 점점 떨어지는 방향으로 weight값이 움직이게 됩니다. 나머지 학점도 동일합니다.

교수님이 정상이라면 모든 학점에 대해서 동일한 계산을 하겠죠. 퍼센테이지는 정해져있으니까요. 그렇다면 Weight행렬의 열(A, B, C 학점별 비중)은 모두 같은 값으로 나오겠군요. (교수님이 얼마나 정확하게 학점을 부여 하는지 기계를 통해서 신뢰하세요)


[동물 맞추기]


뉴비에게 머신러닝을 설명하는 가장 좋은 예시는 "기계가 동물의 종류를 맞출 수 있어!"입니다. 지금부터 그 일을 해보겠습니다. (이미지를 통해 구별하는 하는건 나중에 배우게 됩니다. 지금은 다리의 개수, 꼬리 여부, 뿔의 여부, 날개의 여부 등등의 데이터를 테이블로 정리해 놓은 csv파일로 진행해보겠습니다.)

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/data-04-zoo.csv



[그림2] 동물 데이터


[그림2]를 보면 친절하게 각 column이 어떤걸 의미하고 마지막 column이 동물의 종류라는 걸 알려줍니다.

그런데 문제는 Y가 One-Hot의 형태가 아니죠. 0~6으로 Indexing 되어 있습니다. 우리가 여태 알던 형태로 바꾸면 어떻게 될까요?



위처럼 7칸의 행렬 중에서 1로 켜져있는 부분이 해당하는 Index를 의미합니다.

이렇게 바꿔주는 방법은 간단합니다.

tf.one_hot(Y, class_num)

을 취해주면 됩니다.


import tensorflow as tf
import numpy as np

xy = np.loadtxt('data-04-zoo.csv', delimiter = ',', dtype = np.float32)

x_data = xy[:,0:-1]
y_data = xy[:,[-1]]

X = tf.placeholder(tf.float32, shape=[None, 16]) ## 행은 n개, 열은 16개의 Shape
Y = tf.placeholder(tf.int32, shape=[None, 1])
## one-hot encoding for Y
nb_classes = 7
Y_one_hot = tf.one_hot(Y, nb_classes)
Y_one_hot = tf.reshape(Y_one_hot, [-1, nb_classes]) ## one_hot 함수는 차원을 하나 더 만들기 때문에 reshape해준다.

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

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

## cost function
cost_i = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y_one_hot)
cost = tf.reduce_mean(cost_i)

## cost function을 개념대로 사용해도 무방하다.
## 하지만 불편하다.
#개념대로 사용 : cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1)

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

predicted = tf.argmax(hypothesis, 1) ## 가장 큰 값을 출력 (one-hot encoding 되어있기 때문에 1이 출력)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted,tf.argmax(Y_one_hot,1)), dtype = tf.float32))
## hypothesis와 Y가 같을 때를 뽑아서 평균을 내면 정확도를 확인할 수 있다.

## 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())

## 학습
for step in range(2000):
sess.run(train, feed_dict = {X:x_data, Y:y_data})
if step % 100 == 0:
loss, acc = sess.run([cost, accuracy], feed_dict={X:x_data, Y:y_data})
print(step, "cost:",loss,"ACCU:",acc)

## 예측하기
pred = sess.run(predicted, feed_dict = {X:x_data})
for p, y in zip(pred, y_data.flatten()):
print("[{}] Prediction : {} True Y: {}" .format(p== int(y), p, int(y)))
## flatten = 2차원 데이터를 평평하게 1차원으로 바꿈 (일반 데이터프레임 -> pandas series)




'Data Science > Machine Learning' 카테고리의 다른 글

MNIST Dataset  (0) 2018.11.16
Learning Rate  (0) 2018.11.16
Softmax Regression  (0) 2018.11.14
Logistic Regression으로 당뇨병환자 예측  (0) 2018.11.14
Logistic Regression  (0) 2018.11.09
댓글
최근에 올라온 글
«   2024/05   »
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
공지사항
최근에 달린 댓글