昇思25天学习打卡营第03天 | 张量 Tensor
文章目录
- 昇思25天学习打卡营第03天 | 张量 Tensor
- 张量
- 张量的创建
- 张量的属性
- Tensor与NumPy转换
- 稀疏张量
- CSRTensor
- COOTensor
- 总结
- 打卡
张量
张量(Tensor)是一种类似于数组和矩阵的特殊数据结构,是神经网络中参与运算的基本结构。
对于
n
n
n维空间中的一个张量,其具有
n
r
n^r
nr个坐标分量,其中
r
r
r被称为该张量的秩或阶。
张量的创建
- 从列表创建
data = [1, 0, 1, 0]
x_data = Tensor(data)
- 从NumPy数组创建
np_array = np.array(data)
x_np = Tensor(np_array)
- 使用
init
初始化器创建,需要传入三个参数,主要用于并行模式下的延后初始化。init
:支持initializer的子类,如One()
和Normal()
shape
:支持list
、tuple
、int
dtype
:支持mindspore.dtype
tensor1 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=One())
# Initialize a tensor from normal distribution
tensor2 = mindspore.Tensor(shape=(2, 2), dtype = mindspore.float32, init=Normal())
- 从一个张量创建新的张量
from mindspore import ops
x_ones = ops.ones_like(x_data) # [1 1 1 1]
x_zeros = ops.zeros_like(x_data) # [0 0 0 0]
张量的属性
MindSpore中一个张量具有下面的属性:
- shape
- dtype
- itemsize:单个元素所占的字节大小
- nbytes:Tensor所占的总字节数
- ndim:Tensor的秩
- size:Tensor中元素的个数
- strides:Tensor每一维所需要的字节数
Tensor与NumPy转换
- 使用
Tensor.asnumpy()
将Tensor转换为Numpy数组。 - 使用
Tensor.from_numpy()
将numpy数组转换为Tensor
稀疏张量
在很多场景中,张量中只有少量的非零元素,如果用普通张量进行存储,会引入大量不必要的开销,这时就可以使用稀疏张量来表示。
MindSpore中定了了三种稀疏张量结构:CSRTensor
、COOTensor
,RowTensor
CSRTensor
CSR (Compressed Sparse Row) Tensor 具有高效的存储和计算优势。
indptr
:一维整数张量,表示非零元素在values中的起始位置和结束位置;indices
:一维整数张量,表示非零元素在列中的位置,与values
长度相等;values
:一维张量,表示非零元素;shape
:表示被压缩的张量的形状。
indptr = Tensor([0, 1, 2])
indices = Tensor([0, 1])
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (2, 4)
# Make a CSRTensor
csr_tensor = CSRTensor(indptr, indices, values, shape)
上述代码对应的Tensor为:
[
1
0
0
0
0
2
0
0
]
\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \end{bmatrix}
[10020000]
COOTensor
COO (Coordinate Format) Tensor用来表示给定索引上非零元素的集合,其参数为:
indices
:二维证书张量,每行代表非零元素的下标。values
:一维张量,表示非零元素值。shape
:表示被压缩的稀疏张量的形状。
indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (3, 4)
# Make a COOTensor
coo_tensor = COOTensor(indices, values, shape)
总结
这一节内容对MindSpore框架中的Tensor进行了较为详细的介绍,包括Tensor的创建、Tensor的索引和简单运算、与NumPy数组之间的转换。此外,还介绍了稀疏矩阵的两种表示方法和创建方法,为之后对张量的操作建立了初步的认识。