Как импортировать большой набор данных в TensorFlow [2018]

У меня большой набор данных (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))

Выход:

(массив ([0, 0, 0, ..., 0, 0, 0], dtype=int32), массив ([b'52'], dtype= объект))

(массив ([0, 0, 0, ..., 0, 0, 0], dtype=int32), массив ([b'52'], dtype= объект))

...

Однако, таким образом, я не могу разделить свои данные на обучающие, тестовые и оценочные наборы. Кроме того, я могу перетасовать их только внутри каждого пакета, что неэффективно, поскольку в большинстве случаев данные в пакете принадлежат одному и тому же классу.

Одним из решений было бы разделить набор данных на обучающие, тестовые и оценочные наборы, сделать некоторые тасования и затем загрузить их в мой сценарий. Хотя у меня есть ощущение, что это было бы довольно статично, то есть у меня всегда будут одни и те же данные в каждом наборе данных.

Будет ли сохранение данных в TFRecords работать лучше? Большинство примеров связаны с изображениями, поэтому я не понял, как это сделать с таким набором данных из 33 000 функций...

Я читал об очередях, об API tf.Data (который сейчас предпочтительнее и меньше хлопот, чем очереди), что feed_dict плохая производительность, TFRecords и т. д. Я потерял все последние обновления, и большинство поисков заканчиваются устаревшей информацией.

Все, что я хочу, - это загрузить эти данные в TensorFlow, чтобы иметь возможность разделять их по поездам, тестам, eval устанавливает, выполняет дозирование, перемешивание и т. д. и максимально использует мой TitanX.

Любые решения или указание на правильный источник будет принята с благодарностью.

0 ответов

Другие вопросы по тегам