Tôi tương đối mới với thế giới của TensorFlow và khá bối rối bởi cách bạn muốn thực sự đọc dữ liệu CSV thành một ví dụ/nhãn có thể sử dụng trong TensorFlow. Ví dụ từ TensorFlow tutorial on reading CSV data khá phân mảnh và chỉ giúp bạn trở thành một phần trong cách có thể đào tạo trên dữ liệu CSV.Làm thế nào để * thực sự * đọc dữ liệu CSV trong TensorFlow?
Dưới đây là mã của tôi mà tôi đã chắp ghép, dựa trên đó CSV hướng dẫn:
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")
Và đây là một ví dụ ngắn gọn từ các tập tin CSV Tôi tải - dữ liệu khá cơ bản - 4 cột tính năng, và cột 1 label:
0,0,0,0,0
0,15,0,0,0
0,30,0,0,0
0,45,0,0,0
Tất cả các đoạn mã trên không là in mỗi ví dụ từ tập tin CSV, từng người một, trong đó, trong khi tốt đẹp, là khá darn vô dụng cho việc đào tạo.
Điều tôi đang đấu tranh ở đây là cách bạn thực sự biến những ví dụ riêng lẻ đó, được tải từng người một, thành một tập dữ liệu huấn luyện. Ví dụ: here's a notebook Tôi đang làm việc trong khóa học Sâu về Udacity. Về cơ bản tôi muốn lấy dữ liệu CSV Tôi đang tải, và tiếng tom nó thành một cái gì đó giống như train_dataset và 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)
Tôi đã cố gắng sử dụng tf.train.shuffle_batch
, như thế này, nhưng nó chỉ hiểu sao treo:
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)
Vì vậy, để tổng hợp, đây là những câu hỏi của tôi:
- Tôi đang thiếu gì về quy trình này?
- Có vẻ như có một số trực giác quan trọng mà tôi thiếu về cách tạo đúng đường dẫn đầu vào.
- Có cách nào để tránh phải biết độ dài của tệp CSV không?
- Nó cảm thấy khá thanh nha phải biết số dòng bạn muốn để xử lý (dòng
for i in range(file_length)
mã ở trên)
- Nó cảm thấy khá thanh nha phải biết số dòng bạn muốn để xử lý (dòng
Edit: Ngay sau khi Yaroslav đã chỉ ra rằng tôi có khả năng trộn các phần bắt buộc và đồ thị-xây dựng ở đây, nó bắt đầu trở nên rõ ràng hơn. Tôi đã có thể kéo nhau đoạn mã sau, mà tôi nghĩ là gần gũi hơn với những gì thường sẽ thực hiện khi đào tạo một mô hình từ CSV (không bao gồm bất kỳ mã đào tạo mô hình):
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)
Tôi đã thử mã của bạn nhưng không thể làm cho mã hoạt động. Có điều gì tôi thiếu mà bạn đã xác định? Cảm ơn. Tôi đã đăng một chủ đề ở đây để bạn có thể biết thêm chi tiết: http://stackoverflow.com/questions/40143019/how-to-correctly-read-data-from-csvs-into-tensorflow – Link