我将排队阅读器应用于 tensorflow seq2seq 以避免将整个数据集读入内存并提前处理它们。我没有首先将数据集存储到不同的存储桶文件中,以确保每个批次有一个存储桶大小,因为这也需要很多时间。因此,队列读取器的每批数据可能包含不同桶大小的序列,这导致无法运行原始 seq2seq 模型(假设一批中的数据具有相同的桶大小,并且只选择一个子图取决于要执行的桶大小)
我试过的:
在最初的实现中,与桶一样多的子图被构造成共享相同的参数。它们之间的唯一区别是在其 RNN 过程中应采用的计算时间。我将子图更改为条件图,当为switch
True 时,将计算bucket_loss
此存储桶的 最后,我用来收集所有的损失并在其上构建梯度图。此外,我在每一步都输入一个模型。的大小与桶的大小相同,如果该批次中有第i个桶大小的数据,则对应的第i个切换为True,否则为False。loss_list
switch
tf.constant(0.0)
loss_list
total_loss = tf.reduce_sum(loss_list)
switches_list
switches_list
switches_list
遇到的问题:
- 当反向传播过程通过
tf.cond(...)
节点时,我被警告gradient.py
一些稀疏张量转换为密集张量 - 当我试图获取
total_loss
orbucket_loss
时,有人告诉我:
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.
你能帮我吗:
- 我该如何解决上面的两个问题?
- 我应该如何修改图表以满足我的要求?
- 在一批中训练不同桶大小的数据有什么更好的想法吗?
- 将异步队列读取器应用到 seq2seq 框架而不首先存储整个数据集的任何更好的想法?