MindSpore
注意本文多次引用官网的教程,以及其在b站上发的视频。这并不是我的文章,只能说我把细节打印整理下来,故我会将其标注为转载。
让我们引入张量的概念。下图是我们常见的数据
这是一个三维的张量
他的三种表现形式
这是一个四维张量
可以把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
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的快速入门,我可能在明天再出一期,尽情期待)
感谢阅读
标签:01,Tensor,dtype,张量,init,MindSpore,print,mindspore From: https://blog.51cto.com/u_15818358/5831411