본문 바로가기
Deep Learning lecture

ML lab 04-2: TensorFlow로 파일에서 데이타 읽어오기 (new)

by xangmin 2020. 4. 27.
반응형

 04-2 강의에서는 앞서 배운 내용을 가지고 프로그램을 돌려보는 것에 대해 국한되지 않고 기본적인 파이썬에서 코드에 대해서도 같이 정리할 예정이다.

csv 파일 읽기

 'data-01-test-score.csv'라는 파일을 읽고자 한다. 내용은 다음과 같다.

#EXAM1, EXAM2, EXAM3, FINAL
73,  80,  75, 152 
93,  88,  93, 185 
89,  91,  90, 180 
 ... 
76,  83,  71, 196  
96,  93,  95, 142

 

파일을 읽기 위해서는 numpy를 import한다.

import numpy as np

 

loadtxt를 사용한다. load할 파일명과 seperate할 조건(,)과 데이터타입(float32)을 설정한다.

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

 

Slicing

nums = range(5) 	# range is a built-in function that creates a list of integers
print nums			# Prints "[0, 1, 2, 3, 4]"
print nums[2:4]		# Get a slice from index 2 to 4 (exclusive); prints "[2, 3]"
print nums[2:]		# Get a slice from index 2 to the end; prints "[2, 3, 4]"
print nums[:2]		# Get a slice from the start to index 2 (exclusive); prints "[0, 1]" 
print nums[:]		# Get a slice of the whole list; prints "[0, 1, 2, 3, 4]"
print nums[:-1]		# Slice indices can be negative; prints "[0, 1, 2, 3]"
num[2:4] = [8:9]	# Assign a new sublist to a slice
print nums			# Prints "[0, 1, 8, 9, 4]"

 

Indexing, Slicing, Iterating

a = np.array([1, 2, 3, 4, 5])
#array([1, 2, 3, 4, 5])

a[1:3]
#array([2, 3])

a[-1]
#5

a[0:2] = 9
a
#array[9, 9, 3, 4, 5]
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# array([[1, 2, 3, 4],
#		 [5, 6, 7, 8],
#		 [9, 10, 11, 12]])

b[:,-1]
# array([2, 6, 10])

b[-1]
# array([9, 10, 11, 12])

b[-1, :]
# array([9, 10, 11, 12])

b[0:2, :]
# array([[1, 2, 3, 4],
#		 [5, 6, 7, 8]])

lab-04-3-file_input_linear_regression.py

# Lab 4 Multi-variable linear regression
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, "\nx_data shape:", x_data.shape)
print(y_data, "\ny_data shape:", y_data.shape)

# data output
'''
[[ 73.  80.  75.]
 [ 93.  88.  93.]
 ...
 [ 76.  83.  71.]
 [ 96.  93.  95.]] 
x_data shape: (25, 3)
[[152.]
 [185.]
 ...
 [149.]
 [192.]] 
y_data shape: (25, 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=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)

Result

# train output
'''
0 Cost: 21027.0 
Prediction:
 [[22.048063 ]
 [21.619772 ]
 ...
 [31.36112  ]
 [24.986364 ]]
10 Cost: 95.976326 
Prediction:
 [[157.11063 ]
 [183.99283 ]
 ...
 [167.48862 ]
 [193.25117 ]]
 1990 Cost: 24.863274 
Prediction:
 [[154.4393  ]
 [185.5584  ]
 ...
 [158.27443 ]
 [192.79778 ]]
2000 Cost: 24.722485 
Prediction:
 [[154.42894 ]
 [185.5586  ]
 ...
 [158.24257 ]
 [192.79166 ]]
'''

 

Queue Runners

 파일이 큰 경우 메모리를 한번에 올리기에 힘든 경우 numpy를 쓰면 메모리가 부족하다고 나온다. 이런 경우를 대비해서 tensorflow에서는 Queue Runners라는 시스템이 만들어져 있다. 

 

 A, B, C 여러개의 파일을 읽어와서 queue에다가 쌓게된다. 그런다음 Reader로 연결해서 데이터를 읽은 다음 양식에 맞게 decoder를 해서 다시 큐에다 쌓는다.

#1
filename_queue = tf.train.string_input_producer(
    ['data-01-test-score.csv'], shuffle=False, name='filename_queue')
#2
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
#3
record_defaults = [[0.], [0.], [0.], [0.]]
xy = tf.decode_csv(value, record_defaults=record_defaults)

 

tf.train.batch

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

sess = tf.Session()
...

# 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])
    ...
    
coord.request_stop()
coord.join(threads)

 

lab-04-4-tf_reader_linear_regression.py

 

반응형

댓글