《昇思 25 天学习打卡营第 5天 | 网络构建 》
活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp
签名:Sam9029
网络构建
概念:
神经网络模型是由神经网络层和 Tensor 操作构成的,mindspore.nn 提供了常见神经网络层的实现,在 MindSpore 中,Cell 类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个 Cell,它由不同的子 Cell 构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。
课程的解释如上, 我自己理解一下:
在 MindSpore 框架中,构建神经网络模型是创建和定义深度学习模型的过程。这些模型用于各种机器学习和人工智能任务,包括但不限于图像识别、自然语言处理、时间序列预测等。
关键目的和功能:
- 神经网络通过学习数据的表示来进行预测或分类。
- 提取输入数据的特征
- …
同时构建神经网络模型是深度学习中的一个核心过程,MindSpore 提供了一套完整的工具和 API 来支持这个过程,
引入使用
import mindspore
from mindspore import nn, ops
定义模型类
class Network(nn.Cell):
# 类Network继承自MindSpore的nn.Cell,用于构建神经网络模型
def __init__(self):
# 构造函数初始化网络层
super().__init__() # 调用基类的构造函数
self.flatten = nn.Flatten() # 实例化一个Flatten层,用于数据展平操作
# 使用SequentialCell组织一系列按顺序执行的层
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"), # 第一个全连接层,权重初始化为正态分布,偏置初始化为零
nn.ReLU(), # ReLU激活函数,引入非线性
nn.Dense(512, 512, weight_init="normal", bias_init="zeros"), # 第二个全连接层
nn.ReLU(), # 第二个ReLU激活函数
nn.Dense(512, 10, weight_init="normal", bias_init="zeros") # 第三个全连接层,输出维度为10
)
def construct(self, x):
# 前向传播函数,定义数据通过网络的流程
x = self.flatten(x) # 将输入数据x展平为一维
logits = self.dense_relu_sequential(x) # 将展平后的数据通过SequentialCell中的层序列
return logits # 返回未经softmax转换的原始分类结果logits
实例化Network对象:
model = Network()
创建 Network
类的一个实例,这个实例包含了定义好的神经网络结构。
打印模型结构:
print(model)
输出模型的结构,展示了模型中的层和它们的配置。
模型结构输出解析:
Network<
(flatten): Flatten<>
(dense_relu_sequential): SequentialCell<
(0): Dense<input_channels=784, output_channels=512, has_bias=True>
(1): ReLU<>
(2): Dense<input_channels=512, output_channels=512, has_bias=True>
(3): ReLU<>
(4): Dense<input_channels=512, output_channels=10, has_bias=True>
>
>
Flatten<>
:数据展平层,将输入数据展平为一维。SequentialCell
:顺序单元,包含一系列按顺序执行的层。Dense
:全连接层,包含输入通道数、输出通道数,以及是否有偏置项。ReLU
:激活层,使用ReLU激活函数。
创建输入数据:
X = ops.ones((1, 28, 28), mindspore.float32)
生成一个形状为 (1, 28, 28) 的全1张量,数据类型为 mindspore.float32
,用作模型的输入。
模型前向传播获取原始预测值:
logits = model(X)
使用模型实例对输入数据 X
进行前向传播,获取原始的预测值 logits
。
原始预测值输出:
Tensor(shape=[1, 10], dtype=Float32, value=[
[-0.000508734, 0.00033919, 0.00046284, ..., -0.00120305, -0.00050569, 0.00039926]])
输出一个形状为 [1, 10] 的张量,包含了每个类别的原始预测值。
Softmax层获取预测概率:
pred_probab = nn.Softmax(axis=1)(logits)
使用 nn.Softmax
层对原始预测值 logits
应用 softmax 函数,获取每个类别的预测概率。
获取预测类别:
y_pred = pred_probab.argmax(1)
通过 argmax
函数沿指定轴(这里是轴1)找到最大值的索引,即预测的类别。
打印预测类别:
print(f"Predicted class: {y_pred}")
输出预测的类别。
预测类别输出:
```
Predicted class: [4]
```
最终输出预测的类别索引为4。
通过以上步骤,我们构建了一个简单的神经网络模型,实例化了模型对象,生成了输入数据,执行了前向传播,获取了原始预测值和预测概率,并最终确定了预测的类别。
这个过程展示了如何使用MindSpore框架进行基本的深度学习任务。
今天的网络构建就学到这些,有点难以理解,今天只能先了解概念,并走一遍简单的流程
千里之行,始于足下!
我会继续一步一步的保持学习,在 昇思社区 进行 AI 技术方面的探索和学习
希望能给同样对 AI 充满热情的你一些启发。记住,技术的世界无限广阔,让我们一起勇敢地迈出探索的脚步吧!🚀🤖