LoDTensor_cn.rst 9.4 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5 6 7 8
.. _cn_api_fluid_LoDTensor:

LoDTensor
-------------------------------

.. py:class:: paddle.fluid.LoDTensor


9
LoDTensor是一个具有LoD(Level of Details)信息的张量(Tensor),可用于表示变长序列,详见 :ref:`cn_user_guide_lod_tensor` 。
H
Hao Wang 已提交
10

11
LoDTensor可以通过 ``np.array(lod_tensor)`` 方法转换为numpy.ndarray。
H
Hao Wang 已提交
12

13
如果您不需要了解LoDTensor的细节,可以跳过以下的注解。
H
Hao Wang 已提交
14

15
下面以两个例子说明如何用LoDTensor表示变长序列。
H
Hao Wang 已提交
16

17
示例1:
H
Hao Wang 已提交
18

19 20
假设x为一个表示变长序列的LoDTensor,它包含2个逻辑子序列,第一个序列长度是2(样本数量为2),第二个序列长度是3,总序列长度为5。
第一个序列的数据为[1, 2], [3, 4],第二个序列的数据为[5, 6], [7, 8], [9, 10],每个样本数据的维度均是2,该LoDTensor最终的shape为[5, 2],其中5为总序列长度,2为每个样本数据的维度。
H
Hao Wang 已提交
21

22 23 24 25
在逻辑上,我们可以用两种方式表示该变长序列,一种是递归序列长度的形式,即x.recursive_sequence_length = [[2, 3]];另一种是偏移量的形式,即x.lod = [[0, 2, 2+3]]。
这两种表示方式是等价的,您可以通过LoDTensor的相应接口来设置和获取recursive_sequence_length或LoD。

在实现上,为了获得更快的序列访问速度,Paddle采用了偏移量的形式来存储不同的序列长度。因此,对recursive_sequence_length的操作最终将转换为对LoD的操作。
H
Hao Wang 已提交
26 27 28

::

29 30
  x.data = [[1, 2], [3, 4], 
            [5, 6], [7, 8], [9, 10]]
H
Hao Wang 已提交
31 32 33

  x.shape = [5, 2]

34 35 36
  x.recursive_sequence_length = [[2, 3]]

  x.lod  =  [[0, 2, 5]] 
H
Hao Wang 已提交
37

38
示例2:
H
Hao Wang 已提交
39

40 41 42
LoD可以有多个level(例如,一个段落可以有多个句子,一个句子可以有多个单词)。假设y为LoDTensor ,lod_level为2。从level=0来看有2个逻辑序列,序列长度分别为2和1,表示第一个逻辑序列包含2个子序列,第二个逻辑序列包含1个子序列。从level=1来看,第一个逻辑序列包含的2个子序列长度分别为2和2,第二个逻辑序列包含的1个子序列长度为3。

因此,该LoDTensor以递归序列长度形式表示为 y.recursive_sequence_length = [[2, 1], [2, 2, 3]];相应地,以偏移量形式表示为 y.lod = [[0, 2, 3], [0, 2, 4, 7]]。
H
Hao Wang 已提交
43 44 45

::

46 47 48 49 50 51 52 53 54
  y.data = [[1, 2], [3, 4], 
            [5, 6], [7, 8], 
            [9, 10], [11, 12], [13, 14]]

  y.shape = [2+2+3, 2]

  y.recursive_sequence_length = [[2, 1], [2, 2, 3]]

  y.lod = [[0, 2, 3], [0, 2, 4, 7]]
H
Hao Wang 已提交
55 56 57 58 59 60 61 62 63 64

**示例代码**

.. code-block:: python

      import paddle.fluid as fluid
     
      t = fluid.LoDTensor()


Z
zq19 已提交
65
.. py:method:: has_valid_recursive_sequence_lengths(self: paddle.fluid.core_avx.LoDTensor) → bool
H
Hao Wang 已提交
66

67
该接口检查LoDTensor的LoD的正确性。
H
Hao Wang 已提交
68

69
返回:   是否带有正确的LoD。
H
Hao Wang 已提交
70

71
返回类型:  bool。
H
Hao Wang 已提交
72 73 74 75 76 77 78 79 80 81 82

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            t.set_recursive_sequence_lengths([[2, 3]])
83
            print(t.has_valid_recursive_sequence_lengths())  # True
H
Hao Wang 已提交
84 85 86

.. py:method::  lod(self: paddle.fluid.core_avx.LoDTensor) → List[List[int]]

87
该接口返回LoDTensor的LoD。
H
Hao Wang 已提交
88

89
返回:LoDTensor的LoD。
H
Hao Wang 已提交
90

91
返回类型:List [List [int]]。
H
Hao Wang 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            t.set_lod([[0, 2, 5]])
            print(t.lod()) # [[0, 2, 5]]

.. py:method:: recursive_sequence_lengths(self: paddle.fluid.core_avx.LoDTensor) → List[List[int]]

107
该接口返回与LoDTensor的LoD对应的递归序列长度。
H
Hao Wang 已提交
108

109
返回:LoDTensor的LoD对应的递归序列长度。
H
Hao Wang 已提交
110

