sequence_expand

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

  • paddle.fluid.layers.sequence_expand(x, y, ref_level=-1, name=None)[源代码]

序列扩张层(Sequence Expand Layer),根据输入 y 的第 ref_level 层lod对输入 x 进行扩展。 x 的lod level最多为1,若 x 的lod level为1,则 x 的lod大小必须与 y 的第 ref_level 层lod大小相等;若 x 的lod level为0,则 x 的第一维大小必须与 yref_level 层大小相等。 x 的秩最少为2,当 x 的秩大于2时,将被当作是一个二维张量处理。

注意,该OP的输入 x 可以是Tensor或LodTensor, y 只能是LodTensor。

范例解释如下:

  1. 1
  2. 假设两个长度为2的序列[a][b]和[c][d],欲将其扩展为4个长度为2的序列[a][b]、[a][b]、[c][d]、[c][d]。
  3. 序列[a][b]扩展2次,[c][d]扩展2次,扩展所需依据的lod为[2, 2],则:
  4. 给定输入一维LoDTensor x
  5. x.lod = [[2, 2]] #表示两个序列的长度为2,为了便于理解这里用基于长度lod表示
  6. x.data = [[a], [b], [c], [d]]
  7. x.dims = [4, 1]
  8. 和输入 y
  9. y.lod = [[2, 2], #第0层lod,指定按该层扩展,表示分别扩展2次,为了便于理解这里用基于长度lod表示
  10. [3, 3, 1, 1]] #第1层lod,注意,因为指定ref_level为0,所以这一层与运算无关
  11. 指定 ref_level = 0,依据y的第0lod进行扩展,
  12.  
  13. 经过sequence_expand,输出为1LoDTensor out
  14. out.lod = [[0, 2, 4, 6, 8]] #基于偏移的lod,等价于基于长度的[[2, 2, 2, 2]]
  15. out.data = [[a], [b], [a], [b], [c], [d], [c], [d]]
  16. out.dims = [8, 1]
  1. 2
  2. 假设有3个长度维1的序列[a]、[b]、[c],现在要将其扩展为长度是203的序列[a][a]、[c][c][c]。
  3. 显然,扩展后的序列lod为[2, 0, 3],则:
  4. 给定输入一维LoDTensor x
  5. x.data = [[a], [b], [c]]
  6. x.dims = [3, 1]
  7. 和输入 y
  8. y.lod = [[2, 0, 3]]
  9. 默认 ref_level = -1
  10.  
  11. 经过sequence_expand,输出为1LoDTensor out
  12. out.data = [[a], [a], [c], [c], [c]]
  13. out.dims = [5, 1]
  • 参数:
    • x (Variable) - 输入变量,维度为 sequence_expand - 图1 ,lod level至多1的二维Tensor或LoDTensor。数据类型支持int32,int64,float32或float64。
    • y (Variable) - 输入变量,lod level至少为1的LoDTensor。数据类型不限。
    • ref_level (int,可选) - 扩展 x 所依据的 y 的lod层。默认值-1,表示lod的最后一层。
    • name (str,可选) - 具体用法请参见 Name ,一般无需设置,默认值为None。

返回:扩展变量,维度为

sequence_expand - 图2 的LoDTensor,N由输入 xy 的lod共同决定。数据类型与输入 x 一致。

返回类型:Variable

代码示例

  1. import paddle.fluid as fluid
  2. import paddle.fluid.layers as layers
  3. import numpy as np
  4.  
  5. x = fluid.data(name='x', shape=[1], dtype='float32')
  6. y = fluid.data(name='y', shape=[1],
  7. dtype='float32', lod_level=1)
  8. out = layers.sequence_expand(x=x, y=y, ref_level=0)
  9.  
  10. exe = fluid.Executor(fluid.CPUPlace())
  11. place = fluid.CPUPlace()
  12.  
  13. np_data = np.array([[1], [2], [3], [4]]).astype('float32')
  14. x_lod_tensor = fluid.create_lod_tensor(np_data, [[2, 2]], place)
  15. print(x_lod_tensor)
  16. #lod: [[0, 2, 4]]
  17. # dim: 4, 1
  18. # layout: NCHW
  19. # dtype: float
  20. # data: [1 2 3 4]
  21.  
  22. y_lod_tensor = fluid.create_random_int_lodtensor([[2, 2], [3,3,1,1]], [1],
  23. place, low=0, high=1)
  24. print(y_lod_tensor)
  25. #lod: [[0, 2, 4][0, 3, 6, 7, 8]]
  26. # dim: 8, 1
  27. # layout: NCHW
  28. # dtype: int64_t
  29. # data: [0 0 1 1 1 1 1 0]
  30.  
  31. out_main = exe.run(fluid.default_main_program(),
  32. feed={'x': x_lod_tensor, 'y': y_lod_tensor},
  33. fetch_list=[out], return_numpy=False)
  34. print(out_main[0])
  35. #lod: [[0, 2, 4, 6, 8]]
  36. # dim: 8, 1
  37. # layout: NCHW
  38. # dtype: float
  39. # data: [1 2 1 2 3 4 3 4]