【发布时间】:2018-11-21 16:02:24
【问题描述】:
我有一个大数据集(300.000 个示例 x 33.000 个特征),这当然不适合内存。数据以 HDF5 格式保存。这些值大多为零(稀疏数据)。它们看起来像这样:
Attr1 52 52 52 52 52 52 52 52 ...
Attr2 umb umb umb umb umb umb umb umb ...
CellID TGC-1 TGG-1 CAG-1 TTC-1 GTG-1 GTA-1 CAA-1 CAC-1 ...
Acc Gene ...
243485 RP11-.3 0 0 0 0 0 0 0 0 ...
237613 FAM138A 0 0 0 0 0 0 0 0 ...
186092 OR4F5 0 0 0 0 0 0 0 0 ...
238009 RP11-.7 0 0 0 0 0 0 0 0 ...
239945 RP11-.8 0 0 0 0 0 0 0 0 ...
279457 FO538.2 0 0 0 0 0 0 0 0 ...
228463 AP006.2 0 0 0 0 0 0 0 0 ...
... ... ... ... ... ... ... ... ... ...
我已经完成了以下工作,将整个数据集加载到 TensorFlow 中(loompy 只是一个在后台使用 hdf5 的包):
import tensorflow as tf
import numpy as np
import loompy as lp
batch_size = 1000
with loompy.connect(filename, 'r') as ds:
ds_shape = (batch_size, ds.shape[0])
ds_dtype = ds[0:1, 0:1].dtype
labels = np.asarray([ds.ca.CellID, ds.ca.Attr1]).T
labels_shape = (batch_size, 1)
data_placeholder = tf.placeholder(ds_dtype, ds_shape)
labels_placeholder = tf.placeholder(labels[:,1].dtype, labels_shape)
dataset = tf.data.Dataset.from_tensor_slices((data_placeholder, labels_placeholder))
dataset = dataset.prefetch(batch_size)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()
with tf.Session() as sess:
with loompy.connect(filename, 'r') as ds:
for i in range(0, ds.shape[1], batch_size):
batch = ds[0 : ds_shape[1], i : i + batch_size].T
batch_labels = np.asarray([ds.ca.CellID[i : i + batch_size],
ds.ca.Attr1[i : i + batch_size]]).T[:,1]
sess.run(iterator.initializer, feed_dict = {data_placeholder: batch,
labels_placeholder: batch_labels.reshape(batch_size, 1)})
for _ in range(batch_size):
print(sess.run(next_element))
输出:
(array([0, 0, 0, ..., 0, 0, 0], dtype=int32), array([b'52'], dtype=object))
(array([0, 0, 0, ..., 0, 0, 0], dtype=int32), array([b'52'], dtype=object))
...
但是,通过这种方式,我无法在训练、测试和评估集中拆分数据。另外,我只能在每个批次中对其进行洗牌,这并不有效,因为大多数时候批次上的数据属于同一类。
如何处理此类数据,以便能够将它们加载为训练集、测试集、评估集并执行洗牌等(最好尽可能多地利用我的 TitanX GPU)?
【问题讨论】:
-
您可能想要使用 tfrecords 并将它们存储在稀疏特征中:tensorflow.org/versions/r1.2/api_docs/python/tf/SparseFeature
-
@vijaym TFRecords 的问题是大多数示例都与图像相关,所以我还没有弄清楚如何使用这样的数据集来做到这一点。你能指出我正确的来源吗?
-
您可以查看我对 Numpy 数组的回答,您可能需要对稀疏矩阵进行一些更改:stackoverflow.com/questions/45427637/…
-
您是否愿意对磁盘上的数据进行第二次(混洗和拆分)副本?有许多大型数据处理工具可以为您做到这一点。
-
@Omegastick 我对所有可以正常工作的东西持开放态度。你能说出你所说的工具吗?
标签: python tensorflow machine-learning neural-network hdf5