티스토리 뷰

모두를 위한 머신러닝 / 딥러닝 김성훈 교수님 강의를 듣고 정리한 내용입니다.

Lab 03 - linear regression의 cost 최소화의 tensorflow 구현  


@ 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.]


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함