我有一个大数据集(300,000个例子x 33.000个功能),当然这不符合记忆。数据以HDF5和(基于HDF5的内部)Loom格式保存。值大多为零(稀疏数据)。它们看起来像这样:
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 ...
239906 RP11-14 0 0 0 0 0 0 0 0 ...
241599 RP11-.9 0 0 0 0 0 0 0 0 ...
279928 FO538.3 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中加载整个数据集:
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))
...
然而,这种方式,我无法在训练,测试和评估集中分割我的数据。另外,我只能在每个批次中对它们进行洗牌,这是无效的,因为批次上的数据大多数都属于同一个类。
一种解决方案是在训练集,测试集和评估集中拆分数据集,进行一些改组,然后将它们加载到我的脚本中。虽然我觉得这有点静态,这意味着每个数据集都会有相同的数据。
将数据保存到TFRecords会更好吗?大多数示例都与图像相关,所以我还没有弄清楚如何使用像33.000这样的数据集这样做...
我一直在阅读有关队列的信息,关于tf.Data API(现在比队列更好,更麻烦),feed_dict
表现不佳,TFRecords等。我已经忘记了所有最近的更新,大多数搜索最终都会被弃用。
我想要的只是在TensorFlow上加载这些数据,能够在train,test,eval中分割它们。设置,进行批处理,改组等,尽可能多地使用我的TitanX。
任何解决方案或指向正确的来源都将受到高度赞赏。