【问题标题】:Best way of constructing batched Numpy array from CSV values?从 CSV 值构造批处理 Numpy 数组的最佳方法?
【发布时间】:2020-02-11 12:29:30
【问题描述】:

我有一个非常大的 CSV 格式数据集(500K+ 行和 6500+ 列),看起来像这样(所有内容都是整数值,然后在批量导入循环期间转换为 float64):

1,7930472962,92,5,2,9471037239,67,2,1...8371097814,81,2,3
2,2091185638,92,5,2,3773622239,67,2,1...8378747918,81,2,3

因此,根据行的长度,我无法将所有内容都放入内存中,因此我正在从 CSV 流式传输所有内容,如下所示:

train_dataset = tf.data.experimental.make_csv_dataset(
    sys.argv[1],
    batch_size = BATCHSIZE,
    column_names = SELECT_COLUMNS,
    column_defaults = DEFAULTS,
    label_name = LABEL_COLUMN,
    field_delim=',',
    use_quote_delim=True,
    na_value='',
    header=False,
    num_epochs=1,
    shuffle=True,
    shuffle_buffer_size=500,
    shuffle_seed=None,
    num_parallel_reads=1,
    sloppy=False,
    num_rows_for_inference=1000,
    compression_type=None,
    ignore_errors=False
)

我最终得到一个 dict,然后我可以以这种方式从中提取 numpy 数组:

for batch, label in train_dataset:
    for key, value in batch.items():
       print(value.numpy())

问题是,对于每个批次,Numpy 数组都按列将所有内容分组在一起,而我需要将批次中的每个 CSV 行转换为 ndarray,基本上是 ndarray 中批次中的多个嵌套 ndarray,以便我可以做一些事情像这样:

(x_train, _), (x_test, _) = loader.load_data()
train_dataset = tf.data.Dataset.from_tensor_slices(x_train)
train_dataset = train_dataset.shuffle(buffer_size=train_buf)
train_dataset = train_dataset.batch(batch_size)

我很难理解过渡到 2.0 espe,然后是 shuffle 操作——特别是就 tf.data 而言。我想我需要先将每个 CSV 行打包成张量切片,然后使用 tf.data.Dataset.from_tensor_slices() 创建数据集?

提前致谢

【问题讨论】:

  • 当您说“Numpy 数组按列将所有内容分组在一起时,我不确定您的意思是什么,而我需要将批处理中的每个 CSV 行转换为一个 ndarray,基本上是多个嵌套的 ndarray ndarray 中的批处理...”您希望整个事物成为 1 个大数组,并且代码当前正在为您提供列列表?
  • 我可以使用以下方法从每批中提取 ndarray:for batch, label in train_dataset.take(1): for key, value in batch.items(): sys.stdout.write(str(value.numpy())) [301 181 342][84620723843 84620723843 84620723843][50 50 50][7 8 2][4 4 4 ][832099103 8320991093 8320991093][2 5 3] 问题是,ndarrays 是根据每一列分组的,而不是每个 CSV 行的单个 ndarray,如果这有意义吗?
  • 您能描述一下输入数据的格式吗?这可能有助于使事情更清楚。你是从 csv 文件中读取数据吗?
  • 是的,输入是一个 CSV 文件:1,7930472962,92,5,2,9471037239,67,2,1...8371097814,81,2,3 2,2091185638,92,5 ,2,3773622239,67,2,1...8378747918,81,2,3
  • 那么你想要的输出到底是什么?如果您只是从 csv 中获取所有数据作为 numpy 数组,您可以管理 tensorflow 的东西吗?

标签: numpy csv tensorflow tensorflow-datasets numpy-ndarray


【解决方案1】:

我建议你使用tf.data.experimental.make_csv_dataset(THECSVFILE.csv) 定义的here,然后这是tf.data 类型,可以输入模型并且它不会填满你的内存,但是,如果你对整个数据集进行洗牌,那么您可能会看到一些内存增加。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2023-03-25
    • 2015-02-28
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多