이번 포스트에는 외부 텍스트 파일에서 데이터를 불러오거나, 불러온 데이터를 일정한 수량마다 순차적으로 대입하는 방법에 대해서 소개합니다.
1. numpy를 이용한 텍스트 파일로부터 데이터를 읽어오는 방법
1 2 3 4 5 | D:\\data.csv 33, 35, 36, 104 39, 29, 44, 112 50, 50, 10, 110 | 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번째 줄은 문자열을, 4와 5번째 줄은 각각의 위치를 어떻게 표시하는지 나타냅니다.
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. 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=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는 통상적으로 쓰이는 부분이라고 생각하면 됩니다.
'파이썬 > 머신러닝' 카테고리의 다른 글
[#E9] 학습 데이터 전처리 (PreProcessing) (0) | 2018.12.08 |
---|---|
[#E8] Fancy Softmax Regression이란? (0) | 2018.12.05 |
[#E6] Multinomial Logistic Classification [Softmax Regression] (0) | 2018.12.04 |
[#E5] Logistic Classification 이란? (0) | 2018.12.02 |
[#E4] 다중 변수를 사용하는 Multi Variables Linear Regression (0) | 2018.12.01 |