在tensorflow seq2seq框架中,如何在一批中训练不同桶大小的数据

在tensorflow seq2seq框架中,如何在一批中训练不同桶大小的数据,tensorflow,buckets,Tensorflow,Buckets,我应用了tensorflow seq2seq,以避免将整个数据集读入内存,并提前处理它们。我没有首先将数据集存储到不同的存储桶文件中,以确保每批处理一个存储桶大小,因为这也需要很多时间。因此,来自队列读取器的每批数据可能包含不同存储桶大小的序列,这导致无法运行原始seq2seq模型(假设一批数据的存储桶大小相同,并且根据要执行的存储桶大小仅选择一个子图) 我尝试过的: 在最初的实现中,子图(多达bucket)被构造为共享相同的参数。它们之间的唯一区别是在RNN过程中应进行的计算次数。 我将子图更

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

我尝试过的:

在最初的实现中,子图(多达bucket)被构造为共享相同的参数。它们之间的唯一区别是在RNN过程中应进行的计算次数。 我将子图更改为条件图,当
开关
为真时,该子图将计算该桶的
桶损失
,并将其添加到
损失列表
,当
开关
为假时,该子图将不执行任何操作,并将
tf.常量(0.0)
添加到
损失列表
。最后,我使用
total\u loss=tf.reduce\u sum(loss\u list)
收集所有损失并在其上构建梯度图。此外,我在每一步都将一个
开关列表
输入到模型中。
switches\u list
的大小与bucket的大小相同,如果该批中有第i个bucket大小的数据,则
switches\u list
中对应的第i个开关将为True,否则为False

遇到的问题:

  • 当反向传播过程通过
    tf.cond(…)
    节点,我被
    gradient.py
    警告说一些稀疏张量是 变密
  • 当我试图提取
    总损失
    桶损失
    时,我被告知:
  • 你能帮我一下吗:

    • 如何解决上述两个问题
    • 我应该如何修改图表以满足我的要求
    • 有没有更好的方法可以将不同铲斗大小的数据集中训练 一批
    • 将异步队列读取器应用于seq2seq有更好的想法吗 框架,而不首先将整个数据集固定
      • 我会(确实)把扣子完全扔掉。使用动态链接。这里的想法是用一个填充符号填充您的批,填充符号的数量取决于该批的所有成员的长度(通常只是相应批中最长成员的大小)。解决了所有四个问题,但是是的,重写起来有些麻烦。(不过我一点也不后悔)

        我在路上做了很多事情,这些事情对我的案例和数据非常特殊,因此共享毫无意义,但也许你想看看这个实现:

        我会(确实)完全放弃bucketing。使用动态链接。这里的想法是用一个填充符号填充您的批,填充符号的数量取决于该批的所有成员的长度(通常只是相应批中最长成员的大小)。解决了所有四个问题,但是是的,重写起来有些麻烦。(不过我一点也不后悔)

        我在途中做了许多与我的案例和数据相关的事情,因此共享没有任何意义,但您可能想查看以下实现:

        ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.