관리 메뉴

Storage Gonie

모두를 위한 딥러닝 제5강 ML lab 02 - TensorFlow로 간단한 linear regression을 구현 (new) 본문

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

모두를 위한 딥러닝 제5강 ML lab 02 - TensorFlow로 간단한 linear regression을 구현 (new)

Storage Gonie 2018. 9. 5. 16:57
반응형

※ ver1은 이해하는 용도로 보고 실제 구현은 ver2 방식으로 구현해야 한다.


# Linear regression 구현(1단계, Build graph using TF operations)_ver1


import tensorflow as tf

# X, Y 데이터준비
x_train = [1, 2, 3]
y_train = [1, 2, 3]

# Tensorflow Variable 노드 선언
# tf.Variable : 훈련시키는 과정에서 이 둘의 값을 텐서플로우가 자체적으로 값을 변경시킬 수 있는 Variable 형태로 선언.
# tf.random_normal은 초기값을 랜덤하게 초기화 해주는 방법
# tf.random_normal( )안에 있는 [ ]는 shape을 나타내는데 여기서는 rank가 1인 즉 1차원의 배열을 의미.
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='b')

# Hypothesis H(x) = XW + b 노드 선언
hypothesis = x_train * W + b

# Cost/Loss function 노드 선언
# tf.reduce_mean은 리스트에 들어있는 값의 평균값을 구해줌 cost = tf.reduce_mean(tf.square(hypothesis - y_train))

GradientDescent

# Train 노드 선언
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)


# Linear regression 구현(2, 3단계, Run/update graph and get results)_ver1

- train 노드를 실행하면 아래껏도 연달아 실행되는 구조를 가짐

# 그래프 실행을 위한 세션 생성
sess = tf.Session()

# 그래프에서 global variables 초기화
# Variable 변수인 W, b를 초기화 해주는 과정으로 Variable을 사용하려면 이 과정이 꼭 있어야 함
sess.run(tf.global_variables_initializer())

# 훈련진행
for step in range(2001):
sess.run(train)
if step % 20 == 0: # 20번 수행할 때 마다 노드의 값을 출력
print(step, sess.run(cost), sess.run(W), sess.run(b))



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


Linear regression 구현(1,2,3단계)_ver1

- 위 코드 통합본

import tensorflow as tf

# X, Y 데이터준비
x_train = [1, 2, 3]
y_train = [1, 2, 3]

# Tensorflow Variable 노드 선언
# tf.Variable : 훈련시키는 과정에서 이 둘의 값을 텐서플로우가 자체적으로 값을 변경시킬 수 있는 Variable 형태로 선언.
# tf.random_normal은 초기값을 랜덤하게 초기화 해주는 방법
# tf.random_normal( )안에 있는 [ ]는 shape을 나타내는데 여기서는 rank가 1인 즉 1차원의 배열을 의미.
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='b')

# Hypothesis H(x) = XW + b 노드 선언
hypothesis = x_train * W + b

# Cost/Loss function 노드 선언
# tf.reduce_mean은 리스트에 들어있는 값의 평균값을 구해줌
cost = tf.reduce_mean(tf.square(hypothesis - y_train))

# Train 노드 선언
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

# 그래프 실행을 위한 세션 생성
sess = tf.Session()

# 그래프에서 global variables 초기화
# Variable 변수인 W, b를 초기화 해주는 과정으로 Variable을 사용하려면 이 과정이 꼭 있어야 함
sess.run(tf.global_variables_initializer())

# 훈련진행
for step in range(2001):
sess.run(train)
if step % 20 == 0: # 20번 수행할 때 마다 노드의 값을 출력
print(step, sess.run(cost), sess.run(W), sess.run(b))


Linear regression 구현(1,2,3단계)_ver2

- 위의 x_train, y_train변수 대신 placeholder를 사용하여 실행중 feed_dict로 훈련데이터를 공급.

- 이렇게 해주면 모델을 미리 만들어 둔 상태에서 훈련데이터만 입력시켜주면 모델을 훈련시킬 수 있게된다.

import tensorflow as tf

# X, Y 훈련데이터를 넘겨줄 노드 준비
# placeholder는 상수로 고정된 것이 아니라 필요할 때 값을 변경하며 공급할 수 있는 노드
# Non은 개수가 상관이 없다는 것을 의미함
X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])

# Tensorflow Variable 노드 선언
# tf.Variable : 훈련시키는 과정에서 이 둘의 값을 텐서플로우가 자체적으로 값을 변경시킬 수 있는 Variable 형태로 선언.
# tf.random_normal은 초기값을 랜덤하게 초기화 해주는 방법
# tf.random_normal( )안에 있는 [ ]는 shape을 나타내는데 여기서는 rank가 1인 즉 1차원의 배열을 의미.
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='b')

# Hypothesis H(x) = XW + b 노드 선언
hypothesis = X * W + b

# Cost/Loss function 노드 선언
# tf.reduce_mean은 리스트에 들어있는 값의 평균값을 구해줌
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Train 노드 선언
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

# 그래프 실행을 위한 세션 생성
sess = tf.Session()

# 그래프에서 global variables 초기화
# Variable 변수인 W, b를 초기화 해주는 과정으로 Variable을 사용하려면 이 과정이 꼭 있어야 함
sess.run(tf.global_variables_initializer())

# 훈련진행
for step in range(2001):
#sess.run(cost), sess.run(W), sess.run(b), sess.run(train)가 동시에 실행되며 결과값을 왼쪽 변수로 할당해줌
cost_val, W_val, b_val, _ = \
sess.run([cost, W, b, train], feed_dict={X: [1, 2, 3, 4, 5], Y: [2.1, 3.1, 4.1, 5.1, 6.1]})
if step % 20 == 0: # 20번 수행할 때 마다 노드의 값을 출력
print(step, cost_val, W_val, b_val)

Linear regression 구현(마무리 단계)_ver2

- 모델을 훈련시킨 뒤 테스트 데이터로 모델이 결과값을 잘 주는지 확인한다.

print(sess.run(hypothesis, feed_dict={X: [5]}))
print(sess.run(hypothesis, feed_dict={X: [5, 3]}))


# 전체적인 그림

- 1. Hypothesis, Cost 노드 생성

- 2. feed_dict를 이용한 데이터 공급 및 그래프 실행

- 3. 최적의 W, b 값을 얻음

- 4. 테스트 데이터를 넣어서 결과값을 확인함

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


반응형
Comments