저는 TensorFlow의 세계에 비교적 익숙하지 않으며 실제로 CSV 데이터를 TensorFlow에서 사용 가능한 예제 / 라벨 텐서로 읽어 들이는 방법에 상당히 당황합니다 . CSV 데이터 읽기에 대한 TensorFlow 자습서 의 예제 는 매우 조각화되어 있으며 CSV 데이터에 대해 학습 할 수있는 방법의 일부일뿐입니다.
CSV 자습서를 기반으로 한 코드는 다음과 같습니다.
from __future__ import print_function
import tensorflow as tf
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
filename = "csv_test_data.csv"
# setup text reader
file_length = file_len(filename)
filename_queue = tf.train.string_input_producer([filename])
reader = tf.TextLineReader(skip_header_lines=1)
_, csv_row = reader.read(filename_queue)
# setup CSV decoding
record_defaults = [[0],[0],[0],[0],[0]]
col1,col2,col3,col4,col5 = tf.decode_csv(csv_row, record_defaults=record_defaults)
# turn features back into a tensor
features = tf.stack([col1,col2,col3,col4])
print("loading, " + str(file_length) + " line(s)\n")
with tf.Session() as sess:
tf.initialize_all_variables().run()
# start populating filename queue
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(file_length):
# retrieve a single instance
example, label = sess.run([features, col5])
print(example, label)
coord.request_stop()
coord.join(threads)
print("\ndone loading")
다음은 내가로드중인 CSV 파일의 간단한 예입니다. 기본 데이터-기능 열 4 개, 라벨 열 1 개 :
0,0,0,0,0
0,15,0,0,0
0,30,0,0,0
0,45,0,0,0
위의 모든 코드 는 CSV 파일에서 각 예제를 하나씩 인쇄하는 것입니다 . 이는 훌륭하지만 훈련에는 쓸모가 없습니다.
여기서 제가 고민하고있는 것은 실제로 하나씩로드 된 개별 예제를 학습 데이터 세트로 바꾸는 방법입니다. 예를 들어, 여기 Udacity Deep Learning 과정에서 작업 하던 노트북 이 있습니다. 기본적으로로드중인 CSV 데이터를 가져 와서 train_dataset 및 train_labels 와 같은 내용에 넣고 싶습니다 .
def reformat(dataset, labels):
dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)
# Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]
labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)
return dataset, labels
train_dataset, train_labels = reformat(train_dataset, train_labels)
valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)
test_dataset, test_labels = reformat(test_dataset, test_labels)
print('Training set', train_dataset.shape, train_labels.shape)
print('Validation set', valid_dataset.shape, valid_labels.shape)
print('Test set', test_dataset.shape, test_labels.shape)
나는 이와 같이을 사용해 보았지만 tf.train.shuffle_batch
설명 할 수없이 멈춘다.
for i in range(file_length):
# retrieve a single instance
example, label = sess.run([features, colRelevant])
example_batch, label_batch = tf.train.shuffle_batch([example, label], batch_size=file_length, capacity=file_length, min_after_dequeue=10000)
print(example, label)
요약하면 다음과 같습니다.
- 이 프로세스에서 내가 놓친 것은 무엇입니까?
- 입력 파이프 라인을 제대로 구축하는 방법에 대해 제가 놓친 몇 가지 핵심 직관이있는 것 같습니다.
- CSV 파일의 길이를 알 필요가없는 방법이 있습니까?
- 처리 할 줄 수 (
for i in range(file_length)
위의 코드 줄) 를 알아야하는 것은 매우 우아하지 않습니다.
- 처리 할 줄 수 (
편집 : Yaroslav가 여기서 명령 및 그래프 구성 부분을 혼합 할 가능성이 있다고 지적하자마자 명확 해지기 시작했습니다. 다음 코드를 모아서 CSV에서 모델을 학습 할 때 일반적으로 수행되는 작업에 더 가깝다고 생각합니다 (모델 학습 코드 제외).
from __future__ import print_function
import numpy as np
import tensorflow as tf
import math as math
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('dataset')
args = parser.parse_args()
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
def read_from_csv(filename_queue):
reader = tf.TextLineReader(skip_header_lines=1)
_, csv_row = reader.read(filename_queue)
record_defaults = [[0],[0],[0],[0],[0]]
colHour,colQuarter,colAction,colUser,colLabel = tf.decode_csv(csv_row, record_defaults=record_defaults)
features = tf.stack([colHour,colQuarter,colAction,colUser])
label = tf.stack([colLabel])
return features, label
def input_pipeline(batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer([args.dataset], num_epochs=num_epochs, shuffle=True)
example, label = read_from_csv(filename_queue)
min_after_dequeue = 10000
capacity = min_after_dequeue + 3 * batch_size
example_batch, label_batch = tf.train.shuffle_batch(
[example, label], batch_size=batch_size, capacity=capacity,
min_after_dequeue=min_after_dequeue)
return example_batch, label_batch
file_length = file_len(args.dataset) - 1
examples, labels = input_pipeline(file_length, 1)
with tf.Session() as sess:
tf.initialize_all_variables().run()
# start populating filename queue
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
try:
while not coord.should_stop():
example_batch, label_batch = sess.run([examples, labels])
print(example_batch)
except tf.errors.OutOfRangeError:
print('Done training, epoch reached')
finally:
coord.request_stop()
coord.join(threads)