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


S
swtkiwi 已提交
9 10 11



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

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

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

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

20
示例1:
H
Hao Wang 已提交
21

22 23
假设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 已提交
24

25 26 27 28
在逻辑上,我们可以用两种方式表示该变长序列,一种是递归序列长度的形式,即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 已提交
29 30 31

::

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

  x.shape = [5, 2]

37 38 39
  x.recursive_sequence_length = [[2, 3]]

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

41
示例2:
H
Hao Wang 已提交
42

43 44 45
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 已提交
46 47 48

::

49 50 51 52 53 54 55 56 57
  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 已提交
58 59 60 61 62 63 64 65 66 67

**示例代码**

.. code-block:: python

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


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

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

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

74
返回类型:  bool。
H
Hao Wang 已提交
75 76 77 78 79 80 81 82 83 84 85

**示例代码**

.. 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]])
86
            print(t.has_valid_recursive_sequence_lengths())  # True
H
Hao Wang 已提交
87 88 89

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

90
该接口返回LoDTensor的LoD。
H
Hao Wang 已提交
91

92
返回:LoDTensor的LoD。
H
Hao Wang 已提交
93

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

**示例代码**

.. 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]]

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

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

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

**示例代码**

.. 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]])
126
            print(t.recursive_sequence_lengths())  # [[2, 3]]
H
Hao Wang 已提交
127 128 129 130


.. py:method::  set(*args, **kwargs)
    
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 161 162 163
该接口根据输入的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 已提交
164

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

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

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

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

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

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

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
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 已提交
198 199 200 201


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

202
该接口设置LoDTensor的LoD。
H
Hao Wang 已提交
203 204

参数:
205 206 207
    - **lod** (List [List [int]]) - 要设置的LoD。

返回:无。
H
Hao Wang 已提交
208 209 210 211 212 213 214 215 216 217 218

**示例代码**

.. 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]])
219 220 221
            print(t.lod())  # [[0, 2, 5]]


H
Hao Wang 已提交
222

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

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

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

参数:
230 231 232
  - **recursive_sequence_lengths** (List [List [int]]) - 递归序列长度。

返回:无。
H
Hao Wang 已提交
233 234 235 236 237 238 239 240 241 242 243

**示例代码**

.. 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]])
244 245
            print(t.recursive_sequence_length())  # [[2, 3]]
            print(t.lod())  # [[0, 2, 5]]
H
Hao Wang 已提交
246 247 248

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

249
该接口返回LoDTensor的shape。
H
Hao Wang 已提交
250

251
返回:LoDTensor的shape。
H
Hao Wang 已提交
252

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

255
**示例代码**
H
Hao Wang 已提交
256

257 258 259 260 261 262 263 264
.. 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 已提交
265 266 267