티스토리 뷰
[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 |
댓글
최근에 올라온 글
TAG
- neural network
- query string
- Queue
- Crawling
- DFS
- Machine Learning
- softmax
- 크롤러
- 크롤링
- LR
- 알고리즘
- Express
- Crawler
- 재귀
- Linear Regression
- 백준
- BFS
- 딥러닝
- logistic regression
- 머신러닝
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
공지사항
최근에 달린 댓글