0
点赞
收藏
分享

微信扫一扫

[MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01

​​MindSpore​​

​​03 张量_哔哩哔哩_bilibili​​

注意本文多次引用官网的教程,以及其在b站上发的视频。这并不是我的文章,只能说我把细节打印整理下来,故我会将其标注为转载。

让我们引入张量的概念。下图是我们常见的数据

[MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01_mindspore

[MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01_张量_02

这是一个三维的张量

[MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01_数据_03

他的三种表现形式

[MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01_数据_04

这是一个四维张量

可以把Tensor的数学概念理解为高维的数据结构或者数据类型

Q:Tensor在mindspore中起什么作用呢?

A:Tensor是mindspore网络运算的一个基本数据结构,这意味着mindspore的所有运算或者数学操作都是基于Tensor的。

创建Tensor

1.创建tensor的方法有很多,首先我们可以根据数据直接生成tensor,数据类型可以设置或者通过框架自动推断。

>>> from mindspore import Tensor
>>> x=0.5
>>> tensor=Tensor(x)
>>> print(type(x)) #x的数据类型依然是float
<class 'float'>
>>> print(tensor)
0.5 #数据依然没有变,但数据类型已经变成mindspore的tensor了
>>> print(type(tensor))
<class 'mindspore.common.tensor.Tensor'>

Q:mindspore还支持其他数据类型转化成tensor吗?

>>> x=[0.5]                #列表可以
>>> print(type(tensor))
<class 'mindspore.common.tensor.Tensor'>

2.从NumPy数组生成

import numpy as np
>>> arr=np.array([1,0,1,0])
>>> print(type(arr))
<class 'numpy.ndarray'>
>>> x_np=Tensor(arr)
>>> print(type(x_np))
<class 'mindspore.common.tensor.Tensor'>
#numpy的数据类型直接转化为张量

3.使用init初始化器构造张量

Q:Tensor在构建的时候已经指定过数据了【例如Tensor(x)】,那为什么还需要构造器来指定张量呢?

A:在神经网络里面张量是一个高维的数据,如果张量一开始初始化做的好,可能会有助于神经网络模型的学习

当使用init初始化器对张量进行初始化时,支持传入的参数有init、shape、dtype.

init:支持传入initializer的子类

shape:支持传入list, tuple, int。

dtype:支持传入mindspore.dtype。

from mindspore import Tensor
from mindspore import set_seed
from mindspore import dtype as mstype
from mindspore.common import initializer as init#通过这个init初始化构造器来定义张量
#假设希望能够得到一个全1的张量

set_seed(1)

tensor1 = Tensor(shape=(2,2), dtype=mstype.float32, init=init.One())#用init.One作为第三入参
print(tensor1)
print(type(tensor1))

tensor2 = Tensor(shape=(2,2), dtype=mstype.float32, init=init.Normal())
print(tensor2)
print(type(tensor2))

[[1. 1.]            #结果
[1. 1.]]
<class 'mindspore.common.tensor.Tensor'>
[[-0.00128023 -0.01392901]
[ 0.0130886 -0.00107818]]
<class 'mindspore.common.tensor.Tensor'>

Q:有更复杂的数据分布吗?

A:mindspore提供了非常丰富的init函数,从mindspore官网查看API

​​MindSpore官网​​

​​MindSpore​​

4.继承一个张量的属性,然后形成一个同一维度的张量

from mindspore import ops
from mindspore import Tensor
from mindspore import dtype as astype
import numpy as np

x_data=Tensor(np.array([[0,1],[1,2]]).astype(np.int32))
print(x_data)

x_ones = ops.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")

x_zeros = ops.zeros_like(x_data)
print(f"Zeros Tensor: \n {x_ones} \n")

[[0 1]
[1 2]]
Ones Tensor:
[[1 1] #与原来的shape相同
[1 1]]

Zeros Tensor:
[[1 1]
[1 1]]

张量的属性

张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。

  • 形状(shape):​​Tensor​​的shape,是一个tuple。
  • 数据类型(dtype):​​Tensor​​的dtype,是MindSpore的一个数据类型。
  • 单个元素大小(itemsize): ​​Tensor​​中每一个元素占用字节数,是一个整数。
  • 占用字节数量(nbytes): ​​Tensor​​占用的总字节数,是一个整数。
  • 维数(ndim): ​​Tensor​​的秩,也就是len(tensor.shape),是一个整数。
  • 元素个数(size): ​​Tensor​​中所有元素的个数,是一个整数。
  • 每一维步长(strides): ​​Tensor​​每一维所需要的字节数,是一个tuple。

x = Tensor(np.array([[1, 2], [3, 4]]), mindspore.int32)

print("x_shape:", x.shape)
print("x_dtype:", x.dtype)
print("x_itemsize:", x.itemsize)
print("x_nbytes:", x.nbytes)
print("x_ndim:", x.ndim)
print("x_size:", x.size)
print("x_strides:", x.strides)

x_shape: (2, 2)
x_dtype: Int32
x_itemsize: 4
x_nbytes: 16
x_ndim: 2
x_size: 4
x_strides: (8, 4)

张量索引

Tensor索引与Numpy索引类似,索引从0开始编制,负索引表示按倒序编制,冒号:和 ...用于对数据进行切片。

张量运算

张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似,下面介绍其中几种操作。

普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)

x = Tensor(np.array([1, 2, 3]), mindspore.float32)
y = Tensor(np.array([4, 5, 6]), mindspore.float32)

output_add = x + y
output_sub = x - y
output_mul = x * y
output_div = y / x
output_mod = y % x
output_floordiv = y // x

print("add:", output_add)
print("sub:", output_sub)
print("mul:", output_mul)
print("div:", output_div)
print("mod:", output_mod)
print("floordiv:", output_floordiv)

add: [5. 7. 9.]
sub: [-3. -3. -3.]
mul: [ 4. 10. 18.]
div: [4. 2.5 2. ]
mod: [0. 1. 0.]
floordiv: [4. 2. 2.]

Tensor与NumPy之间可以相互转换

Tensor转换为NumPy

与张量创建相同,使用 ​​asnumpy()​​ 将Tensor变量转换为NumPy变量。

t = ops.ones(5, mindspore.float32)
print(f"t: {t}")
n = t.asnumpy()
print(f"n: {n}")

NumPy转换为Tensor

使用​​Tensor()​​将NumPy变量转换为Tensor变量。

n = np.ones(5)
t = Tensor.from_numpy(n)

本章小结

1.学习了Tensor的基本概念

2.学习了Mindspore Tensor的作用

3.学习了如何构建,索引和张量的运算

(对于mindspore的快速入门,我可能在明天再出一期,尽情期待)

感谢阅读

举报

相关推荐

0 条评论