मैं TensorFlow की दुनिया के लिए अपेक्षाकृत नया हूँ, और आप वास्तव में CSV डेटा को TensorFlow में प्रयोग करने योग्य उदाहरण / लेबल टेनर्स में कैसे पढ़ेंगे, इस बात से बहुत हैरान हैं । CSV डेटा पढ़ने पर TensorFlow ट्यूटोरियल से उदाहरण बहुत ही खंडित है और केवल आपको CSV डेटा पर प्रशिक्षण देने में सक्षम होने के तरीके का हिस्सा है।
यहाँ मेरा कोड है जो मैंने एक साथ pieced है, उस 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 फ़ाइल से एक-एक करके प्रत्येक उदाहरण को प्रिंट करता है , जो कि, जबकि अच्छा है, प्रशिक्षण के लिए बहुत बेकार है।
यहां मैं जो संघर्ष कर रहा हूं वह यह है कि आप वास्तव में उन व्यक्तिगत उदाहरणों को कैसे बदल देंगे, एक-एक करके, एक प्रशिक्षण डाटासेट में लोड किया जाता है। उदाहरण के लिए, यहाँ एक नोटबुक है जो मैं उडनेस डीप लर्निंग कोर्स में काम कर रहा था। मैं मूल रूप से CSV डेटा लेना चाहता हूं, जिसे मैं लोड कर रहा हूं, और उसे ट्रेन_डैटसेट और 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)
ऊपर दी गई कोड की लाइन) जानना बहुत ही अशुभ लगता है
- आपके द्वारा प्रोसेस की जाने वाली लाइनों की संख्या (
संपादित करें: जैसे ही यारोस्लाव ने बताया कि मैं यहाँ अनिवार्य और ग्राफ-निर्माण भागों को मिला रहा था, यह स्पष्ट होने लगा। मैं निम्नलिखित कोड को एक साथ खींचने में सक्षम था, जो मुझे लगता है कि 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)