티스토리 뷰
[딥러닝 기본 07] Lab 03 - linear regression의 cost 최소화의 tensorflow 구현
Nero :) 2017. 5. 30. 14:59모두를 위한 머신러닝 / 딥러닝 김성훈 교수님 강의를 듣고 정리한 내용입니다.
@ Simplified hypothesis : 간단한 설명을 위해 b를 생략
@ TensorFlow
- W와 cost(W)의 그래프 출력
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import matplotlib.pyplot as plt # 그래프 그리는 용도
# data set
X = [1, 2, 3]
Y = [1, 2, 3]
W = tf.placeholder(tf.float32)
# Hypothesis
hypothesis = X * W
# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# 세션 준비 및 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
W_val = []
cost_val = []
for i in range(-30, 50):
feed_W = i * 0.1
curr_cost, curr_W = sess.run([cost, W], feed_dict={W:feed_W})
W_val.append(curr_W)
cost_val.append(curr_cost)
# cost function 그래프 출력
plt.plot(W_val, cost_val)
plt.show()
- 결과 : W, cost(W) 그래프가 아래와 같이 convex function 형태로 gradient descent algorithm을 사용하기 적합함
@ Gradient descent algorithm을 이용한 학습
1) 직접 계산한 Gradient descent를 이용한 학습
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
# data set
x_data = [1, 2, 3]
y_data = [1, 2, 3]
W = tf.Variable(tf.random_normal([1]), name='weight')
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Hypothesis
hypothesis = X * W
# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize : 직접 미분하여 구한 Gradient Descent를 사용
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent) # node 중간에 variable 값을 할당 할 경우 assign() 사용
# 세션 준비 및 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for step in range(21):
sess.run(update, feed_dict={X:x_data, Y:y_data})
print(step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))
# 결과 : 20 1.44998e-11 [ 0.99999821] // cost가 0에 가깝고 W는 대략 1로 제대로 나옴
2) tensorflow에 있는 gradient descent를 이용하여 학습 (직접 미분을 계산할 필요 없음)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
# data set
x_data = [1, 2, 3]
y_data = [1, 2, 3]
W = tf.Variable(tf.random_normal([1]), name='weight')
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Hypothesis
hypothesis = X * W
# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize : tensorflow의 gradient descent 사용
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train = optimizer.minimize(cost)
# 세션 준비 및 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for step in range(21):
sess.run(train, feed_dict={X:x_data, Y:y_data})
print(step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))
# 결과 : 20 0.0 [ 1.] // 손으로 직접 계산한것과 같음
@ 번외: tf.train.GradientDescentOptimizer()의 gradients 커스터마이징
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
# data set
x_data = [1, 2, 3]
y_data = [1, 2, 3]
W = tf.Variable(tf.random_normal([1]), name='weight')
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Hypothesis
hypothesis = X * W
# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize : tensorflow의 gradient descent 사용
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
# gradient 값 받아오기
gvs = optimizer.compute_gradients(cost)
"""
이부분에서 gradient 값을 원하는 대로 customizing 가능
"""
# gradient 값 적용
apply_gradients = optimizer.apply_gradients(gvs)
train = optimizer.minimize(cost)
# 세션 준비 및 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for step in range(21):
sess.run(apply_gradients, feed_dict={X:x_data, Y:y_data})
print(step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))
# 결과 : 20 0.0 [ 1.]
'ML (Machine Learning)' 카테고리의 다른 글
[딥러닝 기본 09] Lab 04_1 - multi-variable linear regression을 tensorflow에서 구현하기 (0) | 2017.05.31 |
---|---|
[딥러닝 기본 08] Lec 04 - multi-variable linear regression (0) | 2017.05.30 |
[딥러닝 기본 06] Lec 03 - linear regression의 cost 최소화 알고리즘의 원리 설명 (0) | 2017.05.30 |
[딥러닝 기본 05] Lab 02 - tensorflow로 간단한 linear regression을 구현 (0) | 2017.05.30 |
[딥러닝 기본 04] Lec 02 - linear regression의 hypothesis 와 cost (0) | 2017.05.30 |