Перестановка набора данных после повторной инициализации итератора в тензорном потоке - PullRequest
0 голосов
/ 22 февраля 2019

Я использую api набора данных tenorflow для подачи данных в модель.Насколько мне известно, я должен перетасовать набор данных для достижения максимальной производительности модели.Тем не менее, так как я тренируюсь для одной эпохи, а затем проверяю для одной эпохи и так далее ... Я не совсем уверен, выполняю ли я тасование по-другому.Для лучшей иллюстрации ниже приведен мой код:

train_dataset = tf.data.TFRecordDataset(filename_train).map(_parse_function).filter(filter_examples)\
            .shuffle(60000, seed=mseed, reshuffle_each_iteration=False) \
            .batch(train_batch_size)
train_iterator = train_dataset.make_initializable_iterator(shared_name="Training_iterator")

Итак, всякий раз, когда я использую весь набор данных, я повторно инициализирую итератор как:

sess.run(train_iterator.initializer)

Это безопасно?Я спрашиваю, потому что во время обучения я получил следующую форму для функции потерь

enter image description here

Следовательно, является ли тасование детерминированным между разными эпохами?

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

1 Ответ

0 голосов
/ 22 февраля 2019

Семя влияет на весь график по умолчанию.Установив seed, вы делаете тасование детерминированным, то есть оно будет поддерживать один и тот же порядок при каждой перестановке.Так что да, вы получите тот же заказ для второй эпохи.Вы также можете установить заполнитель для семян и изменять его каждую эпоху, подробнее об этом здесь https://github.com/tensorflow/tensorflow/issues/13446 Без перетасовки семян становится псевдослучайным

...