日期
心得
通过本节课的学习,学习到了通过网络获取数据集,处理数据集模型。数据模型层数据变换,模型参数解析和其对应代码中的API进行解析。
昇思MindSpore 基础入门学习 网络构建 (AI 代码解析)
网络构建
神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell
,它由不同的子Cell
构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。
下面我们将构建一个用于Mnist数据集分类的神经网络模型。
import mindspore # 导入MindSpore库,这是一个深度学习框架,类似于TensorFlow和PyTorch。
from mindspore import nn, ops # 从MindSpore库中导入神经网络模块(nn)和操作模块(ops)。
import mindspore
:- 这一行代码导入了MindSpore库,MindSpore是一个开源的深度学习框架,由华为开发,旨在提供高效、灵活的AI计算框架。
from mindspore import nn, ops
:- 这一行代码从MindSpore库中导入了两个重要的模块:
nn
: 神经网络模块,包含了构建神经网络所需的各种层和函数,如卷积层、全连接层、激活函数等。ops
: 操作模块,提供了各种数学运算和操作,如矩阵运算、张量操作等。
- 这一行代码从MindSpore库中导入了两个重要的模块:
mindspore
:- MindSpore库的主要入口,提供了框架的基础功能和配置。
mindspore.nn
:- 神经网络模块,包含了一系列用于构建神经网络的类和函数,例如:
nn.Conv2d
: 二维卷积层。nn.Linear
: 全连接层。nn.ReLU
: ReLU激活函数。nn.Sequential
: 顺序容器,用于按顺序组合多个层。
- 神经网络模块,包含了一系列用于构建神经网络的类和函数,例如:
mindspore.ops
:- 操作模块,提供了各种数学运算和操作,例如:
ops.Add
: 加法操作。ops.MatMul
: 矩阵乘法操作。ops.ReduceSum
: 求和操作。ops.Softmax
: Softmax操作,用于多分类问题的输出层。
- 操作模块,提供了各种数学运算和操作,例如:
这些模块和类是构建和训练深度学习模型的基础组件,通过组合和配置这些组件,可以实现复杂的神经网络结构和算法。
定义模型类
当我们定义神经网络时,可以继承nn.Cell
类,在__init__
方法中进行子Cell的实例化和状态管理,在construct
方法中实现Tensor操作。
construct
意为神经网络(计算图)构建,相关内容详见使用静态图加速。
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(model)
class Network(nn.Cell):
:- 定义了一个名为
Network
的类,继承自nn.Cell
。在 MindSpore 中,nn.Cell
是构建神经网络的基本单元。
- 定义了一个名为
def __init__(self):
:- 初始化方法,定义了网络的结构。
super().__init__()
:调用父类nn.Cell
的初始化方法。self.flatten = nn.Flatten()
:创建一个nn.Flatten
层,用于将输入展平为一维向量。self.dense_relu_sequential = nn.SequentialCell(...)
:创建一个顺序容器nn.SequentialCell
,包含多个层:nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros")
:输入层,输入大小为28*28
(即 784),输出大小为 512,权重初始化为正态分布,偏置初始化为零。nn.ReLU()
:ReLU 激活函数。nn.Dense(512, 512, weight_init="normal", bias_init="zeros")
:隐藏层,输入和输出大小均为 512。nn.ReLU()
:ReLU 激活函数。nn.Dense(512, 10, weight_init="normal", bias_init="zeros")
:输出层,输入大小为 512,输出大小为 10(假设是 10 类分类问题)。
def construct(self, x):
:- 定义了网络的前向传播过程。
x = self.flatten(x)
:将输入x
展平为一维向量。logits = self.dense_relu_sequential(x)
:将展平后的输入通过顺序容器中的各层,得到最终的输出logits
。return logits
:返回最终的输出。
model = Network()
:- 创建
Network
类的一个实例model
。
- 创建
print(model)
:- 打印
model
的结构,显示网络的层和参数信息。
- 打印
nn.Cell
:- MindSpore 中用于构建神经网络的基本单元。
nn.Flatten
:- 将输入展平为一维向量的层。
nn.SequentialCell
:- 顺序容器,按顺序组合多个层。
nn.Dense
:- 全连接层,参数包括输入大小、输出大小、权重初始化和偏置初始化。
nn.ReLU
:- ReLU 激活函数,用于引入非线性。
通过这些组件,可以构建一个简单的多层感知机(MLP)网络,用于处理类似 MNIST 数据集的图像分类任务。
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
X = ops.ones((1, 28, 28), mindspore.float32)
:- 创建一个形状为
(1, 28, 28)
的张量X
,其中所有元素值为 1,数据类型为mindspore.float32
。这个张量模拟了一个 28x28 的单通道图像输入。
- 创建一个形状为
logits = model(X)
:- 将输入张量
X
传递给模型model
,得到模型的输出logits
。logits
是未经 softmax 处理的原始输出,通常用于分类任务。
- 将输入张量
pred_probab = nn.Softmax(axis=1)(logits)
:- 对
logits
应用 softmax 函数,将其转换为概率分布。nn.Softmax(axis=1)
表示在第二个维度(即类别维度)上进行 softmax 操作。
- 对
y_pred = pred_probab.argmax(1)
:- 在概率分布
pred_probab
上找到最大概率对应的索引,即预测的类别。argmax(1)
表示在第二个维度上找到最大值的索引。
- 在概率分布
print(f"Predicted class: {y_pred}")
:- 打印预测的类别。
y_pred
是一个包含预测类别索引的张量。
- 打印预测的类别。
ops.ones
:- 创建一个全为 1 的张量,参数包括形状和数据类型。
nn.Softmax
:- softmax 函数,用于将输入转换为概率分布,参数
axis
指定在哪个维度上进行 softmax 操作。
- softmax 函数,用于将输入转换为概率分布,参数
argmax
:- 找到张量中指定维度上的最大值对应的索引。
通过这些操作,可以对模型的输出进行后处理,得到最终的预测类别。
模型层
本节中我们分解上节构造的神经网络模型中的每一层。首先我们构造一个shape为(3, 28, 28)的随机数据(3个28x28的图像),依次通过每一个神经网络层来观察其效果。
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
input_image = ops.ones((3, 28, 28), mindspore.float32)
:- 创建一个形状为
(3, 28, 28)
的张量input_image
,其中所有元素值为 1,数据类型为mindspore.float32
。这个张量模拟了一个 28x28 的三通道图像输入(例如 RGB 图像)。
- 创建一个形状为
print(input_image.shape)
:- 打印
input_image
的形状。shape
属性返回张量的维度信息。
- 打印
ops.ones
:- 创建一个全为 1 的张量,参数包括形状和数据类型。
shape
:- 张量的属性,返回张量的维度信息。
通过这些操作,可以创建并查看一个模拟的三通道图像输入张量的形状。
nn.Flatten
实例化nn.Flatten层,将28x28的2D张量转换为784大小的连续数组。
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
flatten = nn.Flatten()
:- 创建一个
nn.Flatten
层,用于将输入张量展平为一维向量。
- 创建一个
flat_image = flatten(input_image)
:- 将
input_image
传递给flatten
层,得到展平后的张量flat_image
。
- 将
print(flat_image.shape)
:- 打印
flat_image
的形状。shape
属性返回张量的维度信息。
- 打印
nn.Flatten
:- 用于将输入张量展平为一维向量的层。
shape
:- 张量的属性,返回张量的维度信息。
通过这些操作,可以将一个形状为 (3, 28, 28)
的三通道图像输入张量展平为一维向量,并查看其形状。展平后的形状为 (3 * 28 * 28,)
,即 (2352,)
。
nn.Dense
nn.Dense为全连接层,其使用权重和偏差对输入进行线性变换。
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
:- 创建一个全连接层
layer1
,输入通道数为28*28
(即 784),输出通道数为 20。这个层将输入的展平图像转换为一个 20 维的向量。
- 创建一个全连接层
hidden1 = layer1(flat_image)
:- 将展平后的图像
flat_image
传递给全连接层layer1
,得到输出hidden1
。hidden1
是经过全连接层处理后的张量。
- 将展平后的图像
print(hidden1.shape)
:- 打印
hidden1
的形状。shape
属性返回张量的维度信息。
- 打印
nn.Dense
:- 全连接层(也称为线性层),用于将输入张量通过线性变换转换为输出张量。参数
in_channels
指定输入的特征数,out_channels
指定输出的特征数。
- 全连接层(也称为线性层),用于将输入张量通过线性变换转换为输出张量。参数
shape
:- 张量的属性,返回张量的维度信息。
通过这些操作,可以将展平后的图像输入传递给一个全连接层,并查看其输出的形状。假设 flat_image
的形状为 (batch_size, 28*28)
,那么 hidden1
的形状将为 (batch_size, 20)
。
nn.ReLU
nn.ReLU层给网络中加入非线性的激活函数,帮助神经网络学习各种复杂的特征。
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
print(f"Before ReLU: {hidden1}\n\n")
:- 打印
hidden1
的值,即全连接层的输出,在应用 ReLU 激活函数之前。
- 打印
hidden1 = nn.ReLU()(hidden1)
:- 对
hidden1
应用 ReLU 激活函数。nn.ReLU()
创建一个 ReLU 激活函数层,并将其应用于hidden1
。ReLU 函数将所有负值置为 0,保持正值不变。
- 对
print(f"After ReLU: {hidden1}")
:- 打印
hidden1
的值,即应用 ReLU 激活函数之后的输出。
- 打印
nn.ReLU
:- ReLU(Rectified Linear Unit)激活函数层,用于将输入张量中的所有负值置为 0,保持正值不变。
通过这些操作,可以观察全连接层输出在应用 ReLU 激活函数前后的变化。ReLU 激活函数有助于引入非线性,使得神经网络能够学习更复杂的函数。
nn.SequentialCell
nn.SequentialCell是一个有序的Cell容器。输入Tensor将按照定义的顺序通过所有Cell。我们可以使用nn.SequentialCell
来快速组合构造一个神经网络模型。
seq_modules = nn.SequentialCell(
flatten,
layer1,
nn.ReLU(),
nn.Dense(20, 10)
)
logits = seq_modules(input_image)
print(logits.shape)
seq_modules = nn.SequentialCell(flatten, layer1, nn.ReLU(), nn.Dense(20, 10))
:- 创建一个顺序模型
seq_modules
,包含以下层:flatten
:展平层,将输入图像展平为一维向量。layer1
:全连接层,将展平后的图像转换为 20 维向量。nn.ReLU()
:ReLU 激活函数层,对全连接层的输出应用 ReLU 激活函数。nn.Dense(20, 10)
:另一个全连接层,将 20 维向量转换为 10 维向量。
- 创建一个顺序模型
logits = seq_modules(input_image)
:- 将输入图像
input_image
传递给顺序模型seq_modules
,得到输出logits
。logits
是经过所有层处理后的最终输出。
- 将输入图像
print(logits.shape)
:- 打印
logits
的形状。shape
属性返回张量的维度信息。
- 打印
nn.SequentialCell
:- 顺序模型容器,用于按顺序组合多个层。输入数据将按顺序通过这些层。
nn.Dense
:- 全连接层(也称为线性层),用于将输入张量通过线性变换转换为输出张量。参数
in_channels
指定输入的特征数,out_channels
指定输出的特征数。
- 全连接层(也称为线性层),用于将输入张量通过线性变换转换为输出张量。参数
nn.ReLU
:- ReLU(Rectified Linear Unit)激活函数层,用于将输入张量中的所有负值置为 0,保持正值不变。
通过这些操作,可以将输入图像传递给一个包含多个层的顺序模型,并查看其最终输出的形状。假设 input_image
的形状为 (batch_size, 1, 28, 28)
,那么 logits
的形状将为 (batch_size, 10)
。
nn.Softmax
最后使用nn.Softmax将神经网络最后一个全连接层返回的logits的值缩放为[0, 1],表示每个类别的预测概率。axis
指定的维度数值和为1。
softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)
softmax = nn.Softmax(axis=1)
:- 创建一个 Softmax 层
softmax
,指定在第 1 维度(即每个样本的类别维度)上应用 Softmax 函数。Softmax 函数将输入张量的每个元素转换为概率值,且这些概率值的总和为 1。
- 创建一个 Softmax 层
pred_probab = softmax(logits)
:- 将
logits
传递给 Softmax 层softmax
,得到输出pred_probab
。pred_probab
是经过 Softmax 函数处理后的概率分布。
- 将
nn.Softmax
:- Softmax 激活函数层,用于将输入张量转换为概率分布。参数
axis
指定在张量的哪个维度上应用 Softmax 函数。通常在分类任务中,Softmax 函数用于将网络的输出转换为类别概率。
- Softmax 激活函数层,用于将输入张量转换为概率分布。参数
通过这些操作,可以将网络的输出 logits
转换为概率分布 pred_probab
。假设 logits
的形状为 (batch_size, 10)
,那么 pred_probab
的形状也将为 (batch_size, 10)
,且每个样本的 10 个类别概率之和为 1。
模型参数
网络内部神经网络层具有权重参数和偏置参数(如nn.Dense
),这些参数会在训练过程中不断进行优化,可通过 model.parameters_and_names()
来获取参数名及对应的参数详情。
print(f"Model structure: {model}\n\n")
for name, param in model.parameters_and_names():
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
解析
print(f"Model structure: {model}\n\n")
:- 打印模型的结构信息。
model
是一个神经网络模型对象,打印它会显示模型的层和结构。
- 打印模型的结构信息。
for name, param in model.parameters_and_names():
:- 遍历
model.parameters_and_names()
返回的迭代器,获取每个参数的名称name
和参数张量param
。
- 遍历
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
:- 打印每个参数的名称、形状和前两个值。
param.shape
返回参数张量的维度信息,param[:2]
返回参数张量的前两个值。
- 打印每个参数的名称、形状和前两个值。
API解析
model.parameters_and_names()
:- 获取模型中所有参数及其名称的方法。返回一个迭代器,包含参数名称和对应的参数张量。
通过这些操作,可以查看模型的结构以及每个层的参数名称、形状和前两个值。这对于调试和理解模型参数非常有用。例如,对于一个全连接层 nn.Dense(20, 10)
,其权重参数的形状可能是 (20, 10)
,偏置参数的形状可能是 (10,)
,并且可以查看这些参数的前两个值。
整体代码
#!/usr/bin/env python
# coding: utf-8
# [![下载Notebook](https://qingyun-test.oss-cn-hangzhou.aliyuncs.com/images/2024/07/14/image9817421053129015551.png)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_model.ipynb) [![下载样例代码](https://qingyun-test.oss-cn-hangzhou.aliyuncs.com/images/2024/07/14/image11826012109507579499.png)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_model.py) [![查看源文件](https://qingyun-test.oss-cn-hangzhou.aliyuncs.com/images/2024/07/14/image12685397076148884701.png)](https://gitee.com/mindspore/docs/blob/r2.3/tutorials/source_zh_cn/beginner/model.ipynb)
#
# [基本介绍](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/tensor.html) || [数据集 Dataset](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/dataset.html) || [数据变换 Transforms](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/transforms.html) || **网络构建** || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/save_load.html) || [使用静态图加速](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/accelerate_with_static_graph.html)
# # 网络构建
# 神经网络模型是由神经网络层和Tensor操作构成的,[mindspore.nn](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/mindspore.nn.html)提供了常见神经网络层的实现,在MindSpore中,[Cell](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.Cell.html)类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个`Cell`,它由不同的子`Cell`构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。
#
# 下面我们将构建一个用于Mnist数据集分类的神经网络模型。
# In[1]:
import mindspore
from mindspore import nn, ops
# ## 定义模型类
#
# 当我们定义神经网络时,可以继承`nn.Cell`类,在`__init__`方法中进行子Cell的实例化和状态管理,在`construct`方法中实现Tensor操作。
#
# > `construct`意为神经网络(计算图)构建,相关内容详见[使用静态图加速](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/accelerate_with_static_graph.html)。
# In[2]:
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
# 构建完成后,实例化`Network`对象,并查看其结构。
# In[3]:
model = Network()
print(model)
# 我们构造一个输入数据,直接调用模型,可以获得一个二维的Tensor输出,其包含每个类别的原始预测值。
#
# > `model.construct()`方法不可直接调用。
# In[4]:
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
# 在此基础上,我们通过一个`nn.Softmax`层实例来获得预测概率。
# In[5]:
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
# ## 模型层
#
# 本节中我们分解上节构造的神经网络模型中的每一层。首先我们构造一个shape为(3, 28, 28)的随机数据(3个28x28的图像),依次通过每一个神经网络层来观察其效果。
# In[6]:
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
# ### nn.Flatten
#
# 实例化[nn.Flatten](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.Flatten.html)层,将28x28的2D张量转换为784大小的连续数组。
# In[7]:
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
# ### nn.Dense
#
# [nn.Dense](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.Dense.html)为全连接层,其使用权重和偏差对输入进行线性变换。
# In[8]:
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
# ### nn.ReLU
#
# [nn.ReLU](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.ReLU.html)层给网络中加入非线性的激活函数,帮助神经网络学习各种复杂的特征。
# In[9]:
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
# ### nn.SequentialCell
#
# [nn.SequentialCell](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.SequentialCell.html)是一个有序的Cell容器。输入Tensor将按照定义的顺序通过所有Cell。我们可以使用`nn.SequentialCell`来快速组合构造一个神经网络模型。
# In[10]:
seq_modules = nn.SequentialCell(
flatten,
layer1,
nn.ReLU(),
nn.Dense(20, 10)
)
logits = seq_modules(input_image)
print(logits.shape)
# ### nn.Softmax
#
# 最后使用[nn.Softmax](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/nn/mindspore.nn.Softmax.html)将神经网络最后一个全连接层返回的logits的值缩放为\[0, 1\],表示每个类别的预测概率。`axis`指定的维度数值和为1。
# In[11]:
softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)
# ## 模型参数
#
# 网络内部神经网络层具有权重参数和偏置参数(如`nn.Dense`),这些参数会在训练过程中不断进行优化,可通过 `model.parameters_and_names()` 来获取参数名及对应的参数详情。
# In[12]:
print(f"Model structure: {model}\n\n")
for name, param in model.parameters_and_names():
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
# 更多内置神经网络层详见[mindspore.nn API](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/mindspore.nn.html)。
解析
- 导入必要的库:
import mindspore
from mindspore import nn, ops
mindspore
:MindSpore的主库。nn
:包含神经网络层和模块。ops
:包含各种Tensor操作。
- 定义模型类:
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
Network
类继承自nn.Cell
。__init__
方法中定义了网络的层结构。construct
方法中定义了前向传播的逻辑。
- 实例化模型并查看结构:
model = Network()
print(model)
- 测试模型:
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
logits
- 使用Softmax层获取预测概率:
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
- 分解模型层:
- Flatten层:
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
- Dense层:
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
- ReLU层:
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
- SequentialCell:
seq_modules = nn.SequentialCell(
flatten,
layer1,
nn.ReLU(),
nn.Dense(20, 10)
)
logits = seq_modules(input_image)
print(logits.shape)
- Softmax层:
softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)
- 查看模型参数:
print(f"Model structure: {model}\n\n")
for name, param in model.parameters_and_names():
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
API解析
nn.Cell
:MindSpore中所有网络的基类。nn.Flatten
:将输入的2D张量展平为一维数组。nn.Dense
:全连接层,进行线性变换。nn.ReLU
:ReLU激活函数。nn.SequentialCell
:有序的Cell容器,按顺序执行各个Cell。nn.Softmax
:Softmax激活函数,将logits转换为概率分布。model.parameters_and_names()
:获取模型参数及其名称。
通过这些步骤和API的使用,可以构建和管理神经网络模型,并进行前向传播和参数管理。