본문 바로가기

Programming Project/Tensorflow Tutorials

Tensorflow 튜토리얼 01 - Simple Liner Regression


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

본 글 시리즈는 모두를 위한 딥러닝 시즌 2를 글로 옮겼음을 밝힙니다.

본 시리즈는 https://www.youtube.com/watch?v=7eldOrjQVi0&list=PLQ28Nx3M4Jrguyuwg4xe9d9t2XE639e5C

위 링크에 있습니다.

설치나 환경설정 등은 다양한 정답이 있으므로 따로 다루지 않겠습니다.

저는 아나콘다 환경이라 conda install tensorflow 명령어로 설치했습니다.

 

 

 

 

 

import tensorflow as tf 

 

라는 명령어가 파이썬에서 실행된다면 성공이다.

 

개념에 대한 부분은 예전 글들에서 많이 다루었으므로 이 글 시리즈에서는 단순히 사용법만을 다뤄보도록 하려고 한다.

 

오늘 글에서 다룰 내용

 

오 신기하다 이건 처음 들어서 공유하는데, regression이라는게 회귀라는 말로 번역되어서 그 직관적인 의미에 대해 물음표가 있으셨던 분들 많았을건데 (나도 그랬고) 이게 사실 표본을 짱 많이 뽑으면 결국 평균으로 회귀된다는 의미에서 회귀라는 말을 썼다고 한다. ㄷㄷ

 

선형회귀는 위와 같은 것을 말한다.

우선 cost function은 정답과 예측의 차이의 제곱의 평균으로 만들어서 계산 할 것이다.

 

cost function은 위와 같다.

우선 x와 y데이터를 정의하고 W가 될 변수 W와 b가 될 변수 b를 선언한다.

원래는 랜덤하게 선언하는데, 처음이라서 초기로 임의의 값을 넣어줬다.

x_data = [1,2,3,4,5]
y_data = [1,2,3,4,5]

W = tf.Variable(2.9)
b = tf.Variable(0.5)

hypothesis = W * x_data + b

hypothesis = 머시기 된 부분이 바로 우리의 가설 함수이다.

 

cost 함수는 아래와 같다. 에러 제곱의 평균으로 싹 넣어주는 것을 볼 수 있다.

cost = tf.reduce_mean(tf.square(hypothesis-y_data))

 

직관적으로 함수들 이름을 다 이해할 수 있겠지만, reduce라는 말은 차원이 하나 줄어들면서 mean 을 구하기 때문에 reduce_mean이라는 함수 이름이 되었다고 한다.

tf.squrare은 제곱하는 것.

 

그리고 tf.Variable은 텐서플로우에서 사용하는 변수 type을 선언하는 방법이다.

 

gradient descent는 경사 하강 알고리즘으로 cost를 minimize하는 경사 하강 알고리즘이다.

개념은 이미 알고 있을 것이라고 생각하며, (모른다며는 pytorch 튜토리얼

2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 1 (Overview) 요 글 시리즈에서 쫙 다뤘으니까 보시거나 아니면 다른 좋은 개념서에서 공부를 하시거나? 아니면 동영상 원본으로 공부를 하시며는 거기에서는 lecture도 같이 있으니 그 편이 좋을 것 같습니다.)

 

cost가 minimize 되는 W와 b를 찾는 알고리즘이다.

gradient descent 는 tensorflow에서는 주로 gradient tape이라는 알고리즘을 가지고 구현을 한다.

gradient tape은 with이라는 구문과 같이 쓰이는데, 해당 블록 안의 변수들의 변화를 tape (as 뒤에있는)에 기록을 한다.

tape 에 기록된 정보는 W , b 라는 변수가 있기 때문에 두 변수에 대한 정보가 tape에 기록되며 나중에 tape의 gradient method를 호출하여 gradient(미분값)을 구한다.

 

learning_rate = 0.01

with tf.GradientTape() as tape:
    hypothesis = W*x_data + b
    cost = tf.reduce_mean(tf.square(hypothesis - y_data))

W_grad, b_grad = tape.gradient(cost,[W,b])

W.assign_sub(learning_rate * W_grad)
b.assign_sub(learning_rate * b_grad)

 

더보기

위 코드는 바로 실행하면 실행이 안될 것이다.

tf.enable_eager_execution()

이라는 명령을 import tensorflow as tf 바로 아랫줄에다가 적어주면 실행이 되는데, 좀 이따 다시 이야기 해 보겠다.

 

W_grad는 w의 기울기이고, b_grad는 b의 기울기이다.

assign_sub는 뺀 값을 다시 할당해주는 -=과 같은 역할이다.

위의 block이 한번의 iteration이 되고, 해당 코드를 반복 실행해야 여러번 학습이 진행된다.

 

완성된 코드는 아래와 같다.

import tensorflow as tf
tf.enable_eager_execution()

x_data = [1,2,3,4,5]
y_data = [1,2,3,4,5]

W = tf.Variable(2.9)
b = tf.Variable(0.5)

hypothesis = W * x_data + b

cost = tf.reduce_mean(tf.square(hypothesis-y_data))

learning_rate = 0.01

for i in range(100):
    with tf.GradientTape() as tape:
        hypothesis = W*x_data + b
        cost = tf.reduce_mean(tf.square(hypothesis - y_data))

    W_grad, b_grad = tape.gradient(cost,[W,b])

    W.assign_sub(learning_rate * W_grad)
    b.assign_sub(learning_rate * b_grad)
    
    if i % 10 == 0:
        print("{:5}|{:10.4f}|{:10.4}|{:10.6f}".format(i,W.numpy(),b.numpy(),cost))

 

eagar_execution이란 즉시실행을 가능하게 하는 코드이다.

만약 텐서플로우 2.0이상 버전을 실행하는 중이라면 필요 없는 line 이라고 한다. (난 왜 오류가 났나 했더니 1.12버전을 쓰고 있었다. 바로 업데이트 해부렸다.)

가이드 문서 링크이다.

https://www.tensorflow.org/guide/eager

 

Eager execution  |  TensorFlow Core

Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수 있습니다. 이 번역에 개선할 부분이 있다면 tensorflow/docs 깃허브 저장소로 풀 리퀘스트를 보내주시기 바랍니다. 문서 번역이나 리뷰에 참여하려면 docs-ko@tensorflow.org로 메일을 보내주시기 바랍니다. 텐서플로의 즉시 실행은 그래프를 생성하지

www.tensorflow.org

실행해보면 코스트가 줄어드는 것을 볼 수 있다.

 

w와 b값이 적절하게 근사화 되는 것도 볼 수 있다.

 

 

ㅎㅎ