如何使用tf.data和map加载批量的CSV文件

时间:2018-04-03 16:47:26

标签: python tensorflow

我一直在寻找一个答案,说明我应该如何解决这个问题很长一段时间,但似乎找不到任何有效的方法。

我正在关注使用找到的here tf.data API的教程。我的场景与本教程中的场景非常相似(即我有3个包含所有训练/验证/测试文件的目录),但是,它们不是图像,而是将光谱图保存为CSV。

我找到了一些用于读取CSV行的解决方案,其中每行是一个训练实例(例如How to *actually* read CSV data in TensorFlow?)。但我对此实现的问题是所需的record_defaults参数,因为CSV为500x200。

这就是我的想法:

import tensorflow as tf
import pandas as pd

def load_data(path, label):
   # This obviously doesn't work because path and label
   # are Tensors, but this is what I had in mind...
   data = pd.read_csv(path, index_col=0).values()
   return data, label

X_train = tf.constant(training_files)  # training_files is a list of the file names
Y_train = tf.constant(training_labels  # training_labels is a list of labels for each file

train_data = tf.data.Dataset.from_tensor_slices((X_train, Y_train))

# Here is where I thought I would do the mapping of 'load_data' over each batch
train_data = train_data.batch(64).map(load_data)

iterator = tf.data.Iterator.from_structure(train_data.output_types, \
                                           train_data.output_shapes)
next_batch = iterator.get_next()
train_op = iterator.make_initializer(train_data)

我过去只使用过Tensorflow feed_dict,但我现在需要一种不同的方法,因为我的数据已达到无法再适合内存的大小。

有什么想法?感谢。

3 个答案:

答案 0 :(得分:1)

我建议看一下这个帖子。它提供了一个完整的示例,说明如何使用数据集API从多个csv文件中读取数据。

Tensorflow Python reading 2 files

附录:

不确定问题与今天有多相关..看到评论之后 @markdjthomas提到这里的问题略有不同,他需要一次读取几行而不是一行。以下示例也可以派上用场。在这里分享,以防万一其他人也需要它......

import tensorflow as tf
import numpy as np
from tensorflow.contrib.data.python.ops import sliding

sequence = np.array([ [[1]], [[2]], [[3]], [[4]], [[5]], [[6]], [[7]], [[8]], [[9]] ])
labels = [1,0,1,0,1,0,1,0,1]

# create TensorFlow Dataset object
data = tf.data.Dataset.from_tensor_slices((sequence, labels))

# sliding window batch
window_size = 3
window_shift = 1
data = data.apply(sliding.sliding_window_batch(window_size=window_size, window_shift=window_shift))
data = data.shuffle(1000, reshuffle_each_iteration=False)
data = data.batch(3)
#iter = dataset.make_initializable_iterator()
iter = tf.data.Iterator.from_structure(data.output_types, data.output_shapes)
el = iter.get_next()
# create initialization ops 
init_op = iter.make_initializer(data)

NR_EPOCHS = 3
with tf.Session() as sess:
    for e in range (NR_EPOCHS):
      print("\nepoch: ", e, "\n")
      sess.run(init_op)
      print("1  ", sess.run(el))
      print("2  ", sess.run(el))
      print("3  ", sess.run(el))

输出......

epoch:  0 

1   (array([[[[5]],

        [[6]],

        [[7]]],


       [[[4]],

        [[5]],

        [[6]]],


       [[[1]],

        [[2]],

        [[3]]]]), array([[1, 0, 1],
       [0, 1, 0],
       [1, 0, 1]], dtype=int32))
2   (array([[[[3]],

        [[4]],

        [[5]]],


       [[[2]],

        [[3]],

        [[4]]],


       [[[7]],

        [[8]],

        [[9]]]]), array([[1, 0, 1],
       [0, 1, 0],
       [1, 0, 1]], dtype=int32))
3   (array([[[[6]],

        [[7]],

        [[8]]]]), array([[0, 1, 0]], dtype=int32))

epoch:  1 

1   (array([[[[1]],

        [[2]],

        [[3]]],


       [[[6]],

        [[7]],

        [[8]]],


       [[[2]],

        [[3]],

        [[4]]]]), array([[1, 0, 1],
       [0, 1, 0],
       [0, 1, 0]], dtype=int32))
2   (array([[[[5]],

        [[6]],

        [[7]]],


       [[[3]],

        [[4]],

        [[5]]],


       [[[7]],

        [[8]],

        [[9]]]]), array([[1, 0, 1],
       [1, 0, 1],
       [1, 0, 1]], dtype=int32))
3   (array([[[[4]],

        [[5]],

        [[6]]]]), array([[0, 1, 0]], dtype=int32))

epoch:  2 

1   (array([[[[1]],

        [[2]],

        [[3]]],


       [[[5]],

        [[6]],

        [[7]]],


       [[[2]],

        [[3]],

        [[4]]]]), array([[1, 0, 1],
       [1, 0, 1],
       [0, 1, 0]], dtype=int32))
2   (array([[[[4]],

        [[5]],

        [[6]]],


       [[[3]],

        [[4]],

        [[5]]],


       [[[7]],

        [[8]],

        [[9]]]]), array([[0, 1, 0],
       [1, 0, 1],
       [1, 0, 1]], dtype=int32))
3   (array([[[[6]],

        [[7]],

        [[8]]]]), array([[0, 1, 0]], dtype=int32))

答案 1 :(得分:1)

我也在寻找“如何使用tf.data加载csv文件” ,下面的示例对我来说非常有用。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/iris.py

我希望它也会对您有所帮助。

答案 2 :(得分:0)

我使用Tensorflow(2.0)tf.data读取我的csv数据集。每个课程我都有几个文件夹。每个文件夹包含数千个数据点的csv文件。以下是我用于数据输入管道的代码。希望这会有所帮助。

obj

“ TRAIN_FILES”是一个矩阵(例如pandas数据框),其中第一列是数据点的标签,第二列是包含该数据点的csv文件的路径。