В структуре tensorflow seq2seq, как обучать данные разного размера ведра в одном пакете

Я применил поставил читатель в очередь в tensorflow seq2seq, чтобы избежать чтения всего набора данных в память и обработать их все заранее. Сначала я не разбивал набор данных на разные файлы корзины, чтобы гарантировать, что один размер корзины для каждой партии также займет много времени. Как следствие, каждый пакет данных из считывателя очереди может содержать последовательности разного размера сегмента, что приводит к сбою запуска исходной модели seq2seq (предполагается, что данные в одном пакете имеют одинаковый размер сегмента, и выбираются только один подграф в зависимости от размера корзины для выполнения)

Что я пробовал:

В исходной реализации подграфы, равно как и сегменты, создаются с использованием одних и тех же параметров. Единственная разница между ними заключается во времени вычислений, которое должно быть выполнено во время процесса RNN. Я изменил подграф на условный, который, когда switch равен True, будет вычислять bucket_loss этого ведра и добавлять его к loss_list, а когда switch равен False, ничего не делать и добавлять tf.constant(0.0) к loss_list. Наконец, я использую total_loss = tf.reduce_sum(loss_list), чтобы собрать все потери и построить на нем градиентный график. Кроме того, я добавляю switches_list в модель на каждом этапе. Размер switches_list такой же, как и у сегментов, и если в этом пакете есть какие-либо данные размера i-го сегмента, соответствующий i-й переключатель в switches_list будет иметь значение True, в противном случае — False.

Возникшие проблемы:

  1. когда процесс обратного распространения проходил через узел tf.cond(...), меня предупредил gradient.py, что некоторые разреженные тензоры трансформируются в плотные
  2. когда я попытался получить total_loss или bucket_loss, мне сказали:
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.

Не могли бы вы помочь мне:

  • Как я могу решить две проблемы выше?
  • Как мне изменить график, чтобы он соответствовал моему требованию?
  • Есть ли лучшие идеи для обучения данных разного размера ведра в одной партии?
  • Есть ли лучшие идеи для применения асинхронного считывателя очереди к фреймворку seq2seq без предварительного разделения всего набора данных?

person Nick    schedule 20.10.2016    source источник


Ответы (1)


Я бы (действительно) полностью отказался от ковша. Используйте dynamic_rnn. Идея здесь состоит в том, чтобы заполнить ваш пакет символом заполнения, столько, сколько необходимо для того, чтобы ЭТА партия достигла одинаковой длины для всех членов ЭТОЙ партии (обычно это размер самого длинного члена соответствующей партии). Решает все четыре ваших вопроса, но да, переписать довольно хлопотно. (хотя ничуть не жалею)

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

person Phillip Bock    schedule 20.10.2016