sequence_expand_as

  • paddle.fluid.layers.sequence_expand_as(x, y, name=None)[源代码]

Sequence Expand As Layer,该OP根据输入 y 的第0级lod对输入 x 进行扩展。当前实现要求 y 的lod层数(level)必须为1,且 x 的第一维必须和 y 的第0层lod大小相同,所以扩展后的LodTensor具有和 y 相同的lod。扩展结果与输入 x 的lod无关,所以无需考虑 x 的lod。

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

范例解释如下:

  1. 1:
  2. 假设,有4个长度维1的序列[a]、[b]、[c]和[d],现在要将其扩展为长度是3311的序列[a][a][a]、[b][b][b]、[c]和[d]。
  3. 显然,扩展后的序列lod为[0, 3, 6, 7, 8],则:
  4. 给定输入一维LoDTensor x
  5. x.data = [[a], [b], [c], [d]]
  6. x.dims = [4, 1]
  7. 和输入 y
  8. y.lod = [[3, 3, 1, 1]] #为了便于理解这里用基于长度lod表示
  9.  
  10. 经过sequence_expand_as运算,得到输出1LoDTensor out
  11. out.lod = [[0, 3, 6, 7, 8]] #基于偏移的lod,等价于基于长度的[[3, 3, 1, 1]]
  12. out.data = [[a], [a], [a], [b], [b], [b], [c], [d]]
  13. out.dims = [8, 1]
  14.  
  15. 可见,输出outx扩展至和y具有相同的lod
  1. 2
  2. 设定与例1类似,给定输入一维LoDTensor x
  3. x.data = [[a, b], [c, d], [e, f]]
  4. x.dims = [3, 2]
  5. 和输入 y
  6. y.lod = [[2, 1, 3]] #为了便于理解这里用基于长度lod表示
  7.  
  8. 输出为1LoDTensor
  9. out.lod = [[0, 2, 3, 6]] #基于偏移的lod,等价于基于长度的[[2, 1, 3]]
  10. out.data = [[a, b], [a, b] [c, d], [e, f], [e, f], [e, f]]
  11. out.dims = [6, 2]
  12.  
  13. 可见,输出outx扩展至和y具有相同的lod
  • 参数:
    • x (Variable) - 输入变量,维度为 sequence_expand_as - 图1 的二维Tensor或LoDTensor,第一维必须与输入 y 的第0层lod大小相同,且仅支持lod_level为1。数据类型支持int32,int64,float32或float64。
    • y (Variable) - 输入变量,LoDTensor,lod level必须为1。
    • name (str,可选) - 具体用法请参见 Name ,一般无需设置,默认值为None。

返回:扩展变量,维度为

sequence_expand_as - 图2 的二维LoDTensor,N由输入 y 的lod决定,且仅支持lod_level为1。数据类型与输入 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], dtype='float32', lod_level=1)
  7. out = layers.sequence_expand_as(x=x, y=y)
  8.  
  9. exe = fluid.Executor(fluid.CPUPlace())
  10. place = fluid.CPUPlace()
  11.  
  12. np_data = np.array([[1], [2], [3], [4]]).astype('float32')
  13. x_lod_tensor = fluid.create_lod_tensor(np_data, [[2, 2]], place)
  14. print(x_lod_tensor)
  15. #lod: [[0, 2, 4]]
  16. # dim: 4, 1
  17. # layout: NCHW
  18. # dtype: float
  19. # data: [1 2 3 4]
  20.  
  21. y_lod_tensor = fluid.create_random_int_lodtensor([[3,3,1,1]], [1],
  22. place, low=0, high=1)
  23. print(y_lod_tensor)
  24. #lod: [[0, 3, 6, 7, 8]]
  25. # dim: 8, 1
  26. # layout: NCHW
  27. # dtype: int64_t
  28. # data: [0 0 1 0 1 1 1 0]
  29.  
  30. out_main = exe.run(fluid.default_main_program(),
  31. feed={'x': x_lod_tensor, 'y': y_lod_tensor},
  32. fetch_list=[out], return_numpy=False)
  33. print(out_main[0])
  34. #lod: [[0, 3, 6, 7, 8]]
  35. # dim: 8, 1
  36. # layout: NCHW
  37. # dtype: float
  38. # data: [1 1 1 2 2 2 3 4]