일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- double ended queue
- getline
- string 메소드
- Django Nodejs 차이점
- vscode
- c++
- 백준
- Django의 편의성
- 구조체와 클래스의 공통점 및 차이점
- k-eta
- 입출력 패턴
- 장고란
- correlation coefficient
- 프레임워크와 라이브러리의 차이
- 시간복잡도
- 매크로
- 자료구조
- 표준 입출력
- UI한글변경
- 입/출력
- EOF
- scanf
- 2557
- 이분그래프
- 엑셀
- 연결요소
- string 함수
- 알고리즘 공부방법
- iOS14
- Django란
- Today
- Total
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)