1

我将排队阅读器应用于 tensorflow seq2seq 以避免将整个数据集读入内存并提前处理它们。我没有首先将数据集存储到不同的存储桶文件中,以确保每个批次有一个存储桶大小,因为这也需要很多时间。因此,队列读取器的每批数据可能包含不同桶大小的序列,这导致无法运行原始 seq2seq 模型(假设一批中的数据具有相同的桶大小,并且只选择一个子图取决于要执行的桶大小)

我试过的:

在最初的实现中,与桶一样多的子图被构造成共享相同的参数。它们之间的唯一区别是在其 RNN 过程中应采用的计算时间。我将子图更改为条件图,当为switchTrue 时,将计算bucket_loss此存储桶的 最后,我用来收集所有的损失并在其上构建梯度图。此外,我在每一步都输入一个模型。的大小与桶的大小相同,如果该批次中有第i个桶大小的数据,则对应的第i个切换为True,否则为False。loss_listswitchtf.constant(0.0)loss_listtotal_loss = tf.reduce_sum(loss_list)switches_listswitches_listswitches_list

遇到的问题:

  1. 当反向传播过程通过tf.cond(...) 节点时,我被警告gradient.py一些稀疏张量转换为密集张量
  2. 当我试图获取total_lossorbucket_loss时,有人告诉我:
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.

你能帮我吗:

  • 我该如何解决上面的两个问题?
  • 我应该如何修改图表以满足我的要求?
  • 在一批中训练不同桶大小的数据有什么更好的想法吗?
  • 将异步队列读取器应用到 seq2seq 框架而不首先存储整个数据集的任何更好的想法?
4

1 回答 1

0

我会(确实)完全扔掉桶。使用 dynamic_rnn。这里的想法是用填充符号填充您的批次,该批次所需的数量与该批次的所有成员的长度相同(通常只是相应批次中最长成员的大小)。解决了你所有的四个问题,但是是的,重写有点麻烦。(虽然我一点也不后悔)

我做了很多对我的案例和数据非常特别的事情,因此分享没有意义,但也许你想看看这个实现:TensorFlow中的可变序列长度

于 2016-10-20T07:44:26.477 回答