데이터가 많아지면 소스코드에 직접 데이터를 입력하는 것이 불가능해지므로 콤마로 이루어진 csv 파일로 저장하고 그것을 불러와서 처리하는 방식을 취해야 한다.
파일을 불러올 때는 Numpy의 loadtxt 함수를 이용한다.
아래와 같은 csv 파일을 만들고 실제 소스코드에서 불러와서 학습에 이용해보자.
# EXAM1, EXAM2, EXAM3, FINAL
73,80,75,152
93,88,93,185
89,91,90,180
96,98,100,196
73,66,70,142
53,46,55,101
소스코드
import tensorflow as tf
import numpy as np
tf.set_random_seed(777)
# numpy의 loadtxt를 이용하여 float32 데이터 형식의 csv 파일을 읽어온다.
xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)
x_data = xy[:, 0:-1] # 전체행, 0부터 마지막 전까지
y_data = xy[:, [-1]] # 전체행, 마지막
# 불러온 데이터가 올바른지 확인
print(x_data.shape, x_data, len(x_data))
print(y_data.shape, y_data)
# placeholder 생성
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])
# W는 [X의 갯수, Y의 갯수] b는 [Y의 갯수]의 크기를 가진다.
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 function
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())
# feed_dict를 활용하여 placeholder에 데이터 입력
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)
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]]}))
결과
Queue Runners
파일의 용량이 커서 메모리에 한 번에 올려 처리하는 것이 불가능할 경우를 대비하여 TensorFlow에서는 Queue Runners라는 시스템을 마련하였다.
위와 같은 과정이 끝나면 csv 파일을 읽어와서 record 형식에 따라 Queue에 담겨지고 그 담긴 데이터를 batch만큼 읽어와서 학습한다.
한 번에 batch_size 만큼의 데이터를 가져와서 이용한다고 생각.
import tensorflow as tf
# TensorFlow Queue Runner 방식 사용
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)
record_defaults = [[0.], [0.], [0.], [0.]]
xy = tf.decode_csv(value, record_defaults=record_defaults)
train_x_batch, train_y_batch = tf.train.batch([xy[0:-1], xy[-1:]], batch_size=10)
# placeholder 생성
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])
# W는 [X의 갯수, Y의 갯수] b는 [Y의 갯수]의 크기를 가진다.
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 function
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())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# feed_dict를 활용하여 placeholder에 데이터 입력
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)
결과
(Numpy 코드에서는 seed 값을 정해주었기 때문에 cost 값이 동일하게 수렴하지만 위의 코드와 같이 주어주지 않으면 실행할 때마다 다른 점에서 시작하기 때문에 cost 값이 다르게 나온다.)
'Machine Learning & Deep Learning' 카테고리의 다른 글
8. Softmax classification (0) | 2020.04.22 |
---|---|
7. Logistic Regression (0) | 2020.04.20 |
5. Multi-variable linear regression (0) | 2020.04.17 |
4. Hypothesis and Cost (0) | 2020.04.16 |
3. Linear Regression (0) | 2020.04.15 |