sequence_pool

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

  • paddle.fluid.layers.sequence_pool(input, pool_type, is_test=False, pad_value=0.0)[源代码]

注意:该OP的输入只能是LoDTensor,如果您需要处理的输入是Tensor类型,请使用pool2d函数(fluid.layers. pool2d )。

该OP 仅支持LoDTensor类型的输入 ,将对输入的LoDTensor进行指定方式的池化(pooling)操作。通过指定pool_type参数,将输入的每个序列(sequence)在最后一层lod_level上或时间步(time-step)上对特征进行诸如sum、average、sqrt等池化操作。

支持六种pool_type:

  • average: sequence_pool - 图1

  • sum: sequence_pool - 图2

  • sqrt: sequence_pool - 图3

  • max: sequence_pool - 图4

  • last: sequence_pool - 图5

  • first: sequence_pool - 图6

其中 N_i 为待池化第i个输入序列的长度。

  1. Case 1:
  2.  
  3. input1-levelLoDTensor, pad_value = 0.0:
  4. input.lod = [[0, 2, 5, 7, 7]]
  5. input.data = [[1.], [3.], [2.], [4.], [6.], [5.], [1.]]
  6. input.shape = [7, 1]
  7. 输出为LoDTensor
  8. out.shape = [4, 1]
  9. 其中 out.shape[0] == len(x.lod[-1]) == 4
  10. 对于不同的pool_type
  11. average: out.data = [[2.], [4.], [3.], [0.0]], where 2.=(1. + 3.)/2, 4.=(2. + 4. + 6.)/3, 3.=(5. + 1.)/2
  12. sum : out.data = [[4.], [12.], [6.], [0.0]], where 4.=1. + 3., 12.=2. + 4. + 6., 6.=5. + 1.
  13. sqrt : out.data = [[2.82], [6.93], [4.24], [0.0]], where 2.82=(1. + 3.)/sqrt(2), 6.93=(2. + 4. + 6.)/sqrt(3), 4.24=(5. + 1.)/sqrt(2)
  14. max : out.data = [[3.], [6.], [5.], [0.0]], where 3.=max(1., 3.), 6.=max(2., 4., 6.), 5.=max(5., 1.)
  15. last : out.data = [[3.], [6.], [1.], [0.0]], where 3.=last(1., 3.), 6.=last(2., 4., 6.), 1.=last(5., 1.)
  16. first : out.data = [[1.], [2.], [5.], [0.0]], where 1.=first(1., 3.), 2.=first(2., 4., 6.), 5.=first(5., 1.)
  17.  
  18. 上述out.data中的最后一个[0.0]均为填充的数据。
  19.  
  20. Case 2:
  21.  
  22. input2-levelLoDTensor, 包含3个长度分别为[2, 0, 3]的序列,其中中间的0表示序列为空。
  23. 第一个长度为2的序列包含2个长度分别为[1, 2]的子序列;
  24. 最后一个长度为3的序列包含3个长度分别为[1, 0, 3]的子序列。
  25. input.lod = [[0, 2, 2, 5], [0, 1, 3, 4, 4, 7]]
  26. input.data = [[1.], [3.], [2.], [4.], [6.], [5.], [1.]]
  27. input.shape = [7, 1]
  28.  
  29. pool_type取值为sum为例,将根据最后一层的lod信息[0, 1, 3, 4, 4, 7]进行池化操作,且pad_value = 0.0
  30. 输出为LoDTensor
  31. out.shape= [5, 1]
  32. out.lod = [[0, 2, 2, 5]]
  33. 其中 out.shape[0] == len(x.lod[-1]) == 5
  34. sum: out.data = [[1.], [5.], [4.], [0.0], [12.]]
  35. where 1.=1., 5.=3. + 2., 4.=4., 0.0=pad_value, 12.=6. + 5. + 1.
  • 参数:
    • input (Variable) - 类型为LoDTensor的输入序列,仅支持lod_level不超过2的LoDTensor,数据类型为float32。
    • pool_type (str) - 池化类型,支持average,sum,sqrt,max,last和first池化操作。
    • is_test (bool) - 仅在pool_type取值为max时生效。当is_test为False时,则在池化操作过程中会创建maxIndex临时Tenosr,以记录最大特征值对应的索引信息,用于训练阶段的反向梯度计算。默认为False。
    • pad_value (float) - 用于填充输入序列为空时的池化结果,默认为0.0。

返回:经过指定类型池化后的LoDTensor,数据类型为float32。

返回类型:Variable

代码示例:

  1. import paddle.fluid as fluid
  2.  
  3. x = fluid.layers.data(name='x', shape=[7, 1], append_batch_size=False,
  4. dtype='float32', lod_level=1)
  5. avg_x = fluid.layers.sequence_pool(input=x, pool_type='average')
  6. sum_x = fluid.layers.sequence_pool(input=x, pool_type='sum')
  7. sqrt_x = fluid.layers.sequence_pool(input=x, pool_type='sqrt')
  8. max_x = fluid.layers.sequence_pool(input=x, pool_type='max')
  9. last_x = fluid.layers.sequence_pool(input=x, pool_type='last')
  10. first_x = fluid.layers.sequence_pool(input=x, pool_type='first')