我一直在寻找一个答案,说明我应该如何解决这个问题很长一段时间,但似乎找不到任何有效的方法。
我正在关注使用找到的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
,但我现在需要一种不同的方法,因为我的数据已达到无法再适合内存的大小。
有什么想法?感谢。
答案 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文件的路径。