所以我试图将我的csv文件读入python,然后将数据分成训练和测试数据(n-fold交叉验证),然后将其输入我已经制作的深度学习架构中。但是,在阅读了关于如何读取csv文件的TensorFlow教程后,如下所示:
filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"])
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
# Default values, in case of empty columns. Also specifies the type of the
# decoded result.
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(
value, record_defaults=record_defaults)
features = tf.pack([col1, col2, col3, col4])
with tf.Session() as sess:
# Start populating the filename queue.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(1200):
# Retrieve a single instance:
example, label = sess.run([features, col5])
coord.request_stop()
coord.join(threads)
除了for循环的末尾部分之外,这个代码中的所有内容都是有意义的。
问题1:for循环中1200的重要性是什么?是从数据中获取的记录数吗?
本教程的下一部分将讨论如何在代码中批量处理示例:
def read_my_file_format(filename_queue):
reader = tf.SomeReader()
key, record_string = reader.read(filename_queue)
example, label = tf.some_decoder(record_string)
processed_example = some_processing(example)
return processed_example, label
def input_pipeline(filenames, batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer(
filenames, num_epochs=num_epochs, shuffle=True)
example, label = read_my_file_format(filename_queue)
# min_after_dequeue defines how big a buffer we will randomly sample
# from -- bigger means better shuffling but slower start up and more
# memory used.
# capacity must be larger than min_after_dequeue and the amount larger
# determines the maximum we will prefetch. Recommendation:
# min_after_dequeue + (num_threads + a small safety margin) * batch_size
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
我知道这是异步的,代码会阻塞,直到收到所有内容。当我在代码运行后查看example和label的值时,我看到每个代码只保存数据中一条特定记录的信息。
问题2:“read_my_file”下的代码是否应该与我发布的第一个代码块相同?然后是input_pipeline函数将各个记录一起批处理到某个batch_size?如果read_my_file函数与第一个代码块相同,为什么循环没有相同的内容(这可以追溯到我的第一个问题)
我很感激任何澄清,因为这是我第一次使用TensorFlow。谢谢你的帮助!
答案 0 :(得分:3)
(1)1200是任意的 - 我们应该修复这个例子,在那里使用一个命名常量来使它更清晰。感谢您发现它。 :)通过设置the CSV reading example的方式,继续读取将根据需要多次读取两个CSV文件(保持文件名的string_input_producer
没有提供num_epochs
参数,所以它默认为永远骑自行车)。所以1200就是程序员在示例中选择检索的记录数。
如果您只想读取文件中的示例数,可以捕获输入器用完输入时抛出的OutOfRangeError
,或者读取确切的记录数。有一个新的阅读操作正在进行中,这也应该有助于使其更容易,但我不认为它包含在0.9中。
(2)它应该设置一组非常相似的操作,但实际上并不是读取。请记住,您在Python中编写的大部分内容都是构建一个图形,这是TensorFlow将执行的一系列操作。所以read_my_file中的东西几乎就是创建tf.Session()
之前的东西。在上面的示例中,for循环中的代码实际上是执行tf图以将示例提取回python。但是在示例的第二部分中,您只是设置管道以将项目读入Tensors,然后添加使用这些张量的其他操作并执行一些有用的操作 - 在这种情况下,将它们放入队列以创建更大的批次,这些批次本身可能会被其他TF操作用于以后消费。