张量的属性
- 张量的形状
- 张量的数据类型
- 张量的矢(维度)
- 张量的元素个数
- 张量的每一维度步长
import numpy as np
from mindspore import Tensor
x=Tensor(np.array([[0,1,4],[3,4,8],[5,8,8]]).astype(np.float16))
y=Tensor(np.array([[0,1],[3,4],[5,8]]).astype(np.float16))
print("x_shape",x.shape)
print("x_dtype",x.dtype)
print("x_ndim",x.ndim)
print("x_size",x.size)
print("x_strides",x.strides)
print("y_strides",y.strides)
张量之间的运算:
张量的意义
张量是一种数学对象,可以理解为一个多维数组。我们平常所见的标量、向量和矩阵都是张量的特例:
- 标量:一个单独的数,可以看作是零阶张量(0D)。
- 向量:一维数组,如 [1,2,3][1, 2, 3][1,2,3],是一个一阶张量(1D)。
- 矩阵:二维数组,是一个二阶张量(2D)。
- 更高阶张量:三维及更高维的数组,比如三阶张量可以看作是多个矩阵的集合。
张量的作用
张量在很多科学和工程领域有广泛应用,尤其是在机器学习和深度学习中:
-
数据表示:
- 张量用于表示输入数据和模型参数。在图像处理领域,一张彩色图片可以表示为一个三维张量(高度、宽度和颜色通道)。
- 在自然语言处理领域,文本数据可以表示为一维或二维张量(单词或句子)。
-
计算方便:
- 张量运算如加法、乘法等可以高效地进行并行计算,这对于处理大量数据和复杂模型非常重要。
- 张量库(如TensorFlow、PyTorch和MindSpore)提供了很多内置函数,可以方便地对张量进行操作。
-
模型训练:
- 深度学习模型的训练过程中,参数更新和数据处理都使用张量。
- 通过定义损失函数和优化算法,模型可以在训练过程中不断调整参数,使得预测结果更准确。
模型
网络构建:
定义类
class Network(nn.Cell):#定义一个网络,继承自nn.cell
def _init_(self):#定义初始化方法。当创建 Network 类的实例时,这个方法会被自动调用。
super()._init_()
self.flatten=nn.Flatten()
#定义一个展平层 Flatten,用于将输入的多维张量展平成一维。
self.dense_relu_sequential=nn.SequentialCell(
#定义一个顺序层,包含全连接层和relu激活函数
self.Dense(28*28,512,weight_init="normal",bias_init="zeros"),
# 第一个全连接层,输入大小为 28*28,输出大小为 512,权重初始化为正态分布,偏置初始化为零
nn.ReLU(),
self.Dense(512,512,weight_init="normal",bias_init="zeros"),
# 第二个全连接层,输入大小为 512,输出大小为512,权重初始化为正态分布,偏置初始化为零
nn.ReLU(),
self.Dense(512,10,weight_init="normal",bias_init="zeros"),
# 第二个全连接层,输入大小为 512,输出大小为10,权重初始化为正态分布,偏置初始化为零
)
def construct(self,x): # 前向传播方法
x=self.flatten(x) #定义一个展平层 Flatten,用于将输入的多维张量展平成一维
logits=self.dense_relu_sequential(x) # 通过上面定义的顺序层进行计算
return logits
构建完成后实例化该网络
#实例化模型
model = Network()
# 打印模型结构
print(model)
模型层详细每个函数的用法如下:
创建传入的图像:
image=ops.ones((5,38,38),mindspore.float32)
print(image.shape)
#创建五张38*38的图像
flatten的运用:将多维的数据(矩阵等)转化为一维的向量
flatten=nn.Flatten()
image_flat=flatten(image)
print(image_flat.shape)
nn.Dense为全连接层,使用w(权重)和b(偏差)为输入和输出进行图像的变换
layer1=nn.Dense(in_channels=38*38,out_channels=30)
hidden1=layer1(image_flat)
print(hidden1.shape)
注意in_channels和out_channels为输入该全连接层和输出该全连接层的
未添加ReLU激活函数:
添加了ReLU激活函数:
定义一个SequentialCell容器,来构建神经网络模型(相当于一个集成)
models1=nn.SequentialCell(
flatten,
layerl,
nn.ReLU(),
nn.Dense(30,10)#注意这里的30是要与layerl的输出相同
)
logits=models1(image)
print(f"okok{logits.shape}\n")
nn.Softmax
最后一个全连接层返回的是[0,1]里面的值
softmax=nn.Softmax(axis=1)
pred=softmax(logits)
print(f"em{pred}\n")
打印结果~~