바 . Gradient Descent (Linear Regression)

R 에서 lm( y ~ x , data) 하고 coef  실행시켜주면 최적의 공식을 찾아주던  그것과 상당히 유사한 기능을  tensorflow 로 구현하였다고 보면된다. 모든 기계 학습에서의 최적화를 찾아가는 방법은 코스트를 구하고, 그 코스트가 최소가 되는 공식을 계속해서 변경하고  반복하면서 최적을 찾는 동일한 패턴을 갖는다. 아래의 예제 코드도 그 과정을 설명하는 코드라고 생각하면 된다.

[테스트 데이터 생성]

[x,y] 와 같은 형태의 복수 데이터를 생성한다. 이때, 우리만 알고 있는  x ~ y 사이의 관계식을 적용하여 데이터를 생성한다. 이것이 훈력을 통해서 찾고자 하는 목표 값이 되겠다

# 테스트를 위한 랜덤 값을 생성한다.
def make_data_set(weight, bias, train_num, max_x):

    data = np.random.randint(max_x, size=train_num)
    x = tf.constant(data, name='x')
    result = []

    for i in range(0, train_num):
        result.append([data[i], data[i] * weight + bias])

    return result

[최적의 식 찾기]

모델의 형태를 지정하고, 초기값을 지정한다.

# 최초의 추축 값 , 초기 값이라고 보면 된다.
    w = tf.Variable([1.0, 2.0], name="w")
    # 우리 모델은 아주 간단한 1차 방적식이다  y = a*x + b
    y_model = tf.mul(x, w[0]) + w[1]

그리고 테스트 데이터와 모델에서 유추한 값의 오차 (코스트)를 구하는 식을 정의

    # error 는 식으로 구한 y 값과 원래 가지고 있는 Y 값의 차이이다
    error = tf.square(y - y_model)

코스트가 최소화 되도록 훈련을 시킨다

    # 애러 값을 최소화 할 수 있는 방향으로 0.01 의 학습도로 공식을 수정해 간다
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

나머지는  session 을 생성하여 실행하는 로직

[전체 코드]

# 최적의 회귀식을 찾아내는 기능이다. 최적의 회귀식이란 모든 점을 가장 잘 설명할 수 있는
# 각 점으로부터의 직선거리가 최소화되는 하나의 선을 구하는 것이다라고 보면 된다
def graident_descent(sets):

    # 테스트 데이터를 위한  placeholder 를 생성한다.
    # x, y 는 각 2차원 그래프의 x, y 좌표 값이라고 보면 된다.
    # 아래에서 for i in range(1000): 100번을 반복하면서 랜덤 값을 연산하기 위한
    # 변수로 사용할 것이다.
    x = tf.placeholder("float")
    y = tf.placeholder("float")

    # 최초의 추축 값 , 초기 값이라고 보면 된다.
    w = tf.Variable([1.0, 2.0], name="w")
    # 우리 모델은 아주 간단한 1차 방적식이다  y = a*x + b
    y_model = tf.mul(x, w[0]) + w[1]

    # error 는 식으로 구한 y 값과 원래 가지고 있는 Y 값의 차이이다
    error = tf.square(y - y_model)

    # 애러 값을 최소화 할 수 있는 방향으로 0.01 의 학습도로 공식을 수정해 간다
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

    # 위에 정의한 변수들을 모두 등록한다.
    model = tf.initialize_all_variables()

    errors = []
    # 1000번을 반복하여 학습도를 조금식 올려 보자
    with tf.Session() as session:
        session.run(model)
        for set in sets:
            #print("{0} , {1}".format(set[0], set[1]))
            #session.run(train_op, feed_dict={x: set[0], y: set[1]})
            _, error_value = session.run([train_op, error], feed_dict={x: set[0], y: set[1]})
            errors.append(error_value)

        # for i in range(1000):
        #     x_value = np.random.rand()
        #     y_value = x_value * 2 + 6
        #     print("{0},{1}".format(x_value,y_value))
        #     session.run(train_op, feed_dict={x: x_value, y: y_value})

        w_value = session.run(w)

        print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))
        return errors, w_value

[그래프 출력 ]

애러율 감소하는 것을 시각화하고, 데이터와 추측한 공식을 시각화 한다

# 애러율이 감소하는 것을 시각화
def draw_errorr_graph(errors):
    plt.plot([np.mean(errors[i - 50:i]) for i in range(len(errors))])
    plt.show()
    plt.savefig("errors.png")

