我目前正试图摆脱使用Feed并开始使用队列以支持更大的数据集 . 使用队列对张量流中的优化器工作正常,因为它们仅为每个出列操作计算一次渐变 . 但是,我已经与执行行搜索的其他优化器实现了接口,我不仅需要评估渐变,还需要评估同一批次的多个点的损失 . 不幸的是,对于正常的排队系统,每个损失评估将执行出队而不是多次计算同一批次 .
有没有办法将出列操作与梯度/损耗计算分离,使得我可以执行一次出列,然后在当前批次上多次执行梯度/损失计算?
编辑:请注意我的输入张量的大小在批次之间是可变的 . 我们使用分子数据,每个分子都有不同数量的原子 . 这与图像数据完全不同,图像数据通常按比例缩放以具有相同的尺寸 .
1 回答
通过创建变量存储出列值来解耦它,然后依赖于此变量而不是出列操作 . 推进队列发生在
assign
Solution #1 :固定大小的数据,使用变量
现在
image_batch
给出队列的最新值而不推进它,并且advance_batch
使队列前进 .Solution #2 :可变大小的数据,使用持久性的Tensors
在这里,我们通过引入
dequeue_op
和dequeue_op2
来解耦工作流程 . 所有计算都取决于dequeue_op2
,它被提供dequeue_op
的保存值 . 使用get_session_tensor/get_session_handle
确保实际数据保留在TensorFlow运行时中,并且通过feed_dict
传递的值是一个短字符串标识符 . 由于dummy_handle
,API有点尴尬,我提出了这个问题here当你运行它时,你会看到类似下面的内容