When will you grow up?

Tensorflow로 Logistic(Binary) Classification 구현하기 본문

02. Study/Tensorflow

Tensorflow로 Logistic(Binary) Classification 구현하기

미카이 2017. 1. 24. 16:32

김성훈 교수님께 감사의 말씀드림니다.


모두를 위한 머신러닝/딥러닝 강의 를 토대로 만들어 졌습니다.


문제가 되거나, 저작권 위반이 된다면 

댓글이나 메일로 문의 주시면 삭제 하겠습니다.



Logistic(Binary) Classification?


->이전 블로그 포스팅에서는 Linear Regression는 좌표상 위치한 데이터를 이어주는 직선을 그어 데이터 위치를 예측하는 모델이였는데 

Logistic Classification은 분류 중에서 가장 단순한 모델 2가지 중 하나를 찾는 모델이다.



Logistic(Binary) Classification Hypothesis?


->수학자들이 0~1사이로 표현되는 것을 찾다가 sigmoid함수를 발견하게 된다.


Sigmoid 그래프 생김새



Hypothesis


              


e는 자연상수 / W는 weight (상황에 따라 전치를 해야될 경우와 안해도 될 경우가 있다.) / X 는 실제 데이터 x_data 값

1
2
3
4
#python ex)
= tf.matmul(W, X)
hypothesis = tf.div(1.1. + tf.exp(-h)) 
#표현 되는데,h가 가설이고 tf.div(1.1. + tf.exp(-h))를 sigmoid 함수로 생각하시면 좋을 듯 싶다.
cs


Logistic(Binary) Classification Cost function


맨 아래와 같이 하나의 수식으로 표현될수 있는데 

y데이터가 1이면 뒤에가 사라지게 되며

y데이터가 0이면 앞의 사라지게 된다.






현코

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import tensorflow as tf
import numpy as np
 
# train.txt
# #x0 x1 x2 y
# ex) 
# x1를 수업에 참여한 횟수 x2를 공부한 시간
# y값이 1이면 합격 0이면 불합격 이라고 가정한다.  
# 1   2   1   0
# 1   3   2   0
# 1   3   5   0
# 1   5   5   1
# 1   7   5   1
# 1   2   5   1
 
# 원본 파일은 6행 4열이였다, 하지만 numpy 형식 텍스트 읽는것은 열 우선이라서 4행 6열로 가지고 왔다.
xy = np.loadtxt('train.txt', unpack=True, dtype='float32')
 
# print(xy[0], xy[-1])        # [ 1.  1.  1.  1.  1.  1.] [ 0.  0.  0.  1.  1.  1.]
 
x_data = xy[:-1]            # [1. 1. 1. 1. 1. 1.] [2. 3. 3. 5. 7. 2.] [1. 2. 5. 5. 5. 5.]
y_data = xy[-1]             # [ 0.  0.  0.  1.  1.  1.]
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# 1행 * 3열 W를 만들고 각 요소를 -1.0~1.0 사이값으로 초기화
= tf.Variable(tf.random_uniform([1len(x_data)], -1.01.0))
 
# 행렬 곱셈. W = (1*3) *  X = (3*6)   ->h = 1행*6열 나온 값의 합
#exp()함수는 e 즉, 실수값만 전달하며,  자연상수(a) 안에 e의 a승이 도니다.
= tf.matmul(W, X)
hypothesis = tf.div(1.1. + tf.exp(-h))    
 
#cost function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
 
#cost값 최소화 하기
rate = tf.Variable(0.1)
optimizer = tf.train.GradientDescentOptimizer(rate)
train = optimizer.minimize(cost)
 
#초기화를 시켜주는 구문 ->텐서플로우 구동하기 전에 그래프에 연결된 모든 변수를 초기화 해야한다.
init = tf.initialize_all_variables()
 
= tf.exp(1.0)
= tf.log(10.0)
 
#세션 실행
sess = tf.Session()
sess.run(init)
 
 
# 파이썬 3.x버전부터는 xrange 가 range로 통합되므로써 range를 사용
# 0부터 2000까지 2001번 반복되는 반복문 
# 너무 많은 출력을 피하기 위해서 step별로 계속 진행되다가 20번에 한번씩 출력
for step in range(2001):
    sess.run(train, feed_dict={X: x_data, Y: y_data})
    if step % 20 == 0:
        print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))
 
print('*'*50)
 
# 결과값이 0또는 1로 딱 떨어지는 것이 아니므로, True /False는 기준치 0.5로 판단하게 된다.
#3번 수업 참여하고 2시간 공부했을 가정 ->불합격
print('[1, 3, 2] :', sess.run(hypothesis, feed_dict={X: [[1], [2], [2]]}) > 0.5)
#5번 수업 참여하고 1시간 공부했을 가정 ->불합격
print('[1, 5, 1] :', sess.run(hypothesis, feed_dict={X: [[1], [5], [1]]}) > 0.5)
#7번 수업 참여하고 3시간 공부했을 가정 ->합격
print('[1, 7, 3] :', sess.run(hypothesis, feed_dict={X: [[1], [7], [3]]}) > 0.5)
 
#x_data 값
print('x_data 값 :',x_data)
#y_data값
print('y_data 값 :',y_data)
sess.close()
 
 
cs





결과




Comments