如何使用 tensorflow 中的 seq2seq 预测简单序列?
How to predict a simple sequence using seq2seq from tensorflow?
我最近开始使用 tensorflow,所以我仍在努力学习基础知识。
我想创建简单的 seq2seq 预测。
- 输入是 0 到 1 之间的数字列表。
- 输出是来自
列表和其余数字乘以第一个。
我设法评估了模型性能并优化了权重。
我一直在努力的事情是如何用训练有素的模型进行预测。
model_outputs, states = seq2seq.basic_rnn_seq2seq(encoder_inputs,
decoder_inputs,
rnn_cell.BasicLSTMCell(data_point_dim, state_is_tuple=True))
为了生成 model_outputs,我需要模型的输入值和输出值,这有利于评估,但在预测中我只有输入值。我猜我需要对状态做些什么,但我不确定如何将它们转换为浮点数序列。
完整代码可在此处获得
https://gist.github.com/anonymous/be405097927758acca158666854600a2
训练时,您在每个解码器时间步将解码器输入作为所需的输出。
测试时,您没有所需的输出,因此您能做的最好的事情就是对输出进行采样。这将是下一个时间步长的输入。
TLDR;在每个时间步输入解码器输出作为下一个时间步的输入。
编辑:一些 TF 代码
basic_rnn_seq2seq函数returns rnn_decoder(decoder_inputs, enc_states[-1], 单元格)
让我们看看rnn_decoder:
def rnn_decoder(decoder_inputs, initial_state, 单元格, loop_function=None,
范围=None):
....
loop_function:如果不是None,这个函数将应用于第i个输出
为了生成第 i+1 个输入,decoder_inputs 将被忽略,
除了第一个元素("GO" 符号)。这可以用于解码,
也用于训练模仿 http://arxiv.org/pdf/1506.03099v2.pdf.
解码时需要设置这个loop_function=True
我建议查看 Tensorflow seq2seq 库中的 translate.py 文件以了解其处理方式。
user4383691 之前的回答不完整。
我有同样的问题,在深入研究 rnn_decoder 之后,发现了这个:模型 applies the loop_fn to第 i 个输出,所以 True 没有意义,因为它不是函数。
您应该创建一个可以接收第 i 个输出和 return 第 i+1 个输出的函数。这样的功能我还在制作中,完成后会第一时间更新
让我们看看source code:
prev = None for i, inp in enumerate(decoder_inputs):
if loop_function is not None and prev is not None:
with variable_scope.variable_scope("loop_function", reuse=True):
inp = loop_function(prev, i)
if i > 0:
variable_scope.get_variable_scope().reuse_variables()
output, state = cell(inp, state)
outputs.append(output)
if loop_function is not None:
prev = output
无论您是使用提供的 decoder_inputs 进行训练还是在没有输入的情况下进行测试,循环都会枚举 decoder_inputs。这是因为 decoder_inputs 在测试时被 loop_function 的输出替换(在上面代码片段的第四行)。
通常你可以像here一样用end_ids填充dec_inputs。
while len(dec_inputs) < self._hps.dec_timesteps:
dec_inputs.append(end_id)
while len(targets) < self._hps.dec_timesteps:
targets.append(end_id)
我最近开始使用 tensorflow,所以我仍在努力学习基础知识。
我想创建简单的 seq2seq 预测。
- 输入是 0 到 1 之间的数字列表。
- 输出是来自 列表和其余数字乘以第一个。
我设法评估了模型性能并优化了权重。 我一直在努力的事情是如何用训练有素的模型进行预测。
model_outputs, states = seq2seq.basic_rnn_seq2seq(encoder_inputs,
decoder_inputs,
rnn_cell.BasicLSTMCell(data_point_dim, state_is_tuple=True))
为了生成 model_outputs,我需要模型的输入值和输出值,这有利于评估,但在预测中我只有输入值。我猜我需要对状态做些什么,但我不确定如何将它们转换为浮点数序列。
完整代码可在此处获得 https://gist.github.com/anonymous/be405097927758acca158666854600a2
训练时,您在每个解码器时间步将解码器输入作为所需的输出。 测试时,您没有所需的输出,因此您能做的最好的事情就是对输出进行采样。这将是下一个时间步长的输入。
TLDR;在每个时间步输入解码器输出作为下一个时间步的输入。
编辑:一些 TF 代码
basic_rnn_seq2seq函数returns rnn_decoder(decoder_inputs, enc_states[-1], 单元格)
让我们看看rnn_decoder: def rnn_decoder(decoder_inputs, initial_state, 单元格, loop_function=None, 范围=None): ....
loop_function:如果不是None,这个函数将应用于第i个输出 为了生成第 i+1 个输入,decoder_inputs 将被忽略, 除了第一个元素("GO" 符号)。这可以用于解码, 也用于训练模仿 http://arxiv.org/pdf/1506.03099v2.pdf.
解码时需要设置这个loop_function=True
我建议查看 Tensorflow seq2seq 库中的 translate.py 文件以了解其处理方式。
user4383691 之前的回答不完整。 我有同样的问题,在深入研究 rnn_decoder 之后,发现了这个:模型 applies the loop_fn to第 i 个输出,所以 True 没有意义,因为它不是函数。 您应该创建一个可以接收第 i 个输出和 return 第 i+1 个输出的函数。这样的功能我还在制作中,完成后会第一时间更新
让我们看看source code:
prev = None for i, inp in enumerate(decoder_inputs):
if loop_function is not None and prev is not None:
with variable_scope.variable_scope("loop_function", reuse=True):
inp = loop_function(prev, i)
if i > 0:
variable_scope.get_variable_scope().reuse_variables()
output, state = cell(inp, state)
outputs.append(output)
if loop_function is not None:
prev = output
无论您是使用提供的 decoder_inputs 进行训练还是在没有输入的情况下进行测试,循环都会枚举 decoder_inputs。这是因为 decoder_inputs 在测试时被 loop_function 的输出替换(在上面代码片段的第四行)。
通常你可以像here一样用end_ids填充dec_inputs。
while len(dec_inputs) < self._hps.dec_timesteps:
dec_inputs.append(end_id)
while len(targets) < self._hps.dec_timesteps:
targets.append(end_id)