Файл Tensorflow TFrecord неравного размера - PullRequest
1 голос
/ 01 апреля 2019

В настоящее время я делю свои данные на несколько файлов TFrecord, а затем читаю данные, перетасовывая и чередуя их.Мой код ниже:

path_to_files = glob('train_*.tfrecord')
n_files = len(path_to_files)
tf_dataset = tf.data.Dataset.list_files(path).shuffle(n_files)
tf_dataset = tf_dataset.interleave(lambda filename: tf.data.TFRecordDataset(filename, num_parallel_reads=4).map(parseFunc), cycle_length=n_files)
tf_dataset = tf_dataset.shuffle(buffer_size=n_files*3)  
tf_dataset = tf_dataset.batch(batchsize)
tf_dataset = tf_dataset.prefetch(buffer_size=batchsize)

У меня есть 2 вопроса:

1) Делает ли моя треска то, что я намереваюсь сделать.А именно, делает ли он случайным образом выборки из каждого файла TFrecord в равной степени

2) Что произойдет, если файлы TFrecord содержат очень разное количество выборок (например, 1 будет иметь 50 выборок и еще 500).Влияет ли это на случайность вообще?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Итак, я запустил симуляцию, чтобы проверить это следующим образом: я сохранил 3 файла с: файл 1: ~ 1000 выборок файла № 1 2: ~ 2000 выборок файла № 2 3: ~ 3000 выборок № 3

Затем я загружал итератор приведенным выше кодом и выбирал пакеты, пока итератор не закончился.Ниже приведены мои результаты.

enter image description here

Как видно на рисунке, TF НЕ взвешивает файлы TFrecord по их размеру, когда он случайным образом выбирает их.Скорее, он случайным образом выбирает из каждого из файлов неравного размера с равной вероятностью, пока в одном из них не закончатся выборки.Затем он продолжается с каждого из оставшихся файлов с равной вероятностью.

Возьмите домой: чтобы иметь действительно случайную выборку, убедитесь, что ваши файлы TFrecord имеют одинаковый размер или метки равномерно распределены между ними

0 голосов
/ 02 апреля 2019

Q1: не совсем.Прежде всего, эта строка не нуждается в явном перемешивании, list_files уже имеет этот параметр.Его можно контролировать по начальному значению.

tf_dataset = tf.data.Dataset.list_files(path, shuffle=True, seed=1).

Без функции повтора вы получите ошибку конца последовательности, когда итератор исчерпает все ваши файлы.Так и должно быть.Если значение None передано в качестве значения, оно будет повторяться бесконечно, или вы можете установить точное количество эпох.

tf_dataset = tf.data.Dataset.list_files(path, shuffle=True, seed).repeat()

Q2: Это нормально, если размеры файлов различны.Единственным результатом является то, что содержимое большого файла будет иметь более высокий шанс выбора итератором.Но это не повлияет на случайность.Эта строка выполнит свою работу, перетасовывая чередующийся набор данных.Единственное, что нужно помнить, это то, что случайный буфер контролирует количество данных, загружаемых в память.Обычно рекомендуется указывать количество примеров в наборе данных (количество всех примеров во всех файлах), но в некоторых случаях это может привести к значительным накладным расходам и даже вызвать OOM.

tf_dataset = tf_dataset.shuffle(buffer_size=n_files*3)  
...