안녕하세요.
오늘의 파이썬 코딩 독학 주제는 기다리고 기다리던 텐서플로우 예제 풀이입니다.
들어가기에 앞서
설치된 텐서플로우의 버전을 확인하도록 하겠습니다.
명령프롬프트를 열어서 아래와 같은 명령어를 입력하시면
텐서플로우의 버전을 확인하실 수 있습니다.
pip freeze
또한 아래와 같은 명령어를 입력하시면
원하는 버전으로의 변경작업이 진행됩니다.
tensorflow == 원하는 버전
형태로 입력하시면 됩니다.
pip install tensorflow==1.14
1. 전체 소스코드
import tensorflow as tf
x_data = [1,2,3]
y_data = [1,2,3]
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
X = tf.placeholder(tf.float32, name = "X")
Y = tf.placeholder(tf.float32, name = "Y")
hypothesis = W * X + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(77):
_, cost_val = sess.run([train_op, cost], feed_dict={X: x_data, Y: y_data})
print(step, cost_val, sess.run(W), sess.run(b))
print("------학습확인------")
print("X: 10\nY:", sess.run(hypothesis, feed_dict={X: 10}))
2. 소스코드의 목적
해당 소스코드는 텐서플로우를 이용하여
선형회귀 함수를 학습하는 예제입니다.
선형회귀 함수에 대한 설명은 아래 포스팅을 참조해주시면 됩니다.
2019/12/29 - [코딩/파이썬] - 비전공자의 코딩 독학 - 파이썬[12] 텐서플로우(3) <선형회귀>
학습이 끝나면 최적의 W, b값을 찾은 상태이므로
임의의 X 값을 입력하여도
알아서 최적의 Y값을 출력해냅니다.
3. 소스코드 설명
(1) 텐서플로우 라이브러리를 탑재합니다.
import tensorflow as tf
(2) 학습을 위한 X값과 Y값을 제공합니다.
x_data = [1,2,3]
y_data = [1,2,3]
(3) 임의의 W와 b값을 입력받습니다.
tf.Variable()함수를 통해서 변수를 입력받으며
tf.random_uniform()함수를 통해 -1부터 1 사이의 범위에서 난수값을 반환합니다.
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
(4) 플레이스 홀더 함수를 이용해 변수 X와 Y에 값을 입력받습니다.
X = tf.placeholder(tf.float32, name = "X")
Y = tf.placeholder(tf.float32, name = "Y")
(5) 선형회귀 함수의 수식을 작성합니다.
여기서 hypothesis는 [가설]이라는 의미입니다.
hypothesis = W * X + b
(6) 비용함수(Cost Function)를 작성합니다.
비용함수는 간단히 말해서 오차가 얼마나 큰가를 계산하는 함수입니다.
자세한 설명은 본문의 전반부에 올려둔 링크를 참조해주시면 됩니다.
cost = tf.reduce_mean(tf.square(hypothesis - Y))
손실값은 예측값에서 실제값을 빼준 후 제곱하여 구하며
비용(Cost)은 모든 데이터에 대한 손실값의 평균으로 구합니다.
이때 tf.square() 함수를 이용해 제곱값을 구하고,
tf.reduce_mean() 함수를 이용해 평균을 구합니다.
여기서 학습의 목적이 나오는데
결국 학습이란 비용을 최소로 하는 W와 b의 값을 구하는 과정을 뜻합니다.
(7) 최적화하기
최적화를 통해 손실값을 최소화하는 연산그래프를 생성하여야 합니다.
여기서는 경사하강법(Gradient Descent)을 이용할 예정입니다.
경사하강법이란 기울기가 점차 감소하는 방향으로 최적화 값을 찾는 방법입니다.
자세한 설명은 역시 본문 상단의 링크를 참조해주시면 됩니다.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(cost)
여기서 학습률(Learning Rate)는 얼마나 잦은 간격으로 값을 찾아낼것인지 정하는 수치인데
학습률이 작을수록 자주 값을 입력하므로 학습속도가 느려지며
학습률이 높을수록 최적의 값을 찾지 못하고 지나쳐버릴 수 있습니다.
이처럼 학습과정에 영향을 주는 변수를 하이퍼파라미터(Hyperparameter)라고 부르며
적절한 하이퍼파라미터를 찾는 과정을 튜닝이라고 합니다.
또한 optimizer.minimize()함수는 최적화를 수행합니다.
(8) 그래프 실행
텐서플로우의 구조는 크게 두가지로 나위어져 있습니다.
첫째로 그래프의 생성
두번째로 그래프의 실행입니다.
여기서 그래프란 각각의 연산의 묶음이라고 할 수 있습니다.
텐서플로우는 여러 텐서들과 그 텐서들의 연산을 정의하여
그래프를 만든 후, 필요한 시점에 연산을 실행하는 지연실행방식을 채택하고있습니다.
각 그래프의 실행은 세션(Session)안에서 이루어져야 하며
이를 위해서 세션 객체의 생성과 실행(Run)이 필요합니다.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
여기서 tf.Session()함수는 세션을 만들어주는 함수입니다.
sess.run()함수는 세션을 실행하며
tf.global_variables_initializer()함수는 앞서 정의한 변수들을 초기화시켜줍니다.
(9) 최적화 수행 및 매 학습마다 변화하는 손실값 출력하기
for step in range(77)이라는 코드는 학습을 77번 수행하라는 코드입니다.
feed_dict 매개변수는 그래프 실행시 플레이스홀더에 X와 Y값을 입력해주는 역할을 합니다.
for step in range(77):
_, cost_val = sess.run([train_op, cost], feed_dict={X: x_data, Y: y_data})
print(step, cost_val, sess.run(W), sess.run(b))
(10) 학습이 잘 되었는지 확인하기
아래 코드는 X에 10을 넣었을때
반환되는 Y값을 출력하는 코드입니다.
print("------학습확인------")
print("X: 10\nY:", sess.run(hypothesis, feed_dict={X: 10}))
3. 결과분석
코드를 실행 시
아래사진과 같은 결과가 나타납니다.
상단에는
[몇번째 학습인지, 비용이 어느정도인지, 어떤 W값을 넣었는지, 어떤 b값을 넣었는지]를 나타내며
아래에는
[넣어준 X값이 무엇인지, 출력된 Y값이 무엇인지]를 나타냅니다.
위 사진의 붉은 박스안 값과 같이
Y값이 X값과 근사하게 출력되었음을 확인해주시면 됩니다.
오늘은 선형회귀 분석예제를 살펴보았습니다.
오랜만의 포스팅인데 다음엔 더 좋은 예제를 들고오겠습니다.
'코딩 > 텐서플로우' 카테고리의 다른 글
비전공자의 코딩 독학 - 파이썬&텐서플로우(7) <예제3 심층신경망> (1) | 2020.01.14 |
---|---|
비전공자의 코딩 독학 - 파이썬&텐서플로우(6) <예제2 신경망> (0) | 2020.01.06 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(4) <활성화 함수> (0) | 2019.12.31 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(3) <선형회귀> (0) | 2019.12.29 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(2) <딥러닝> (0) | 2019.12.28 |