# 최종적으로 추측한 그래프의 시각화
def draw_opt_line(all_samples, fomula, x_axis_max_num):

    start = [0  , fomula[1]]
    end = [x_axis_max_num, x_axis_max_num * fomula[0] + fomula[1]]

    for set in all_samples:
        plt.scatter(set[0], set[1], color='b')

    plt.plot(start , end, color='r')
    plt.show()

[애러율 감소]

스크린샷, 2016-09-02 01-12-44

 

[데이터와 유추한 공식]

스크린샷, 2016-09-02 01-12-59

[전체 테스트 코드]

# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# threadhold (5) 보다 값이 커지기 전까지 X 를 하나씩 증가시키면서 출력한다
def simple_loop_exp():

    x = tf.Variable(0., name='x')
    threshold = tf.constant(5.)

    model = tf.initialize_all_variables()

    with tf.Session() as session:
        session.run(model)
        while session.run(tf.less(x, threshold)):
            x = x + 1
            x_value = session.run(x)
            print(x_value)


# 테스트를 위한 랜덤 값을 생성한다.
def make_data_set(weight, bias, train_num, max_x):

    data = np.random.randint(max_x, size=train_num)
    x = tf.constant(data, name='x')
    result = []

    for i in range(0, train_num):
        result.append([data[i], data[i] * weight + bias])

    return result



# 최적의 회귀식을 찾아내는 기능이다. 최적의 회귀식이란 모든 점을 가장 잘 설명할 수 있는
# 각 점으로부터의 직선거리가 최소화되는 하나의 선을 구하는 것이다라고 보면 된다
def graident_descent(sets):

    # 테스트 데이터를 위한  placeholder 를 생성한다.
    # x, y 는 각 2차원 그래프의 x, y 좌표 값이라고 보면 된다.
    # 아래에서 for i in range(1000): 100번을 반복하면서 랜덤 값을 연산하기 위한
    # 변수로 사용할 것이다.
    x = tf.placeholder("float")
    y = tf.placeholder("float")

    # 최초의 추축 값 , 초기 값이라고 보면 된다.
    w = tf.Variable([1.0, 2.0], name="w")
    # 우리 모델은 아주 간단한 1차 방적식이다  y = a*x + b
    y_model = tf.mul(x, w[0]) + w[1]

    # error 는 식으로 구한 y 값과 원래 가지고 있는 Y 값의 차이이다
    error = tf.square(y - y_model)

    # 애러 값을 최소화 할 수 있는 방향으로 0.01 의 학습도로 공식을 수정해 간다
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

    # 위에 정의한 변수들을 모두 등록한다.
    model = tf.initialize_all_variables()

    errors = []
    # 1000번을 반복하여 학습도를 조금식 올려 보자
    with tf.Session() as session:
        session.run(model)
        for set in sets:
            #print("{0} , {1}".format(set[0], set[1]))
            #session.run(train_op, feed_dict={x: set[0], y: set[1]})
            _, error_value = session.run([train_op, error], feed_dict={x: set[0], y: set[1]})
            errors.append(error_value)

        # for i in range(1000):
        #     x_value = np.random.rand()
        #     y_value = x_value * 2 + 6
        #     print("{0},{1}".format(x_value,y_value))
        #     session.run(train_op, feed_dict={x: x_value, y: y_value})

        w_value = session.run(w)

        print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))
        return errors, w_value

# 애러율이 감소하는 것을 시각화
def draw_errorr_graph(errors):
    plt.plot([np.mean(errors[i - 50:i]) for i in range(len(errors))])
    plt.show()
    plt.savefig("errors.png")

# 최종적으로 추측한 그래프의 시각화
def draw_opt_line(all_samples, fomula, x_axis_max_num):

    start = [0  , fomula[1]]
    end = [x_axis_max_num, x_axis_max_num * fomula[0] + fomula[1]]

    for set in all_samples:
        plt.scatter(set[0], set[1], color='b')

    plt.plot(start , end, color='r')
    plt.show()


#생성하려고 하는 초기 데이터 변수
weight = 2
bias = 6
iter = 1000
x_axis_max_num = 5

# 초기 데이터를 생성합니다
data = make_data_set(weight , bias , iter, x_axis_max_num)

# 학습을 시켜 최적의 공식을 찾는다
errors, w_value = graident_descent(data)

# 애러율이 감소하는 그래프
draw_errorr_graph(errors)

# 최종 결과 , 데이터와, 유추한 선
draw_opt_line(data, w_value, x_axis_max_num)

 

Categories: TensorFlow

Leave a Reply

Your email address will not be published. Required fields are marked *