自学内容网 自学内容网

昇思25天学习打卡营第5天|MindSpore网络模型构建

打卡

目录

打卡

模型类

模型网络:定义与使用

模型层级分解

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与输入的相同。

计算方式:

  1.  Softmax 函数对输入Tensor 在轴 axis 上的元素计算其指数函数值,然后归一化到 [0, 1] 范围,总和为1。
  2.  .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的参数及名称。


原文地址:https://blog.csdn.net/wwt72/article/details/140278643

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!