2022-08-23 21:21:29 +08:00
|
|
|
|
<!-- pymnn/Tensor.md -->
|
2023-08-21 14:51:54 +08:00
|
|
|
|
## MNN.Tensor *[deprecated]*
|
2022-08-23 21:21:29 +08:00
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
class Tensor
|
|
|
|
|
```
|
|
|
|
|
Tensor是MNN V2接口中的基础数据结构,是最基本的数据封装类型。Tensor存储了数据以及数据类型,形状等诸多信息,用户可以通过Tensor本身的函数获取这些信息。
|
|
|
|
|
|
2023-08-21 14:51:54 +08:00
|
|
|
|
*不建议使用该接口,请使用[Var](Var.md)代替*
|
|
|
|
|
|
2022-08-23 21:21:29 +08:00
|
|
|
|
---
|
|
|
|
|
### `MNN.Halide_Type_*`
|
|
|
|
|
描述Tensor的数据类型
|
|
|
|
|
- 类型:`PyCapsule`
|
|
|
|
|
- 枚举值:
|
|
|
|
|
- `Halide_Type_Double`
|
|
|
|
|
- `Halide_Type_Float`
|
|
|
|
|
- `Halide_Type_Int`
|
|
|
|
|
- `Halide_Type_Int64`
|
|
|
|
|
- `Halide_Type_String`
|
|
|
|
|
- `Halide_Type_Uint8 `
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `MNN.Tensor_DimensionType_*`
|
|
|
|
|
描述Tensor的数据排布格式
|
|
|
|
|
- 类型:`int`
|
|
|
|
|
- 枚举值:
|
|
|
|
|
- `Tensor_DimensionType_Caffe`
|
|
|
|
|
- `Tensor_DimensionType_Caffe_C4`
|
|
|
|
|
- `Tensor_DimensionType_Tensorflow`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `Tensor()`
|
|
|
|
|
创建一个空Tensor
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor对象
|
|
|
|
|
|
|
|
|
|
返回类型:`Tensor`
|
|
|
|
|
|
|
|
|
|
### `Tensor(var)`
|
|
|
|
|
|
|
|
|
|
创建一个Tensor,并使用var的数据
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `var:Var` 类型为Var的变量
|
|
|
|
|
|
|
|
|
|
### `Tensor(tensor_or_var, dimension)`
|
|
|
|
|
创建一个Tensor,并使用tensor_or_var的数据, 并将数据排布格式设置为dimension
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `tensor_or_var:Tensor/Var` 类型为Tensor或者Var的变量
|
|
|
|
|
- `dimension:MNN.Tensor_DimensionType_*` 数据排布格式
|
|
|
|
|
|
|
|
|
|
### `Tensor(shape, dtype, dimension)`
|
|
|
|
|
创建一个指定形状,数据类型和数据排布的Tensor, 数据未经初始化
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `shape:tuple` Tensor形状
|
|
|
|
|
- `dtype:MNN.Halide_Type_*` Tensor数据类型
|
|
|
|
|
- `dimension:MNN.Tensor_DimensionType_*` 数据排布格式
|
|
|
|
|
|
2022-09-09 17:21:11 +08:00
|
|
|
|
### `Tensor(shape, dtype, value_list, dimension)`
|
|
|
|
|
创建一个指定形状,数据类型, 数据和数据排布的Tensor, 数据拷贝自`value_list`,
|
2022-09-30 10:02:52 +08:00
|
|
|
|
能够将`list`,`tuple`,`bytes`,`ndarray`,`PyCapsule`,`int指针`等格式的数据转换成`Tensor`
|
2022-09-09 17:21:11 +08:00
|
|
|
|
|
|
|
|
|
*注意:`value_list`仅在PYMNN_NUMPY_USABLE打开的情况下支持`ndarray`,移动端默认关闭*
|
|
|
|
|
|
|
|
|
|
*此函数在`PYMNN_NUMPY_USABLE=OFF`时不接受`ndarray`作为数据输入*
|
2022-08-23 21:21:29 +08:00
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `shape:tuple` Tensor形状
|
|
|
|
|
- `dtype:MNN.Halide_Type_*` Tensor数据类型
|
2022-09-30 10:02:52 +08:00
|
|
|
|
- `value_list:ndarray/tuple/list/bytes/PyCapsule/int_addr` 数据
|
2022-08-23 21:21:29 +08:00
|
|
|
|
- `dimension:MNN.Tensor_DimensionType_*` 数据排布格式
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getShape()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的形状。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor的数据形状
|
|
|
|
|
|
|
|
|
|
返回类型:`Tuple`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getDataType()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的数据类型。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor的数据类型
|
|
|
|
|
|
|
|
|
|
返回类型:`MNN.Halide_Type_*`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getDimensionType()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的持有的数据排布格式。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:`Tensor`持有的数据排布格式
|
|
|
|
|
|
|
|
|
|
返回类型:`MNN.Tensor_DimensionType_*`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getData()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的数据。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor的数据
|
|
|
|
|
|
|
|
|
|
返回类型:`Tuple`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getHost()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的数据指针。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor内部数据的数据指针
|
|
|
|
|
|
|
|
|
|
返回类型:`PyCapsule`, 可以参考[PyCapsule介绍](https://docs.python.org/3/c-api/capsule.html)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `copyFrom(from)`
|
|
|
|
|
|
2022-09-09 17:21:11 +08:00
|
|
|
|
从from中拷贝数据到当前Tensor,可用此函数将数据拷贝到输入Tensor中。
|
2022-08-23 21:21:29 +08:00
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `from:Tensor` - 拷贝的源Tensor
|
|
|
|
|
|
|
|
|
|
返回:是否拷贝成功
|
|
|
|
|
|
|
|
|
|
返回类型:`bool`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `copyToHostTensor(to)`
|
|
|
|
|
|
2022-09-09 17:21:11 +08:00
|
|
|
|
从当前Tensor拷贝数据到to,可用此函数将输出Tensor中的数据拷出。
|
2022-08-23 21:21:29 +08:00
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `to:Tensor` - 拷贝的目标Tensor
|
|
|
|
|
|
|
|
|
|
返回:是否拷贝成功
|
|
|
|
|
|
|
|
|
|
返回类型:`bool`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `getNumpyData()`
|
|
|
|
|
|
|
|
|
|
获取Tensor的数据,返回numpy数据。
|
2022-09-09 17:21:11 +08:00
|
|
|
|
*该API仅在PYMNN_NUMPY_USABLE=ON时生效,移动端默认关闭*
|
2022-08-23 21:21:29 +08:00
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:Tensor数据的numpy形式
|
|
|
|
|
|
|
|
|
|
返回类型:`numpy.ndarray`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `Example`
|
|
|
|
|
|
|
|
|
|
```python
|
2022-09-30 10:02:52 +08:00
|
|
|
|
import numpy as _np
|
2022-08-23 21:21:29 +08:00
|
|
|
|
import MNN
|
|
|
|
|
import MNN.numpy as np
|
2022-09-30 10:02:52 +08:00
|
|
|
|
data = _np.array([1., 2., 3.], dtype=_np.float32)
|
2022-08-23 21:21:29 +08:00
|
|
|
|
# 创建Tensor
|
|
|
|
|
# 通过给定的tuple创建Tensor, 参数分别为:形状,数据类型,数据,数据排布格式
|
|
|
|
|
t1 = MNN.Tensor((1, 3), MNN.Halide_Type_Float, (1., 2., 3.), MNN.Tensor_DimensionType_Caffe)
|
|
|
|
|
# 通过Var创建Tensor
|
|
|
|
|
t2 = MNN.Tensor(np.array([1., 2., 3.])) # 与t1等价
|
2022-09-30 10:02:52 +08:00
|
|
|
|
# 通过ndarray创建Tensor
|
|
|
|
|
t3 = MNN.Tensor([1, 3], MNN.Halide_Type_Float, data, MNN.Tensor_DimensionType_Caffe)
|
|
|
|
|
# 通过bytes创建Tensor
|
|
|
|
|
t4 = MNN.Tensor([1, 3], MNN.Halide_Type_Float, data.tobytes(), MNN.Tensor_DimensionType_Caffe)
|
|
|
|
|
# 通过int类型的内存指针创建Tensor,使用该方法比直接用ndarray速度快,但是要求ndarray的内存必须连续
|
|
|
|
|
t5 = MNN.Tensor([1, 3], MNN.Halide_Type_Float, data.__array_interface__['data'][0], MNN.Tensor_DimensionType_Caffe)
|
|
|
|
|
|
2022-08-23 21:21:29 +08:00
|
|
|
|
print(t1.getShape()) # (1, 3)
|
|
|
|
|
print(t1.getDataType()) # <capsule object NULL at 0x7fe01e74ff30>
|
|
|
|
|
print(t1.getDimensionType()) # 1
|
|
|
|
|
print(t1.getData()) # (1.0, 2.0, 3.0)
|
|
|
|
|
print(t1.getHost()) # <capsule object NULL at 0x7fe01e5645a0>
|
|
|
|
|
print(t1.getNumpyData()) # [[1. 2. 3.]]
|
|
|
|
|
```
|