관리 메뉴

Storage Gonie

모두를 위한 딥러닝 제7강 ML lab 03 - Linear Regression 의 cost 최소화의 TensorFlow 구현 (new) 본문

데이터 사이언스/모두를 위한 딥러닝

모두를 위한 딥러닝 제7강 ML lab 03 - Linear Regression 의 cost 최소화의 TensorFlow 구현 (new)

Storage Gonie 2018. 9. 6. 15:34
반응형

※ 아래의 모든 예제는 bias를 제거한 심플한 hypothesis 에 대해서 구현한 것이다.


# -3~+5구간에서 W값을 차례대로 주어 cost를 출력해보는 예제

import tensorflow as tf
import matplotlib.pyplot as plt

# 훈련데이터
X = [1, 2, 3]
Y = [1, 2, 3]

# 변수노드 선언
W = tf.placeholder(tf.float32)

# bias가 없는 심플한 hypothesis 노드 선언
hypothesis = X * W

# cost/loss function 노드 선언
cost = tf.reduce_mean(tf.square(hypothesis - Y))

sess = tf.Session()
# 위에서 tf.placeholder 또는 tf.Variable을 사용했으므로 이것 먼저 실행
sess.run(tf.global_variables_initializer())

# 아래서 그래프 그릴 때 W가 x축 cost가 y축으로 사용됨
W_val = [ ]
cost_val = [ ]

# W값을 변경시켜줘가며 cost값을 확인함
for i in range(-30, 50):
feed_W = i * 0.1 # -3, -2.9, ... 4.9, 5.0
curr_cost, curr_W = sess.run([cost, W], feed_dict={W: feed_W})
W_val.append(curr_W)
cost_val.append(curr_cost)

plt.plot(W_val, cost_val)
plt.show()


# Cost를 줄여주는 W를 찾는 수동적인 코드

import tensorflow as tf

# 훈련데이터
x_data = [1, 2, 3]
y_data = [1, 2, 3]

# 랜덤한 숫자로 초기화된 W 변수노드 선언
W = tf.Variable(tf.random_normal([1]), name='weight')

# 이 X, Y를 통해 훈련데이터를 공급할 예정
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# bias가 없는 심플한 hypothesis 노드 선언
hypothesis = X * W

# cost/loss function 노드 선언
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Gradient descent 방식을 이용한 W갱신 연산노드 선언
# 텐서플로우는 연산을 노드로 표현하기 때문에 바로 할당을 할 수 없다. 따라서, 갱신된 W를 다시 W에 할당하려면 .assign()을 사용해줘야 한다.
# 아래의 코드인 W.assign(descent) 는 descent노드의 연산결과 값을 W에 할당한다는 의미이다.
learning_rate = 0.1
gradient = tf.reduce_mean((W * X -Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent)

sess = tf.Session()

# 위에서 tf.placeholder 또는 tf.Variable을 사용했으므로 이것 먼저 실행
sess.run(tf.global_variables_initializer())

# W 갱신 21번 반복
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))

# Cost를 줄여주는 W를 찾는 자동적인 코드

import tensorflow as tf

# 훈련데이터
X = [1, 2, 3]
Y = [1, 2, 3]

# 임의의 숫자로 초기화된 W 변수노드 선언
W = tf.Variable(5.0)

# bias가 없는 심플한 hypothesis 노드 선언
hypothesis = X * W

# cost/loss function 노드 선언
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Gradient descent 방식을 이용한 W갱신 연산 노드
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train = optimizer.minimize(cost)

sess = tf.Session()
# 위에서 tf.placeholder 또는 tf.Variable을 사용했으므로 이것 먼저 실행
sess.run(tf.global_variables_initializer())

# W 갱신(훈련) 100번 반복
for step in range(100):
print(step, sess.run(W))
sess.run(train)

# W갱신에 사용되는 Gradient를 사용자가 임의로 조작을 하고 싶을 때 할 수 있는 방법(Optional)

- optimizer를 선언하는 라인까지는 바로 위의 코드와 동일하다.

import tensorflow as tf

# 훈련데이터
X = [1, 2, 3]
Y = [1, 2, 3]

# 랜덤한 숫자로 초기화된 W 변수노드 선언
W = tf.Variable(5.)

# bias가 없는 심플한 hypothesis 노드 선언
hypothesis = X * W

# gradient 노드 선언(cost function을 미분한 것)
gradient = tf.reduce_mean((W * X - Y) * X) * 2

# cost/loss function 노드 선언
cost = tf.reduce_mean(tf.square(hypothesis - Y))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

# 여기서 train = optimizer.minimize(cost) 대신 아래와 같이 2줄로 써주면 W갱신에 사용되는 기울기 값을 사용자가 조작할 수 있음
# cost function에서 현재의 W에서의 기울기를 연산해주는 노드(위의 gradient의 결과값과 동일함)
gvs = optimizer.compute_gradients(cost)

# 현재 기울기를 이용해 W를 갱신하는 노드 => 여기서 작업을 해주면 W갱신에 사용되는 기울기 값을 임의로 조절할 수 있음
apply_gradients = optimizer.apply_gradients(gvs)

sess = tf.Session()
# 위에서 tf.placeholder 또는 tf.Variable을 사용했으므로 이것 먼저 실행
sess.run(tf.global_variables_initializer())

# W 갱신(훈련) 100번 반복
for step in range(100):
print(step, sess.run([gradient, W, gvs]))
sess.run(apply_gradients)

그림참고: https://youtu.be/Y0EF9VqRuEA

반응형
Comments