일단 Data를 보고 가자.
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0],[0],[0],[1],[1],[1]]
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
x_data는 x1, x2순서로 주어진 data이고 y는 0 또는 1로 주어진 데이터이다. x_data는 딥러닝을 공부한 시간이라 하고 y_data 중 0을 fail 1을 pass라고 하는 것이다. 이렇게 나누면 binary classification이 되는 것이다. feed_dict를 사용하기 위해 placeholder로 구현하였는데, shape에 조심해야 한다. x_data는 두 개씩 주어지므로 전체 개수는 몇 개를 줄지 모르기 때문에 [None,2]로 하고 y_data도 마찬가지로 1개이고 몇 개를 줄지 모르기 때문에 [None,1]이라고 한다.
W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))
이렇게 x와y의 data를 만들었고 그런 다음에 w와 x를 곱한 것에 b를 더한 것을 sigmoid에 집어넣기 위해 matrix연산을 할 것이다. w의 값을 얻는 것은 상당히 간단하다. x가 2개 이고 y는 1개이므로 W = tf.Variable(tf.random_normal([2, 1]), name='weight')가 된다. 들어올때 2개 나갈 때 1개이다. 그리고 b는 항상 나가는 값이므로 1이 된다. hypothesis는 tf를 사용하여 아주 간단하게 구현하였다. 그런 다음에 hypothesis를 이용해 Cost를 구할 것이다. 전 시간에 공부했던 것을 사용하여 간단하게 식을 구현해주면 된다. 잘 모르겠으면 아래 식을 참고하여 구현해보자.

이제 미분을 해야하는데 tf에는 미분을 대신해주는 gradientdescentoptimizer이라는 것을 사용한다. 그러면 train이 알아서 계산을 해주게 된다. 이제 예측한 값을 0과 1로 나타내어야 한다. hypothesis의 값을 0.8이나 0.1 같은 수로 예측된다. 그러면 0.5 초과 이면 1로 아니면 0으로 나타내어준다. 1이면 pass이고 0이면 fail이 된다. 그리고 tf.float32로 cast을 하면 true나 false로 값이 나오게 된다. True면 1이고 False면 0이다. 그다음엔 우리의 값이 얼마나 정확한지 판단하기 위해 원래 Y의 값이 똑같은지 T나 F로 나오게 된다. 그러면 1과 0의 전체 값을 평균을 내면 되는 것이다. 예로 10번 해서 1이 5번 나오면 50%인 것이다.
# Launch graph
with tf.Session() as sess:
# Initialize TensorFlow variables
sess.run(tf.global_variables_initializer())
for step in range(10001):
cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
if step % 200 == 0:
print(step, cost_val)
# Accuracy report
h, c, a = sess.run([hypothesis, predicted, accuracy],
feed_dict={X: x_data, Y: y_data})
print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)
학습하는 과정은 이전과 동일하게 세션을 만들고 초기화 해주고 루프를 돌면서 학습을 한다. feed_dict로 data를 던져주고 200번마다 한 번씩 스텝과 Cost값을 출력해본다. 그리고 학습된 모델을 가지고 hypothesis와 predicted를 가지고 Y와 비교해서 Accuracy가 얼마나 나올까 출력해보는 것이다.
#step cost
0 1.73078 200 0.571512 400 0.507414
...
9800 0.151778 10000 0.149496
hypothesis:
[[0.03074029] [0.15884677] [0.30486736]
[0.78138196] [0.93957496] [0.98016882]]
Correct(y):
[[0.] [0.] [0.] [1.] [1.] [1.]]
Accuracy:1.0
cost는 대략 1.7에서 시작해서 10000번을 학습하면서 굉장히 작은값으로 떨어지고 hypothesis를 보면 위 3가지 값은 0.5보다 작으므로 0이 되고 아래 3가지 값은 0.5보다 크므로 1이 된다. 그러면 실제 데이터인 y와 비교를 해보면 전부다 예측한 것이 된다. 그러므로 Accuracy는 1.0이 된다.
'머신러닝 > 모두를 위한 딥러닝' 카테고리의 다른 글
Softmax Regression (0) | 2019.05.27 |
---|---|
Logistic Regression의 cost 함수 설명 (0) | 2019.05.21 |
Logistic Classification의 가설 함수 정의 (0) | 2019.05.19 |
TensorFlow로 파일에서 data읽어오기 (0) | 2019.05.18 |
multi-variable linear regression을 TensorFlow에서 구현하기 (0) | 2019.05.16 |