관리 메뉴

Storage Gonie

모두를 위한 딥러닝 10강 ML lab 04-2: TensorFlow로 파일에서 데이타 읽어오기 (new) 본문

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

모두를 위한 딥러닝 10강 ML lab 04-2: TensorFlow로 파일에서 데이타 읽어오기 (new)

Storage Gonie 2018. 9. 8. 18:31
반응형

# 데이터를 쪼개기 위한 slicing 예제

예제1) 

http://cs231n.github.io/python-numpy-tutorial


예제2)


# 텍스트 데이터를 읽어와 Multi-Variable Linear Regression 모델을 훈련시키는 예제

- 이거와 비슷한 형태로 row가 25개가 되는 데이터를 가지고 실험한다.

- 아래의 코드에서 유심히 볼 부분은 데이터를 load 해오고 이를 x데이터와, y데이터로 나누는 작업이다.


import tensorflow as tf
import numpy as np
tf.set_random_seed(777) # for reproducibility

xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)
x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]

# Make sure the shape and data are OK
print(x_data.shape, x_data, len(x_data))
print(y_data.shape, y_data)

# feed_dict로 모델에 위의 데이터를 공급하기 위함
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

# 랜덤한 숫자로 초기화된 매개변수들
W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# Hypothesis 노드 선언
hypothesis = tf.matmul(X, W) + b

# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
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:\n", hy_val)

# Ask my score
print("Your score will be ", sess.run(hypothesis, feed_dict={X: [[100, 70, 101]]}))

print("Other scores will be ", sess.run(hypothesis, feed_dict={X: [[60, 70, 110], [90, 100, 80]]}))


'''
Your score will be [[ 181.73277283]]
Other scores will be [[ 145.86265564]
[ 187.23129272]]

'''


# 텐서플로우에서 메모리공간의 한계를 해결해주는 Queue Runners 시스템을 제공함

- 파일이 너무 큰 경우에 한번에 메모리에 올리기 힘든데 이를 위해서 텐서플로우가 제공하는 기능이다.

- 1. 여러개의 파일이름을 큐에 쌓고, shuffle의 여부를 결정한다.

- 2. 파일을 어떤 형식(Binary or Text or etc)으로 읽을 지 결정하고 key, value 형식으로 읽어들인다.

- 3. 읽어들인 value에 대해 비어있는 값에 default값을 넣어줄 수 있고 이를 큐에 쌓는다.

- 4. 학습할 때 필요한 배치 만큼씩 메모리로 읽어와서 학습을 시킨다.

https://www.tensorflow.org/programmers_guide/reading_data


# tf.train.batch 및 Queue Runner 시스템을 사용하기 위한 코드

- tf.train.batch는 데이터를 뽑아올리는 펌프같은 역할을 하고, 한번에 몇개씩 뽑아낼지와 x_data로 사용할 부분과 y_data로 사용할 부분을 표시해준다.

- 그 다음 이 노드를 sess.run으로 실행할 때 마다 데이터를 내어준다.

- 아래의 처음보는 코드들은 queue_runners를 사용하기 위한 부가적인 코드이다.

- coord = tf.train.Coordinator()

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

- coord.request_stop()

- coord.join(threads)


# 대량데이터가 필요한 모델을 위해 tf.train.batch 및 Queue Runner 시스템을 사용한 훈련모델 작성

import tensorflow as tf

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

reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# Default values, in case of empty columns. Also specifies the type of the decoded result.
record_defaults = [[0.], [0.], [0.], [0.]]
xy = tf.decode_csv(value, record_defaults=record_defaults)

# collect batches of csv in
train_x_batch, train_y_batch = tf.train.batch([xy[0:-1], xy[-1:]], batch_size=10)

# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

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

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

# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

# Start populating the filename queue.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

for step in range(2001):
x_batch, y_batch = sess.run([train_x_batch, train_y_batch])
cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_batch, Y: y_batch})
if step % 10 == 0:
print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)

coord.request_stop()
coord.join(threads)

# Ask my score
print("Your score will be ", sess.run(hypothesis, feed_dict={X: [[100, 70, 101]]}))

print("Other scores will be ", sess.run(hypothesis, feed_dict={X: [[60, 70, 110], [90, 100, 80]]}))

'''
Your score will be [[ 177.78144836]]
Other scores will be [[ 141.10997009]
[ 191.17378235]]

'''


# 배치의 순서가 shuffle 되었으면 좋겠다면 사용할 수 있는 함수

- 이외에도 여러가지 함수가 있으니 바로 아래의 링크를 참고

https://www.tensorflow.org/programmers_guide/reading_data

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

반응형
Comments