Набор данных Tensorflow, использующий множество сжатых файлов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть большой набор данных, который я хотел бы использовать для обучения в Tensorflow.

Данные хранятся в сжатом цифровом формате (с использованием numpy.savez_compressed).Количество файлов в файле зависит от способа их создания.

В настоящее время я использую объект-генератор на основе последовательностей Keras для обучения, но я бы хотел полностью перейти на Tensorflow без Keras.

Я смотрю на Dataset API на веб-сайте TF, но не совсем очевидно, как я могу использовать это для чтения данных с ошибками.

Моей первой идеей было это

import glob
import tensorflow as tf
import numpy as np

def get_data_from_filename(filename):
   npdata = np.load(open(filename))
   return npdata['features'],npdata['labels']

# get files
filelist = glob.glob('*.npz')

# create dataset of filenames
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_from_filename)

Однако, это передает заполнитель TF Тензор в настоящую функцию numpy, и numpy ожидает стандартную строку.Это приводит к ошибке:

File "test.py", line 6, in get_data_from_filename
   npdata = np.load(open(filename))
TypeError: coercing to Unicode: need string or buffer, Tensor found

Другой вариант, который я рассматриваю (но кажется грязным), состоит в создании объекта набора данных, построенного на заполнителях TF, который я затем заполняю во время цикла epoch-batch из моего numpy.файлы.

Есть предложения?

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете определить оболочку и использовать pyfunc следующим образом:

def get_data_from_filename(filename):
   npdata = np.load(filename)
   return npdata['features'], npdata['labels']

def get_data_wrapper(filename):
   # Assuming here that both your data and label is float type.
   features, labels = tf.py_func(
       get_data_from_filename, [filename], (tf.float32, tf.float32)) 
   return tf.data.Dataset.from_tensor_slices((features, labels))

# Create dataset of filenames.
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_wrapper)

Если ваш набор данных очень большой и у вас есть проблемы с памятью, вы можете использовать комбинацию interleave илиМетоды parallel_interleave и from_generator .Метод from_generator использует py_func для внутреннего использования, поэтому вы можете непосредственно прочитать ваш файл np и затем определить свой генератор в python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...