Я работаю с тензорным потоком, надеясь научить глубокую CNN предсказывать ходы для игры Go. Созданный мной набор данных состоит из 100 000 файлов двоичных данных, каждый из которых соответствует записанной игре и содержит примерно 200 обучающих выборок (по одной на каждый ход в игре). Я считаю, что при использовании SGD будет очень важно добиться хорошего перемешивания. Я бы хотел, чтобы мои партии содержали образцы из разных игр И образцы из разных этапов игр. Так, например, простое чтение одного сэмпла из начала 100 файлов и перемешивание не очень хорошо, потому что все эти 100 сэмплов будут первым ходом в каждой игре.

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

Итак, мой вопрос: предоставляет ли тензорный поток такую ​​функциональность или было бы проще написать собственный код для создания пакетов?

8
ScoobySnacks 14 Дек 2015 в 03:20

2 ответа

Да, вы хотите использовать комбинацию двух вещей. (Обратите внимание, что этот ответ был написан для TensorFlow v1, и некоторые функции были заменены новыми конвейерами tf.data; я обновил ответы, чтобы указать на совместимые версии вещей v1, но если вы собираетесь этот ответ для нового кода, обратитесь вместо tf.data.)

Во-первых, случайным образом измените порядок, в котором вы вводите свои файлы данных, путем чтения из них с помощью tf.train.string_input_producer с shuffle=True, который используется для любого метода ввода, который вы используете (если вы можете поместить свои примеры в формат tf.Example proto, это легко использовать с parse_example). Для большей ясности вы помещаете список имен файлов в string_input_producer, а затем читаете их другим методом, например read_file и т. Д.

Во-вторых, вам нужно смешивать с более мелкой детализацией. Вы можете сделать это, загрузив примеры ввода в tf.train.shuffle_batch узел с большой емкостью и большим значением min_after_dequeue. Один из особенно хороших способов - использовать shuffle_batch_join, который принимает ввод из нескольких файлов, так что вы получаете много микширования. Установите достаточно большой объем партии, чтобы хорошо перемешать, не истощая оперативную память. Десятки тысяч примеров обычно работают очень хорошо.

Имейте в виду, что пакетные функции добавляют QueueRunner в коллекцию QUEUE_RUNNERS, поэтому вам нужно запустить tf.train.start_queue_runners()

11
dga 23 Дек 2020 в 03:35
Правильно ли я полагаю, что string_input_producer со 100% емкостью и shuffle=True обеспечит идеальное смешивание без необходимости перемешивания пакетов?
 – 
TimZaman
18 Окт 2016 в 11:38
Ссылки не работают
 – 
Dave
6 Дек 2020 в 00:10
Спасибо! Я обновил ответ на (а) указание на новый API tf.data, который следует использовать для нового кода; и (б) указывать на версии v1.compat документации для функций, упомянутых в ответе. Оцените толчок.
 – 
dga
23 Дек 2020 в 03:36

В вашем случае не проблема выполнить некоторую предварительную обработку и создать один файл из всех файлов, которые у вас есть. Для этого типа игр, где история не важна, а позиция определяет все, что ваш набор данных может состоять только из position -> next_move.


Для более широкого случая TF предоставляет все необходимое для перетасовки. Есть два типа перемешивания, которые служат разным целям и перемешивают разные вещи:

  • tf.train.string_input_producer в случайном порядке: логический. Если true, строки случайным образом перемешиваются в пределах каждой эпохи. . Итак, если у вас есть несколько файлов ['file1', 'file2', ..., 'filen'], это случайным образом выбирает файл из этого списка. Если задано значение false, файлы следуют один за другим.
  • tf.train.shuffle_batch Создает пакеты путем случайного перемешивания тензоров . Таким образом, он берет тензоры batch_size из вашей очереди (вам нужно будет создать очередь с помощью tf.train.start_queue_runners) и перемешивает их.
0
Salvador Dali 3 Июл 2017 в 23:19
Ссылки не работают
 – 
Dave
6 Дек 2020 в 00:10