Tensorflow 中的生成序列
Posted
技术标签:
【中文标题】Tensorflow 中的生成序列【英文标题】:Generative sequences in Tensorflow 【发布时间】:2017-09-11 05:37:39 【问题描述】:我使用以下代码来生成长度为num_steps
的序列,给定starting_point
和starting_state
,使用RNNCell
的实例,例如cell=GRUCell(number_of_neurons)
。
outputs = [starting_point]
state = starting_state
for time_step in range(num_steps):
if time_step > 0: tf.get_variable_scope().reuse_variables()
(cell_output, state) = cell(outputs[time_step], state)
outputs.append(cell_output)
但这对于我的用例(num_steps = 1000
)来说既慢又麻烦。即使实例化图表也需要很长时间。
此功能是否存在于 Tensroflow 中的某个地方,而我只是错过了它?
请注意,我正在寻找的内容与tf.contrib.rnn.static_rnn
的行为相似但又不同。 documentation 将这个函数的行为总结为简单地将 RNN 应用于序列中的每个时间步:
state = cell.zero_state(...)
outputs = []
for input_ in inputs:
output, state = cell(input_, state)
outputs.append(output)
return (outputs, state)
但就我而言,我想将一个步骤的输出作为下一步的输入。
【问题讨论】:
【参考方案1】:在 tensorflow 每晚构建中,请参阅 tf.contrin.seq2seq 了解动态解码器对象。您可以使用预定的采样助手来做您想做的事情。或者使用 tf.nn.dynamic_rnn 并将所有零作为输入。 lstm h 状态也是 lstm 输出,因此您可以得到基本相同的行为。
【讨论】:
感谢您的回答 (+1)。我在 r1.1 中注意到了这些添加,但它们的用法完全不透明。例如,什么是解码器对象?什么是辅助对象?为什么我也需要?他们在做什么?现在我已经通过提供loop_fn=lambda prev, i: prev
来解决我想要使用legacyseq2seq.rnn_decode
的行为,但它仍然很慢。
我们正在编写教程。现在,请参阅单元测试以了解示例用法。
睡衣们稍微改变了 API,所以我建议使用这些。以上是关于Tensorflow 中的生成序列的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow文本摘要生成 - 基于注意力的序列到序列模型
TensorFlow文本摘要生成 - 基于注意力的序列到序列模型