【发布时间】: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