Я применил поставил читатель в очередь в 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.
Возникшие проблемы:
- когда процесс обратного распространения проходил через узел
tf.cond(...)
, меня предупредилgradient.py
, что некоторые разреженные тензоры трансформируются в плотные - когда я попытался получить
total_loss
илиbucket_loss
, мне сказали:
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.
Не могли бы вы помочь мне:
- Как я могу решить две проблемы выше?
- Как мне изменить график, чтобы он соответствовал моему требованию?
- Есть ли лучшие идеи для обучения данных разного размера ведра в одной партии?
- Есть ли лучшие идеи для применения асинхронного считывателя очереди к фреймворку seq2seq без предварительного разделения всего набора данных?