我编码的rnn类似于tensorflow提供的dynamic_rnn。我试图在GitHub上看到代码,但无法理解他们是如何实现它的。我想从头开始构建它,以便我可以从内部自定义rnn。怎么做?
目前,我的方法是将截断的时间序列视为张量使用tf.scan()并找到所有时间序列的新隐藏状态。然后使用tf.map_fn查找新堆叠隐藏变量的输出。最后,使用tf.while_loop()在堆叠输出的第一维上找到每个张量的误差,然后用该损失进行反向传播。
我担心这个图表在执行此操作后会是动态的。我的意思是说首先我展开了5次,然后4次图表将删除之前滚动的节点?
这会有用吗?
请指导。
谢谢,
答案 0 :(得分:0)
只需一个循环就可以实现RNN(scan
/ map_fn
/等等都基于while_loop
,其中有一个或多个TensorArray
s,它们通过状态和一次性计算损失。这些结构的一个优点是您的图形是固定大小的,但迭代次数可以变化(或者在不增加图形大小的情况下非常大)。
然而,迭代可变长度序列通常不是最大化性能的好方法。通常充分利用CPU上的SIMD指令或GPU上的并行性至少需要一些批处理,在这种情况下,最好切断序列并将这些段批处理在一起。有SequenceQueueingStateSaver之类的工具可以让你从许多变长序列中产生固定大小的批次。