sequence_expand_cn.rst 4.3 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_layers_sequence_expand:

sequence_expand
-------------------------------

L
liuwei1031 已提交
6
:api_attr: 声明式编程模式(静态图)
7

H
Hao Wang 已提交
8 9
.. py:function:: paddle.fluid.layers.sequence_expand(x, y, ref_level=-1, name=None)

10
序列扩张层(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`` 的第一维大小必须与 ``y`` 第 ``ref_level`` 层大小相等。 ``x`` 的秩最少为2,当 ``x`` 的秩大于2时,将被当作是一个二维张量处理。
H
Hao Wang 已提交
11

12
注意,该OP的输入 ``x`` 可以是Tensor或LodTensor, ``y`` 只能是LodTensor。
H
Hao Wang 已提交
13

14
范例解释如下:
H
Hao Wang 已提交
15

16
::
H
Hao Wang 已提交
17

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
    例1:
    假设两个长度为2的序列[a][b]和[c][d],欲将其扩展为4个长度为2的序列[a][b]、[a][b]、[c][d]、[c][d]。
    序列[a][b]扩展2次,[c][d]扩展2次,扩展所需依据的lod为[2, 2],则:
    给定输入一维LoDTensor x
      x.lod  = [[2,        2]]    #表示两个序列的长度为2,为了便于理解这里用基于长度lod表示
      x.data = [[a], [b], [c], [d]]
      x.dims = [4, 1]
    和输入 y
      y.lod = [[2,    2],     #第0层lod,指定按该层扩展,表示分别扩展2次,为了便于理解这里用基于长度lod表示
               [3, 3, 1, 1]]  #第1层lod,注意,因为指定ref_level为0,所以这一层与运算无关
    指定 ref_level = 0,依据y的第0层lod进行扩展,

    经过sequence_expand,输出为1级LoDTensor out
      out.lod =  [[0,        2,        4,        6,      8]]  #基于偏移的lod,等价于基于长度的[[2, 2, 2, 2]]
      out.data = [[a], [b], [a], [b], [c], [d], [c], [d]]
      out.dims = [8, 1]
H
Hao Wang 已提交
34

35
::
H
Hao Wang 已提交
36

37 38 39 40 41 42 43 44 45
    例2:
    假设有3个长度维1的序列[a]、[b]、[c],现在要将其扩展为长度是2、0、3的序列[a][a]、[c][c][c]。
    显然,扩展后的序列lod为[2, 0, 3],则:
    给定输入一维LoDTensor x
      x.data = [[a], [b], [c]]
      x.dims = [3, 1]
    和输入 y
      y.lod = [[2, 0, 3]]
    默认 ref_level = -1
H
Hao Wang 已提交
46

47 48 49
    经过sequence_expand,输出为1级LoDTensor out
      out.data = [[a], [a], [c], [c], [c]]
      out.dims = [5, 1]
H
Hao Wang 已提交
50 51

参数:
52 53 54 55
    - **x** (Variable) - 输入变量,维度为 :math:`[M, K]` ,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,可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。
H
Hao Wang 已提交
56

57
返回:扩展变量,维度为 :math:`[N, K]` 的LoDTensor,N由输入 ``x`` 和 ``y`` 的lod共同决定。数据类型与输入 ``x`` 一致。
H
Hao Wang 已提交
58

59
返回类型:Variable
H
Hao Wang 已提交
60 61 62 63 64 65 66

**代码示例**:

.. code-block:: python

    import paddle.fluid as fluid
    import paddle.fluid.layers as layers
67 68 69 70
    import numpy as np

    x = fluid.data(name='x', shape=[1], dtype='float32')
    y = fluid.data(name='y', shape=[1],
H
Hao Wang 已提交
71
                 dtype='float32', lod_level=1)
Z
zq19 已提交
72
    out = layers.sequence_expand(x=x, y=y, ref_level=0)
H
Hao Wang 已提交
73

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    exe = fluid.Executor(fluid.CPUPlace())
    place = fluid.CPUPlace()

    np_data = np.array([[1], [2], [3], [4]]).astype('float32')
    x_lod_tensor = fluid.create_lod_tensor(np_data, [[2, 2]], place)
    print(x_lod_tensor)
    #lod: [[0, 2, 4]]
    #    dim: 4, 1
    #    layout: NCHW
    #    dtype: float
    #    data: [1 2 3 4]

    y_lod_tensor = fluid.create_random_int_lodtensor([[2, 2], [3,3,1,1]], [1],
                                                     place, low=0, high=1)
    print(y_lod_tensor)
    #lod: [[0, 2, 4][0, 3, 6, 7, 8]]
    #    dim: 8, 1
    #    layout: NCHW
    #    dtype: int64_t
    #    data: [0 0 1 1 1 1 1 0]

    out_main = exe.run(fluid.default_main_program(), 
                      feed={'x': x_lod_tensor, 'y': y_lod_tensor}, 
                      fetch_list=[out], return_numpy=False)
    print(out_main[0])
    #lod: [[0, 2, 4, 6, 8]]
    #    dim: 8, 1
    #    layout: NCHW
    #    dtype: float
    #    data: [1 2 1 2 3 4 3 4]
H
Hao Wang 已提交
104 105 106 107 108 109 110 111