我在TensorFlow领域相对较新,对您如何 实际
将CSV数据读取到TensorFlow中可用的示例/标签张量中感到困惑。TensorFlow教程中有关读取CSV数据的示例相当分散,仅使您成为能够训练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深度学习课程中正在使用的笔记本。我基本上想获取要加载的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)
综上所述,这是我的问题:
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)
我认为您在这里混淆了命令性和图形构造部分。该操作将tf.train.shuffle_batch
创建一个新的队列节点,并且可以使用一个节点来处理整个数据集。因此,我认为您之所以绞尽脑汁,是因为您shuffle_batch
在for循环中创建了一堆队列,而没有为其启动队列运行器。
正常的输入管道用法如下所示:
shuffle_batch
到输入管道-–图形构造结束,命令式编程开始-
tf.start_queue_runners
while(True): session.run()
为了更具可扩展性(避免使用Python
GIL),您可以使用TensorFlow管道生成所有数据。但是,如果性能不是很关键,则可以使用slice_input_producer.
以下示例将一个numpy数组连接到输入管道:这是一个带有一些Print
节点的示例,以查看发生了什么(Print
运行节点时进入stdout的消息)
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."
你应该看到这样的东西
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
[[0 1]
[2 3]]
[[4 5]
[6 7]]
No more inputs.
“ 8、9”数字没有填满整个批次,因此没有得到生产。还tf.Print
可以打印到sys.stdout,因此它们对我来说分别显示在Terminal中。
PS:连接batch
到手动初始化的队列的最低要求在github问题2193中
另外,出于调试目的,您可能需要timeout
在会话上进行设置,以使IPython Notebook不挂在空队列出队中。我在会话中使用此帮助器功能
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
可伸缩性注意事项:
tf.constant
将您的数据副本内联到Graph中。Graph定义的大小有2GB的基本限制,因此这是数据大小的上限v=tf.Variable
和保存数据到那里通过运行v.assign_op
一个tf.placeholder
在右侧和喂养numpy的阵列到占位符(feed_dict
)slice_input_producer
在numpy数组上运行,并使用feed_dict
我正在为REST API编写JMeter测试。这是一个post请求,我们需要在请求正文中发送一个大的xml内容。所以我使用CSV数据集配置来参数化身体部位中的xml内容。 我为HTTP请求采样器创建了一个CSV数据集配置。 在csv文件中,我正在编写整个xml内容。1行用于1个请求。它工作得很好。 但是我发现这有点复杂,因为我们必须在csv文件中维护大量的xml。 有没有办法在csv文件中只写入x
尝试创建一个程序,要求用户输入一个位置,如果用户输入,即南,它可以从csv中的“位置”列中读取,无论哪一行包含“南”(接受大写或小写),都会打印名称列中的名称。因此,如果用户输入南,将返回Holos和Deafer。 我似乎找不到如何实际打印包含匹配输入的特定行,只能打印整个列。 非常感谢您的帮助! csv 只读取特定列的当前代码
本文向大家介绍如何使用JavaScript从* .CSV文件读取数据?,包括了如何使用JavaScript从* .CSV文件读取数据?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript读取.CSV,请使用开源CSV解析器Papa Parser。以下是功能- 开源的 使用多线程CSV解析器解析数百万个数据 支持多种网络浏览器 使用解析器,您可以轻松地跳过注释字符 假设您的CSV文件
我在尝试生成一个简单DF的共线性分析时遇到了问题(见下文)。我的问题是,每次尝试运行该函数时,都会检索到以下错误消息: 下面是我正在使用的代码 我试图运行函数的DF如下所示。 我在这里有两个猜测;但不知道如何解决这个问题: -猜测1:np。arrange导致与标头发生某种冲突 -猜想2:问题来自blankseperator,它阻止函数正确地从一列跳转到另一列。问题是,我的CSV文件已经有分隔符(我
我遇到了一个挑战,我必须读取CSV文件并将其读取,直到定义的可变大小限制(BATCH_SIZE)。读取 CSV 中的行数后,将其发送到不同的 AWS API。由于我的CSV文件大小可以是1Gb到2Gb的任何地方,因此我避免使用JSR223 CSV文件读取。我想知道如何使用JMeter和CSV数据集配置来实现它。