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