2016-05-07 26 views
62

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_datasettrain_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)

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) 
+0

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

Trả lời

18

Tôi nghĩ rằng bạn đang trộn lên cấp bách và đồ thị các bộ phận xây dựng ở đây. Thao tác tf.train.shuffle_batch tạo nút xếp hàng mới và một nút có thể được sử dụng để xử lý toàn bộ tập dữ liệu.Vì vậy, tôi nghĩ rằng bạn đang treo vì bạn đã tạo ra một loạt các hàng đợi shuffle_batch trong vòng lặp của bạn và không bắt đầu chạy hàng đợi cho họ.

Bình thường sử dụng đường ống đầu vào trông như thế này:

  1. Thêm nút như shuffle_batch đường ống đầu vào
  2. (không bắt buộc, để ngăn chặn biến đổi đồ thị không chủ ý) hoàn thiện graph

--- cuối xây dựng biểu đồ, bắt đầu lập trình bắt buộc -

  1. tf.start_queue_runners
  2. while(True): session.run()

Để có khả năng mở rộng hơn (để tránh Python GIL), bạn có thể tạo ra tất cả các dữ liệu của bạn sử dụng TensorFlow đường ống. Tuy nhiên, nếu hiệu suất là không quan trọng, bạn có thể treo lên một mảng NumPy đến một đường ống đầu vào bằng cách sử dụng slice_input_producer. Dưới đây là một ví dụ với một số Print nút để xem những gì đang xảy ra (tin nhắn trong Print đi đến stdout khi nút được chạy)

tf.reset_default_graph() 

num_examples = 5 
num_features = 2 
data = np.reshape(np.arange(num_examples*num_features), (num_examples, num_features)) 
print data 

(data_node,) = tf.slice_input_producer([tf.constant(data)], num_epochs=1, shuffle=False) 
data_node_debug = tf.Print(data_node, [data_node], "Dequeueing from data_node ") 
data_batch = tf.batch([data_node_debug], batch_size=2) 
data_batch_debug = tf.Print(data_batch, [data_batch], "Dequeueing from data_batch ") 

sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
tf.get_default_graph().finalize() 
tf.start_queue_runners() 

try: 
    while True: 
    print sess.run(data_batch_debug) 
except tf.errors.OutOfRangeError as e: 
    print "No more inputs." 

Bạn sẽ thấy một cái gì đó như thế này

[[0 1] 
[2 3] 
[4 5] 
[6 7] 
[8 9]] 
[[0 1] 
[2 3]] 
[[4 5] 
[6 7]] 
No more inputs. 

các "8, 9" số không lấp đầy toàn bộ hàng loạt, vì vậy họ không được sản xuất. Ngoài ra tf.Print được in ra sys.stdout, do đó chúng xuất hiện riêng trong Terminal cho tôi.

PS: a tối thiểu của kết nối batch tới một hàng đợi bằng tay khởi tạo là trong github issue 2193

Ngoài ra, nhằm mục đích gỡ lỗi bạn có thể muốn đặt timeout trên phiên của bạn để máy tính xách tay của bạn không IPython treo trên dequeues hàng đợi rỗng . Tôi sử dụng chức năng helper này cho các phiên tôi

def create_session(): 
    config = tf.ConfigProto(log_device_placement=True) 
    config.gpu_options.per_process_gpu_memory_fraction=0.3 # don't hog all vRAM 
    config.operation_timeout_in_ms=60000 # terminate on long hangs 
    # create interactive session to register a default session 
    sess = tf.InteractiveSession("", config=config) 
    return sess 

Khả năng mở rộng Ghi chú:

  1. tf.constant inlines sao chép dữ liệu của bạn vào Graph. Có giới hạn cơ bản là 2GB trên kích thước của Định nghĩa đồ thị, vì vậy đó là giới hạn trên về kích thước của dữ liệu
  2. Bạn có thể vượt qua giới hạn đó bằng cách sử dụng v=tf.Variable và lưu dữ liệu vào đó bằng cách chạy v.assign_op với tf.placeholder ở bên phải và ăn mảng numPy để giữ chỗ (feed_dict)
  3. đó vẫn tạo ra hai bản sao của dữ liệu, vì vậy để tiết kiệm bộ nhớ bạn có thể làm phiên bản của riêng bạn slice_input_producer mà hoạt động trên các mảng numPy, và tải lên hàng cùng một lúc sử dụng feed_dict
+2

Ahh, vâng! Bạn hoàn toàn đúng - ngay khi bạn nói: "Tôi nghĩ rằng bạn đang trộn các phần bắt buộc và đồ thị-xây dựng ở đây", tôi bắt đầu thấy nơi tôi đã đi sai. Tôi đã đăng chỉnh sửa cho câu hỏi của mình bao gồm mã mới nhất mà tôi đặt cùng nhau, điều này thực sự khiến tôi gần gũi hơn với những gì tôi muốn - tôi có thể đọc thành công dữ liệu CSV và theo dõi theo cách mà tôi có thể đào tạo mô hình. –

+2

Tôi đề nghị cập nhật câu trả lời này để nó hoạt động với các phiên bản gần đây của TensorFlow: thay thế 'tf.slice_input_producer()' bằng 'tf.train.slice_input_producer()' (và tương tự cho một số hàm khác). Và cũng thêm 'sess.run (tf.initialize_local_variables())' sau 'sess.run (tf.initialize_all_variables())'. – MiniQuark

+0

Một số thay đổi khác cần thực hiện: 'pack()' bây giờ là 'stack()', và 'initialize_all_variables()' nên được thay thế bằng 'global_variables_initializer()' và 'local_variables_initializer()'. – MiniQuark

11

Hoặc bạn có thể thử điều này, mã tải tập dữ liệu Iris vào tensor dòng chảy sử dụng gấu trúc và numpy và một đầu ra nơron đơn giản được in trong phiên. Hy vọng nó sẽ giúp cho một sự hiểu biết cơ bản .... [Tôi havent thêm cách của một nhãn giải mã nóng].

import tensorflow as tf 
import numpy 
import pandas as pd 
df=pd.read_csv('/home/nagarjun/Desktop/Iris.csv',usecols = [0,1,2,3,4],skiprows = [0],header=None) 
d = df.values 
l = pd.read_csv('/home/nagarjun/Desktop/Iris.csv',usecols = [5] ,header=None) 
labels = l.values 
data = numpy.float32(d) 
labels = numpy.array(l,'str') 
#print data, labels 

#tensorflow 
x = tf.placeholder(tf.float32,shape=(150,5)) 
x = data 
w = tf.random_normal([100,150],mean=0.0, stddev=1.0, dtype=tf.float32) 
y = tf.nn.softmax(tf.matmul(w,x)) 

with tf.Session() as sess: 
    print sess.run(y) 
+0

Điều này rất có tính hướng dẫn, nhưng nếu tôi hiểu chính xác nó không cho thấy cách sử dụng dữ liệu để huấn luyện ... – dividebyzero

+0

vâng, tôi sẽ thêm họ sớm ... Nó sẽ là tầm thường không phải là nó .... tính toán sự mất mát, chạy an tối ưu hóa tôi sẽ thêm chúng sớm –

+2

Hi dividebyzero, xin lỗi tôi đến muộn! Tôi tìm thấy một liên kết khác thú vị và thực sự giúp giảm bớt vấn đề https: //www.tensorflow.org/tutorials/tflearn/.... Tại đây bạn có thể tải các tệp csv, đào tạo chúng, thực hiện phân loại ... –

Các vấn đề liên quan