본문 바로가기

파이썬/머신러닝

[#E7] 텍스트 파일로부터 데이터를 읽어오는 방법

이번 포스트에는 외부 텍스트 파일에서 데이터를 불러오거나, 불러온 데이터를 일정한 수량마다 순차적으로 대입하는 방법에 대해서 소개합니다.


1. numpy를 이용한 텍스트 파일로부터 데이터를 읽어오는 방법

 

1
2
3
4
5
D:\\data.csv

333536104
392944112
505010110
cs


위와 같은 데이터가 있습니다. 1, 2, 3번째는 x 데이터, 4번째는 y데이터입니다.


이를 파이썬에서 읽어오는 방법은 아주 간단합니다.


1
2
3
4
5
6
import numpy as np
 
xy = np.loadtxt('D:\\data.csv'delimiter=','dtype=np.float32)
 
x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]
cs


delimiter 속성은 각 데이터를 어떤 문자열로 구분할지 지정합니다. dtype는 데이터의 형식을 지정합니다.


이후의 x_data와 y_data에 각각 데이터를 할당하는 방법은 파이썬의 슬라이싱 기능을 이용합니다.


아래의 슬라이싱 예제에서 2번째 줄은 문자열을, 45번째 줄은 각각의 위치를 어떻게 표시하는지 나타냅니다.


1
2
3
4
5
 +---+---+---+---+---+---+
 | p | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
cs

 

2. 불러온 데이터를 일정한 수량마다 순차적으로 대입하는 방법 ( batch )


만약 불러온 데이터가 아주 많은 수량이라면, 처음부터 모든 데이터를 학습하기에는 부담스러울 수 있습니다. 이런 경우에는 데이터를 일정한 수량마다 순차적으로 대입하도록 펌프 역할을 하는 batch를 이용해야 합니다.


1
2
3
filename_queue = tf.train.string_input_producer(
    ['data1.csv, data2.csv ...'], shuffle=False, name='filename_queue')
 
cs


우선 파일을 로드합니다. 만약 파일이 여러개라면, 위와 같이 quene을 설정하여 불러올 수 있습니다.

 

1
2
3
4
5
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
 
record_defaults = [[0.], [0.], [0.], [0.]]
xy = tf.decode_csv(value, record_defaults=record_defaults)
cs


record_defaults는 데이터 형식이자 default 값을 의미합니다. Float32 형식이므로 0. 과 같이 정의합니다. 나머지는 따로 신경쓰지 않아도 무관한 코드입니다.

 

이제 batch를 정의해야 합니다. 이것은 아래와 같이 정의할 수 있습니다.


1
2
3
train_x_batch, train_y_batch = \
    tf.train.batch([xy[0:-1], xy[-1:]], batch_size=10)
                    #x_data   #y_data
cs


batch_size는 한번에 불러들일 데이터 사이즈를 의미합니다.

 

SOURCE CODE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import tensorflow as tf
 
filename_queue = tf.train.string_input_producer(
    ['data1.csv, data2.csv ...'], shuffle=False, name='my_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)
 
# collect batches of csv in
train_x_batch, train_y_batch = \
    tf.train.batch([xy[0:-1], xy[-1:]], batch_size=1)
 
# placeholders for a tensor that will be always fed.
= tf.placeholder(tf.float32, shape=[None, 3])
= tf.placeholder(tf.float32, shape=[None, 1])
 
= tf.Variable(tf.random_normal([31]), name='weight')
= 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=0.01)
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)
cs


X와 Y, W와 b는 데이터의 Shape를 고려하여 구성합니다. CODE는 통상적으로 쓰이는 부분이라고 생각하면 됩니다.