在TensorFlow中导入巨大的非图像数据集

时间:2018-06-12 09:45:01

标签: python tensorflow machine-learning neural-network hdf5

我有一个大数据集(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)?

2 个答案:

答案 0 :(得分:2)

你绝对应该尝试Dask,它允许你处理不适合内存的数据,它会使计算瘫痪,以便你可以使用你的cpu的所有核心。另外,我建议将数据从hdf移动到parquet,它允许并发读取和写入,从而加快速度。请参阅Wes McKinney(熊猫创作者)深入的链接,并将其与其他格式进行比较。

您可以在Dask中准备片段,准备训练,测试和验证集,并在不超出可用内存的情况下阅读它们。

答案 1 :(得分:0)

如果仍然有人对此主题感兴趣,这是我对这个问题的解决方案。最后,我坚持使用Loompy文件格式,因为这样做确实很方便(请看Loompy here)。为了在模型中导入大量信息,我使用了var doc=DocumentApp.openByUrl('myURL'); var blobos=doc.getBlob(); var outBlob=blobos.getDataAsString(); Logger.log(outBlob) TensorFlow API的from_generator()函数。另外,我创建了一个生成器来根据需要生成数据。

下面是我的输入函数的外观:

tf.data.Dataset