Как реализовать многопоточный импорт массивов numpy, хранящихся на диске в виде набора данных в Tensorflow - PullRequest
0 голосов
/ 07 мая 2018

Ввод и метки моего набора данных хранятся в 10000 .npy файлах каждый. Например inputs/0000.npy,...inputs/9999.npy и labels/0000.npy,...labels/9999.npy. Хотя каждый файл независимо может храниться в памяти, весь набор данных из 20-килобайтных массивов не может быть сохранен в памяти. Я хотел бы реализовать многопоточный конвейер ЦП для импорта набора данных в виде пакетов, скажем, batch_size=8.

Я пытался реализовать функции, упомянутые в новом API данных Tensorflow, но не нашел ни одного примера для моих требований. Все примеры приведены для случаев, когда весь набор данных может быть загружен в ОЗУ. Есть идеи, как к этому подойти?

1 Ответ

0 голосов
/ 07 мая 2018

Я бы использовал tf.data.Dataset.from_generator(), что позволяет вам использовать API данных Tensorflow через пользовательскую функцию генератора питона. Таким образом, вы можете загружать каждый файл .npy итеративно, загружая в память только один файл numpy.ndarray одновременно. Предполагая, что каждый загруженный numpy.ndarray является одним экземпляром, пример кода для вашего случая может выглядеть следующим образом:

import tensorflow as tf
import numpy as np
import os


def gen():
    inputs_path = ""
    labels_path = ""
    for input_file, label_file in zip(os.listdir(inputs_path), os.listdir(labels_path)):
        x = np.load(os.path.join(inputs_path, input_file))
        y = np.load(os.path.join(labels_path, label_file))
        yield x, y


INPUT_SHAPE = []
LABEL_SHAPE = []

# Input pipeline
ds = tf.data.Dataset.from_generator(
    gen, (tf.float32, tf.int64), (tf.TensorShape(INPUT_SHAPE), tf.TensorShape(LABEL_SHAPE)))
ds = ds.batch(8)
ds_iter = ds.make_initializable_iterator()
inputs_batch, labels_batch = ds_iter.get_next()

Я не проверял код. Надеюсь, это поможет!

...