dynamic_decode

注意:该API仅支持【静态图】模式

  • dynamic_decode(decoder, inits=None, max_step_num=None, output_time_major=False, **kwargs):

该接口重复执行 decoder.step() 直到 其返回的表示完成状态的Tensor中的值全部为True或解码步骤达到 max_step_num

decode.initialize() 会在解码循环之前被调用一次。如果 decoder 实现了 finalize 方法,则 decoder.finalize() 在解码循环后将被调用一次。

  • 参数:
    • decoder (Decoder) - 解码器的实例。
    • inits (object,可选) - 传递给 decoder.initialize 的参数。默认为None。
    • max_step_num (int,可选) - 最大步数。如果未提供,解码直到解码过程完成( decode.step() 返回的表示完成状态的Tensor中的值全部为True)。默认为None。
    • output_time_major (bool,可选) - 指明最终输出(此方法的第一个返回值)中包含的Tensor的数据布局。如果为False,其将使用batch优先的数据布局, 此时的形状为 dynamic_decode - 图1 。如果为True,其将使用time优先的数据布局,此时的形状为 dynamic_decode - 图2 。默认值为False。
    • kwargs - 其他命名关键字参数。这些参数将传递给 decoder.step

返回:一个二元组 (final_outputs,final_states), 其包含了最终的输出和状态,这两者都是Tensor或Tensor的嵌套结构。final_outputs 具有与 decoder.output_dtype 相同的结构和数据类型, 其中的每个tensor都是对所有解码时间步对应输出的堆叠。 这些tensor也可能会通过 decoder.finalize 进行修改。final_states 是最后时间步的状态,和 decoder.initialize 返回的初始状态具有相同的结构,其中的tensor也具有相同的形状 和数据类型。

返回类型:tuple

示例代码

  1. import paddle.fluid as fluid
  2. import paddle.fluid.layers as layers
  3. from paddle.fluid.layers import GRUCell, BeamSearchDecoder, dynamic_decode
  4. encoder_output = fluid.data(name="encoder_output",
  5. shape=[-1, 32, 128],
  6. dtype="float32")
  7. trg_embeder = lambda x: fluid.embedding(
  8. x, size=[10000, 128], param_attr=fluid.ParamAttr(name="trg_embedding"))
  9. output_layer = lambda x: layers.fc(x,
  10. size=10000,
  11. num_flatten_dims=len(x.shape) - 1,
  12. param_attr=fluid.ParamAttr(name=
  13. "output_w"),
  14. bias_attr=False)
  15. decoder_cell = GRUCell(hidden_size=128)
  16. decoder = BeamSearchDecoder(decoder_cell,
  17. start_token=0,
  18. end_token=1,
  19. beam_size=4,
  20. embedding_fn=trg_embeder,
  21. output_fn=output_layer)
  22. outputs = dynamic_decode(
  23. decoder=decoder, inits=decoder_cell.get_initial_states(encoder_output))