Tensorflow Dataset打开几个文件并保持它们分开



我试图有一个3d数据集,每个数据点是在一个单独的csv文件组成的行和我的功能是在列我已经尝试了几种方法将文件列表添加到数据集

files = os.listdir("path")
dataset = tf.data.Dataset.from_tensor_slices(files)

dataset = tf.data.Dataset.list_files("path/*.csv")

和两者似乎都工作,但然后打开文件我不能依赖于Dataset.TextLineDataset,因为它会使我所有的数据变成一个大的2d数据集

我试过使用

dataset = dataset.map(parse_file)

def parse_file(filename):
data = np.genfromtxt(str(filename), delimiter=',')
return data

将它作为一个数组但是我得到了错误

OSError: Tensor("args_0:0", shape=(), dtype=string) not found.

我做错了什么?

编辑:数据看起来像这样,它是几个文件,都在这种形式(没有头):

1498561981000,51.89105,12.41285,0
1498562341000,51.891052,12.412848,0
1498562566000,51.891045,12.412857,0
...

最后,我想要一个3d表示,其中第一个维度是文件,第二个是行,第三个是列像

[
[[1498561981000,51.89105,12.41285,0],[1498562341000,51.891052,12.412848,0],[1498562566000,51.891045,12.412857,0]],  
[[1498561981000,51.89105,12.41285,0],[1498562341000,51.891052,12.412848,0],[1498562566000,51.891045,12.412857,0]]
...
]

您遇到的错误是因为您试图在map调用中使用python/numpy函数。出于性能考虑,f。data在图模式下运行它的op,这意味着传递给map的每个函数要么应该是tensorflow原生的,要么应该包装在tf.python_func/tf.numpy_func中。当涉及到像读取文件这样的I/O操作时,它真的很棘手,在这些操作中,几乎必须使用本地tensorflow函数。

这是一种读取csv并将其放入数据集的方法。数据集的每个元素在一个csv文件中。

import tensorflow as tf
def read_csv(filepath):
content = tf.io.read_file(filepath)
# taking care of trailing whitespace
content_no_trailing = tf.strings.strip(content)
lines = tf.strings.split(content_no_trailing, sep="n")
values = tf.map_fn(lambda x: tf.strings.split(x, sep=","), lines)
# we have to nest two calls to map_fn, one for each line, then for each columns
float_values = tf.map_fn(
lambda x: tf.map_fn(tf.strings.to_number, x, fn_output_signature=tf.float32),
values,
fn_output_signature=tf.float32,
)
return float_values
files = ["test1.csv", "test2.csv"] # or any way to get a list of file names
list_ds = tf.data.Dataset.from_tensor_slices(files)
ds = list_ds.map(read_csv)

写入文件test1.csv"和test2.csv"具有相同的内容,然后循环该数据集,我们看到:

>>> for elem in ds:print(elem)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
[1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
[1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
[1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
[1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)