读入大型CSV文件并输入TensorFlow

时间:2016-06-10 19:38:43

标签: python csv asynchronous tensorflow

所以我试图将我的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。谢谢你的帮助!

1 个答案:

答案 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操作用于以后消费。