케이스윔의 개발 블로그

[Lab4-1&4-2] Multi-variable regression 및 Loading Data from file 본문

모두를 위한 딥러닝

[Lab4-1&4-2] Multi-variable regression 및 Loading Data from file

kswim 2018. 4. 30. 15:31

<Multi-variable Linear regression>

import tensorflow as tf


#이 경우에는 x1, x2, x3으로 세개뿐이지만 아주 많이 늘어난다면 코드가 복잡해지고 사용할 수 없다!

x1_data = [73., 93., 89., 96., 73.]

x2_data = [80., 88., 91., 98., 66.]

x3_data = [75., 93., 90., 100., 70.]

y_data = [152., 185., 180., 196., 142.]


x1 = tf.placeholder(tf.float32)

x2 = tf.placeholder(tf.float32)

x3 = tf.placeholder(tf.float32)


Y = tf.placeholder(tf.float32)


w1 = tf.Variable(tf.random_normal([1]), name='weight1')

w2 = tf.Variable(tf.random_normal([1]), name='weight2')

w3 = tf.Variable(tf.random_normal([1]), name='weight3')

b = tf.Variable(tf.random_normal([1]), name='bias')


hypothesis = x1*w1 + x2*w2 + x3*w3 + b


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

optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)

#learning_rate는 0.001로 준 것->낮게 준 것!

train = optimizer.minimize(cost)


sess = tf.Session()

sess.run(tf.global_variables_initializer())


for step in range(2001):

    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],

                                  feed_dict={x1:x1_data, x2:x2_data, x3:x3_data, Y:y_data})

    if step %10 == 0:

        print(step, "Cost: ", cost_val, "\nPrediction: ", hy_val,"\n")

#결과를 보면 cost는 점점 줄어들고 prediction값은 실제값과 가까워지는 것을 확인할 수 있다.



<Matrix를 사용해서 Multi-variable Linear regression>

import tensorflow as tf


#Matrix를 이용하기 위해 하나의 instance들을 묶어서 배열로 값을 준다.

#이전에 값 하나하나씩 줄 때보다 훨씬 간단하게 나타낼 수 있음을 알수있다.

x_data = [[73.,80., 75.],[93.,88., 93.], [89., 91., 90.],

          [96.,98., 100.], [73., 66., 70.]]

y_data = [[152.], [185], [180.], [196.], [142.]]


#X는 shape에 n개로 잡기위해 None을 해주고 각 element를 3으로 잡아준다. 

#Y도 n개를 예측하기때문에 None과 element는 예측 할 값이 1개임을 뜻한다. 

X = tf.placeholder(tf.float32, shape=[None, 3])

Y = tf.placeholder(tf.float32, shape=[None, 1])


#3개가 들어와서 1개로 나간다! 

W = tf.Variable(tf.random_normal([3,1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')


hypothesis = tf.matmul(X, W) + b

#행렬의 곱을 통해서 계산한다. 이 부분을 제외하고는 위의 과정과 같다.

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


optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)

train = optimizer.minimize(cost)


sess = tf.Session()

sess.run(tf.global_variables_initializer())


for step in range(2001):

    cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X:x_data, Y:y_data})

    if step % 10 == 0:

        print(step, "Cost: ", cost_val, "\nPrediction: ", hy_val, "\n")


<Loading Data from file>

많은 학습데이터가 있을 경우 주로 .csv 파일을 이용한다


* 파이썬의 slicing

num = range(5)

print nums -> [0, 1, 2, 3, 4 ]

print nums[2:4] -> 2에서부터 4-1까지 즉 2~3번째 아이 [2, 3]

print nums[2:] -> 2부터 끝까지 [2, 3, 4]

print nums[:] -> 전체를 가져온다 [0, 1, 2, 3, 4]

print num[:-1] -> -1은 끝을 뜻하므로 처음부터 끝보다 한칸 앞까지 [0, 1, 2, 3]


* numpy의 강력한 slicing! 2차원 array에서도 가능하다.

b = np.array[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

b[:, 1] -> [2, 6, 10]콤마앞의 :은 전체를 가져오라는 뜻이고 콤마 뒤의 1은 1번 index를 가져오라는 뜻이므로 각 행의 1번 index를 전부가져온다.

b[-1] -> [9, 10, 11, 12] -1이 젤 끝을 가리키므로 젤 끝 행을 가져온다.

b[-1, :] -> [9, 10, 11, 12] -1이 젤 끝을 가리키고 :가 전체를 가리키므로 젤 끝 행을 전부 가져온다.

b[0:2, :] ->[[1, 2, 3, 4][5, 6, 7, 8]] 앞의 0:2는 0~1행을 가리키고 뒤의 :는 전체를 가리킨다.



import numpy as np


#파일이름을 주고 자를 delimiter를 지정해준다. 전체의 데이터가 같은 데이터타입이어야한다.

xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)


x_data = xy[:, 0:-1]

#:라는 의미는 n행을 전부 가지고 올 것이고, 0~마지막 열의 앞까지를 가지고 온다.

y_data = xy[:, [-1]]

#n행을 전부 가지고 오고, 맨 마지막하나만 가지고 오겠다.


print(x_data.shape, x_data, len(x_data))

print(y_data.shape, y_data)


#뒤의 과정은 직접 입력했을 때와 같다.


<Queue Runners>

여러개의 파일에서 input을 가지고 온다면 큐에 넣어두고 reader로 연결해서 데이터를 읽은 다음에 decoder에 보내고 다시 큐에 쓴다. 어떤 batch만큼 읽어서 쓴다.

1. file들이 몇개인지를 확인하고 file의 list를 만들어준다.

filename_queue = tf.train.string_input_producer(['data-01-test-score.csv', 'data-02-test-score.csv', ...], shuffle=false,                         name='filename_queue')


2. file을 읽을 reader를 만들어준다. key, value를 나눠서 읽자!

reader = tf.TextLineReader()

key, value = reader.read(filename_queue)


3. value값을 어떻게 parsing할 것인가를 결정한다.

#기본형태의 타입을 정해줄 수 있다.

record_defaults = [[0.], [0.], [0.], [0.]]

xy = tf.decode_csv(value, record_defaults=record_defaults)


텐서플로의 batch의 값에 따라 읽어온다.

train.x_batch, train_y_batch = tf.train.batch([xy[0:-1], xy[-1:]], batch_size =10)


sess = tf.Session()


coord = tf.train.Coordinator()

threads = tf.train.start_queue_runners(sess=sess, coord=coord)


for step in range(2001):   

#batch만큼 데이터를 가지고 오는 것

x_batch, y_batch = sess.run([train_x_batch, train_y_batch])

....



coord.request_stop()

coord.join(threads)

Comments