111
返回类型:List [List [int]]。
H
Hao Wang 已提交
112 113 114 115 116 117 118 119 120 121 122

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            t.set_recursive_sequence_lengths([[2, 3]])
123
            print(t.recursive_sequence_lengths())  # [[2, 3]]
H
Hao Wang 已提交
124 125 126 127


.. py:method::  set(*args, **kwargs)
    
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
该接口根据输入的numpy array和设备place,设置LoDTensor的数据。

重载函数:

1. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float32], place: paddle::platform::CPUPlace) -> None

2. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int32], place: paddle::platform::CPUPlace) -> None

3. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float64], place: paddle::platform::CPUPlace) -> None

4. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int64], place: paddle::platform::CPUPlace) -> None

5. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[bool], place: paddle::platform::CPUPlace) -> None

6. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint16], place: paddle::platform::CPUPlace) -> None

7. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint8], place: paddle::platform::CPUPlace) -> None

8. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int8], place: paddle::platform::CPUPlace) -> None

9. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float32], place: paddle::platform::CUDAPlace) -> None

10. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int32], place: paddle::platform::CUDAPlace) -> None

11. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float64], place: paddle::platform::CUDAPlace) -> None

12. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int64], place: paddle::platform::CUDAPlace) -> None

13. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[bool], place: paddle::platform::CUDAPlace) -> None

14. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint16], place: paddle::platform::CUDAPlace) -> None

15. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint8], place: paddle::platform::CUDAPlace) -> None
H
Hao Wang 已提交
161

162
16. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int8], place: paddle::platform::CUDAPlace) -> None
H
Hao Wang 已提交
163

164
17. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float32], place: paddle::platform::CUDAPinnedPlace) -> None
H
Hao Wang 已提交
165

166
18. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int32], place: paddle::platform::CUDAPinnedPlace) -> None
H
Hao Wang 已提交
167

168
19. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[float64], place: paddle::platform::CUDAPinnedPlace) -> None
H
Hao Wang 已提交
169

170
20. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int64], place: paddle::platform::CUDAPinnedPlace) -> None
H
Hao Wang 已提交
171

172
21. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[bool], place: paddle::platform::CUDAPinnedPlace) -> None
H
Hao Wang 已提交
173

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
22. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint16], place: paddle::platform::CUDAPinnedPlace) -> None

23. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[uint8], place: paddle::platform::CUDAPinnedPlace) -> None

24. set(self: paddle.fluid.core_avx.Tensor, array: numpy.ndarray[int8], place: paddle::platform::CUDAPinnedPlace) -> None

参数:
    - **array** (numpy.ndarray) - 要设置的numpy array,支持的数据类型为bool, float32, float64, int8, int32, int64, uint8, uint16。
    - **place** (CPUPlace|CUDAPlace|CUDAPinnedPlace) - 要设置的LoDTensor所在的设备。

返回:无。

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
H
Hao Wang 已提交
195 196 197 198


.. py:method::  set_lod(self: paddle.fluid.core_avx.LoDTensor, lod: List[List[int]]) → None

199
该接口设置LoDTensor的LoD。
H
Hao Wang 已提交
200 201

参数:
202 203 204
    - **lod** (List [List [int]]) - 要设置的LoD。

返回:无。
H
Hao Wang 已提交
205 206 207 208 209 210 211 212 213 214 215

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            t.set_lod([[0, 2, 5]])
216 217 218
            print(t.lod())  # [[0, 2, 5]]


H
Hao Wang 已提交
219

Z
zq19 已提交
220
.. py:method::  set_recursive_sequence_lengths(self: paddle.fluid.core_avx.LoDTensor, recursive_sequence_lengths: List[List[int]]) → None
H
Hao Wang 已提交
221

222
该接口根据递归序列长度 ``recursive_sequence_lengths`` 设置LoDTensor的LoD。
H
Hao Wang 已提交
223

224
例如,如果 ``recursive_sequence_lengths = [[2, 3]]``,意味着有两个长度分别为2和3的序列,相应的LoD是[[0, 2, 2 + 3]],即[[0, 2, 5]]。
H
Hao Wang 已提交
225 226

参数:
227 228 229
  - **recursive_sequence_lengths** (List [List [int]]) - 递归序列长度。

返回:无。
H
Hao Wang 已提交
230 231 232 233 234 235 236 237 238 239 240

**示例代码**

.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            t.set_recursive_sequence_lengths([[2, 3]])
241 242
            print(t.recursive_sequence_length())  # [[2, 3]]
            print(t.lod())  # [[0, 2, 5]]
H
Hao Wang 已提交
243 244 245

.. py:method::  shape(self: paddle.fluid.core_avx.Tensor) → List[int]

246
该接口返回LoDTensor的shape。
H
Hao Wang 已提交
247

248
返回:LoDTensor的shape。
H
Hao Wang 已提交
249

250
返回类型:List[int] 。
H
Hao Wang 已提交
251

252
**示例代码**
H
Hao Wang 已提交
253

254 255 256 257 258 259 260 261
.. code-block:: python
            
            import paddle.fluid as fluid
            import numpy as np
     
            t = fluid.LoDTensor()
            t.set(np.ndarray([5, 30]), fluid.CPUPlace())
            print(t.shape())  # [5, 30]
H
Hao Wang 已提交
262 263 264