728x90
반응형
모두를 위한 딥러닝 강좌 시즌 1
by Sung Kim, 김성훈 교수님
링크
https://www.youtube.com/watch?v=Hax03rCn3UI&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=4
https://www.youtube.com/watch?v=mQGwjrStQgg&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=5
02. Linear Regression
※ 회귀문제 예시 : 공부시간에 따른 시험 성적 예측
(Linear) Hypothesis
선형 회귀 모델은 선형 가정을 기반으로 결과값을 추론한다.
선형 가정 : 'x값에 따라 y값이 결정된다'는 관계를 선으로 나타낼 수 있다는 가정
선형모델 : H(x) = Wx + b
데이터를 가장 잘 설명하는 H(x)는?
실제 데이터와 가설로 설정한 H(x)와의 오차를 측정 : cost function, loss function
Cost function : H(x) - y
$$
cost = \frac{1}{m}\sum_{i=1}^{m}(H(x^{i})-y^{i})^2
$$
선형모델의 학습은 오차(cost function)을 최소화 하는 W와 b를 구하는 것
$$
minimizecost(W, b)
$$
02. TensorFlow로 간단한 linear regression 구현
Tensorflow 작동원리
1) 변수 x, y의 선언을 통한 방법
선형 함수 정의
# Lab 2 Linear Regression
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
# X and Y data
x_train = [1, 2, 3]
y_train = [1, 2, 3]
# Try to find values for W and b to compute y_data = x_data * W + b
# We know that W should be 1 and b should be 0
# But let TensorFlow figure it out
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.random_normal([1]), name="bias")
# tf가 인식할 변수를 지정
# 랜덤 변수 1개를 1차원 array에 할당
# Our hypothesis XW+b
hypothesis = x_train * W + b
$$
H(x) = Wx+b
$$
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
# reduce_mean으로 평균을 구함
$$
cost = \frac{1}{m}\sum_{i=1}^{m}(H(x^{i})-y^{i})^2
$$
GradientDescent (경사하강법) 적용
- 함수의 최적값(오차의 최소값)을 찾기 위해 optimizer로 사용되는 방법 중 하나
- 손실함수의 기울기 변화를 통해 손실함수를 줄이는 방법
# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost) # cost를 minimize 함
그래프 구현을 위한 과정
# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
# tf의 변수(위에서 지정한 W, b)를 사용하기 위해서는 반드시global_variables_initializer()를 실행시켜야 함
# Fit the line
for step in range(2001): # 2000번 정도 스텝을 돌려볼 예정
sess.run(train)
if step % 20 == 0: # 잘 진행되는 지 확인하기 위해, 매 20번마다 결과값을 출력
print(step, sess.run(cost), sess.run(W), sess.run(b))
# 결과값
# Learns best fit W:[ 1.], b:[ 0.]
"""
0 2.82329 [ 2.12867713] [-0.85235667]
20 0.190351 [ 1.53392804] [-1.05059612]
40 0.151357 [ 1.45725465] [-1.02391243]
...
1960 1.46397e-05 [ 1.004444] [-0.01010205]
1980 1.32962e-05 [ 1.00423515] [-0.00962736]
2000 1.20761e-05 [ 1.00403607] [-0.00917497]
"""
# 처음 시작할 때 cost가 크고 b가 작은 값임을 볼 수 있음
# 2000회 반복을 통해 W가 1에, b가 0에 수렴함을 볼 수 있다.
2) Placeholders를 사용한 방법
- Placeholders라는 변수 공간을 먼저 설정하고, feed__dict를 통해 학습 데이터를 입력
# Lab 2 Linear Regression
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
# 1) 방법과 달리, 아래 과정을 진행하지 않음
'''
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
'''
# Try to find values for W and b to compute Y = W * X + b
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.random_normal([1]), name="bias")
# placeholders for a tensor that will be always fed using feed_dict
# See http://stackoverflow.com/questions/36693740/
X = tf.placeholder(tf.float32, shape=[None]) # 변수 공간 설정
Y = tf.placeholder(tf.float32, shape=[None])
# Our hypothesis is X * W + b
hypothesis = X * W + b
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# optimizer
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# Launch the graph in a session.
with tf.Session() as sess:
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
# Fit the line
for step in range(2001):
_, cost_val, W_val, b_val = sess.run([train, cost, W, b], feed_dict={X: [1, 2, 3], Y: [1, 2, 3]})
if step % 20 == 0:
print(step, cost_val, W_val, b_val)
# feed_dict에 train data 값을 기입
# Testing our model
print(sess.run(hypothesis, feed_dict={X: [5]}))
print(sess.run(hypothesis, feed_dict={X: [2.5]}))
print(sess.run(hypothesis, feed_dict={X: [1.5, 3.5]}))
# Learns best fit W:[ 1.], b:[ 0]
"""
0 3.5240757 [2.2086694] [-0.8204183]
20 0.19749963 [1.5425726] [-1.0498911]
...
1980 1.3360998e-05 [1.0042454] [-0.00965055]
2000 1.21343355e-05 [1.0040458] [-0.00919707]
[5.0110054] # feed_dict={X: [5]}일 때 예측 값
[2.500915] # feed_dict={X: [2.5]}일 때 예측 값
[1.4968792 3.5049512] # feed_dict={X: [1.5, 3.5]}일 때 예측 값
"""
위 코드의 Tensorflow 작동구조를 표현한 이미지
'Machine Learning' 카테고리의 다른 글
[네이버 부스트코스] 모두를 위한 데이터 사이언스 (0) | 2022.01.03 |
---|---|
[모두를 위한 딥러닝] 01_Machine Learning Basics (0) | 2021.12.08 |