打卡
目录
打卡
模型类
模型网络:定义与使用
模型层级分解
nn.Flatten 张量转换-演示查看
nn.Dense 全连接层-演示查看
nn.ReLU 非线性激活层-演示查看
nn.SequentialCell 有序网络容器
nn.Softmax 多分类概率预测
模型参数
前置感受:总的来说,使用Mindspore创建一个基本的网络结构是简单容易的,在动态图测试本节内容的情况下,同pytorch的区别不是很大。静态图下的情况没有测试。
模型类
mindspore.nn — MindSpore master 文档
- mindspore.nn.Cell :构建所有网络的基类
- AI编译框架分为两种运行模式,分别是动态图模式(又被称为PyNative模式)以及 静态图模式 (又被称为Graph模式)。MindSpore默认以动态图模式运行,但也支持手工切换为静态图模式。
- 动态图的特点 是计算图的构建和计算同时发生(Define by run)。在调试模型时较为方便,能够实时得到中间结果的值,但由于所有节点都需要被保存,导致难以对整个计算图进行优化。
- 静态图的特点 是将计算图的构建和实际计算分开(Define and run)。在Graph模式下,编译器可以针对图进行全局的优化,获得较好的性能,比较适合网络固定且需要高性能的场景。静态图模式先编译后执行的模式导致其存在编译耗时。
- 使用MindSpore API以及基于Tensor对象的操作更适合使用静态图编译优化。
- Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。因此,编译器无法支持全量的Python语法。MindSpore的静态图编译器维护了Python常用语法子集,以支持神经网络的构建及训练
- context模式是一种全局的设置模式。代码示例如下。
import mindspore as ms
## 选动态图的配置
ms.set_context(mode=ms.PYNATIVE_MODE) # 使用set_context进行动态图模式的配置
## 选静态图的配置
ms.set_context(mode=ms.GRAPH_MODE) # 使用set_context进行运行静态图模式的配置
模型网络:定义与使用
MindSpore中,Cell 类是构建所有网络的基类。如下代码,__init__
方法中进行子Cell的实例化和状态管理,在construct
方法中实现Tensor操作。model.construct()
方法不可直接调用。
如下网络结构:先将Tensor数据展平到28*28维,再构建 [512,28*28] 的全连接层权重矩阵,经过激活函数后,再构建 [512,512] 的全连接层权重矩阵,再次经过激活函数后,再构建 [512,10] 的全连接层权重矩阵后,输出,
import mindspore
from mindspore import nn, ops
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 10, weight_init="normal", bias_init="zeros")
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
print("查看模型网络结构:\n", model)
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
print("查看输入经过模型的输出值:\n", logits)
print(type(logits)) # <class 'mindspore.common._stub_tensor.StubTensor'>
print(logits.shape) # (1, 10)
## 获得预测概率
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
模型层级分解
nn.Flatten 张量转换-演示查看
mindspore.nn.Flatten : 沿着从 start_dim 到 end_dim 的维度,对输入Tensor进行展平。
mindspore.nn.Flatten( start_dim=1, ## 要展平的第一个维度。默认 1 。
end_dim=-1 ## 要展平的最后一个维度。默认 -1 。
)
nn.Dense 全连接层-演示查看
mindspore.nn.Dense :适用于输入的密集连接层,用权重和偏差对输入进行线性变换。
计算方式:y = activation(X * kernel + bias ) = 激活函数(输入数据 * 权重矩阵 + 偏置向量)
mindspore.nn.Dense(in_channels, ## int,输入Tensor的空间维度
out_channels, ## int,输出Tensor的空间维度
weight_init=None, ## 默认 None,权重使用HeUniform初始化。
bias_init=None, ## 默认 None,偏差使用Uniform初始化。
has_bias=True, ## 默认 True, 使用偏置向量
activation=None, ## 可指定激活函数名,如’relu’,或具体激活函数,如 mindspore.nn.ReLU 。默认 None
dtype=mstype.float32)
nn.ReLU 非线性激活层-演示查看
mindspore.nn.ReLU : 逐元素计算ReLU(Rectified Linear Unit activation function)修正线性单元激活函数。
计算方式:ReLU(x)=max(0, x)
nn.SequentialCell 有序网络容器
mindspore.nn.SequentialCell : 按照传入顺序依次添加神经网络 Cell, 可以通过初始化方式构建如下,也可像list一样通过 append(cell) 方式添加。
nn.Softmax 多分类概率预测
mindspore.nn.Softmax : 将多分类的结果以概率的形式展现出来,输出的数据类型和shape与输入的相同。
计算方式:
- Softmax 函数对输入Tensor 在轴 axis 上的元素计算其指数函数值,然后归一化到 [0, 1] 范围,总和为1。
- .argmax(dims=?) 表示沿着指定的轴找到最大值的索引,参数
1
表示沿着第二个轴。
模型参数查看
网络内部神经网络层具有权重参数和偏置参数,如 nn.Dense,这些参数会在训练过程中不断进行优化,通过 model.parameters_and_names()
可获取参数名及对应的参数详情。
mindspore.nn.Cell :parameters_and_names(name_prefix='', expand=True) 返回Cell中parameter的迭代器。包含参数名称和参数本身。expand 为True 则递归地获取当前Cell和所有子Cell的参数及名称;如果为 False
,只生成当前Cell的子Cell的参数及名称。