【问题标题】:Tensorflow Dataset open several files and keep them separatedTensorflow 数据集打开几个文件并将它们分开
【发布时间】:2021-02-12 08:48:30
【问题描述】:

我正在尝试拥有一个 3d 数据集,每个数据点都在一个由行组成的单独 csv 文件中,我的特征在列中 我尝试了几种将文件列表添加到数据集的方法

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

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

两者似乎都有效,但是打开文件我不能依赖Dataset.TextLineDataset,因为它会将我的所有数据变成一个大的二维数据集

我尝试过使用

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]]
...
]

【问题讨论】:

  • 您可以添加数据样本吗?即你的 csvs(或模拟数据)的第一行,以及你想要达到的结果?
  • 我刚刚用数据示例进行了编辑(顺便说一下,分隔符是错误的,但这似乎不是问题),数据非常简单

标签: python tensorflow tensorflow-datasets


【解决方案1】:

您遇到的错误是因为您试图在 map 调用中使用 python/numpy 函数。出于性能原因,tf.data 以图形模式运行其操作,这意味着传递给 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)

【讨论】:

  • 这似乎是我确实需要的,唯一剩下的问题是我所有的 csv 文件最后都有一个空行,这似乎破坏了解析文件的过程关于如何避免这种情况还是我只需要更改我的所有文件以不具有该结束行? (我宁愿避免使用这种解决方案,因为这是我使用 csv.writer.writerows 时自动写入文件的方式)
  • 您可以使用tf.strings.strip,我编辑了我的答案,添加了该功能。,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2018-05-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多