公司做网站需要服务器吗,做国外贸易哪个网站好,鹿寨建设局网站,自贡市工程造价信息网日期 心得
通过本节课的学习#xff0c;学习到了通过网络获取数据集#xff0c;处理数据集模型。数据模型层数据变换#xff0c;模型参数解析和其对应代码中的API进行解析。
昇思MindSpore 基础入门学习 网络构建 (AI 代码解析)
网络构建
神经网络模型是由神经网络层和T…日期 心得
通过本节课的学习学习到了通过网络获取数据集处理数据集模型。数据模型层数据变换模型参数解析和其对应代码中的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.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_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 512, weight_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 10, weight_initnormal, bias_initzeros))def construct(self, x):x self.flatten(x)logits self.dense_relu_sequential(x)return logitsmodel 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_initnormal, bias_initzeros)输入层输入大小为 28*28即 784输出大小为 512权重初始化为正态分布偏置初始化为零。nn.ReLU()ReLU 激活函数。nn.Dense(512, 512, weight_initnormal, bias_initzeros)隐藏层输入和输出大小均为 512。nn.ReLU()ReLU 激活函数。nn.Dense(512, 10, weight_initnormal, bias_initzeros)输出层输入大小为 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
logitspred_probab nn.Softmax(axis1)(logits)
y_pred pred_probab.argmax(1)
print(fPredicted 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(axis1)(logits): 对 logits 应用 softmax 函数将其转换为概率分布。nn.Softmax(axis1) 表示在第二个维度即类别维度上进行 softmax 操作。 y_pred pred_probab.argmax(1): 在概率分布 pred_probab 上找到最大概率对应的索引即预测的类别。argmax(1) 表示在第二个维度上找到最大值的索引。 print(fPredicted class: {y_pred}): 打印预测的类别。y_pred 是一个包含预测类别索引的张量。
ops.ones: 创建一个全为 1 的张量参数包括形状和数据类型。 nn.Softmax: softmax 函数用于将输入转换为概率分布参数 axis 指定在哪个维度上进行 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_channels28*28, out_channels20)
hidden1 layer1(flat_image)
print(hidden1.shape)layer1 nn.Dense(in_channels28*28, out_channels20): 创建一个全连接层 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(fBefore ReLU: {hidden1}\n\n)
hidden1 nn.ReLU()(hidden1)
print(fAfter ReLU: {hidden1})print(fBefore ReLU: {hidden1}\n\n): 打印 hidden1 的值即全连接层的输出在应用 ReLU 激活函数之前。 hidden1 nn.ReLU()(hidden1): 对 hidden1 应用 ReLU 激活函数。nn.ReLU() 创建一个 ReLU 激活函数层并将其应用于 hidden1。ReLU 函数将所有负值置为 0保持正值不变。 print(fAfter ReLU: {hidden1}): 打印 hidden1 的值即应用 ReLU 激活函数之后的输出。
nn.ReLU: ReLURectified 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: ReLURectified 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(axis1)
pred_probab softmax(logits)softmax nn.Softmax(axis1): 创建一个 Softmax 层 softmax指定在第 1 维度即每个样本的类别维度上应用 Softmax 函数。Softmax 函数将输入张量的每个元素转换为概率值且这些概率值的总和为 1。 pred_probab softmax(logits): 将 logits 传递给 Softmax 层 softmax得到输出 pred_probab。pred_probab 是经过 Softmax 函数处理后的概率分布。
nn.Softmax: Softmax 激活函数层用于将输入张量转换为概率分布。参数 axis 指定在张量的哪个维度上应用 Softmax 函数。通常在分类任务中Softmax 函数用于将网络的输出转换为类别概率。
通过这些操作可以将网络的输出 logits 转换为概率分布 pred_probab。假设 logits 的形状为 (batch_size, 10)那么 pred_probab 的形状也将为 (batch_size, 10)且每个样本的 10 个类别概率之和为 1。
模型参数
网络内部神经网络层具有权重参数和偏置参数如nn.Dense这些参数会在训练过程中不断进行优化可通过 model.parameters_and_names() 来获取参数名及对应的参数详情。
print(fModel structure: {model}\n\n)for name, param in model.parameters_and_names():print(fLayer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n)解析
print(fModel structure: {model}\n\n): 打印模型的结构信息。model 是一个神经网络模型对象打印它会显示模型的层和结构。 for name, param in model.parameters_and_names():: 遍历 model.parameters_and_names() 返回的迭代器获取每个参数的名称 name 和参数张量 param。 print(fLayer: {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# [](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_model.ipynb)emsp;[](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_model.py)emsp;[](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_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 512, weight_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 10, weight_initnormal, bias_initzeros))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(axis1)(logits)
y_pred pred_probab.argmax(1)
print(fPredicted 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_channels28*28, out_channels20)
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(fBefore ReLU: {hidden1}\n\n)
hidden1 nn.ReLU()(hidden1)
print(fAfter 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(axis1)
pred_probab softmax(logits)# ## 模型参数
#
# 网络内部神经网络层具有权重参数和偏置参数如nn.Dense这些参数会在训练过程中不断进行优化可通过 model.parameters_and_names() 来获取参数名及对应的参数详情。# In[12]:print(fModel structure: {model}\n\n)for name, param in model.parameters_and_names():print(fLayer: {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, opsmindsporeMindSpore的主库。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_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 512, weight_initnormal, bias_initzeros),nn.ReLU(),nn.Dense(512, 10, weight_initnormal, bias_initzeros))def construct(self, x):x self.flatten(x)logits self.dense_relu_sequential(x)return logitsNetwork类继承自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(axis1)(logits)
y_pred pred_probab.argmax(1)
print(fPredicted class: {y_pred})分解模型层 Flatten层
flatten nn.Flatten()
flat_image flatten(input_image)
print(flat_image.shape)Dense层
layer1 nn.Dense(in_channels28*28, out_channels20)
hidden1 layer1(flat_image)
print(hidden1.shape)ReLU层
print(fBefore ReLU: {hidden1}\n\n)
hidden1 nn.ReLU()(hidden1)
print(fAfter 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(axis1)
pred_probab softmax(logits)查看模型参数
print(fModel structure: {model}\n\n)
for name, param in model.parameters_and_names():print(fLayer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n)API解析
nn.CellMindSpore中所有网络的基类。nn.Flatten将输入的2D张量展平为一维数组。nn.Dense全连接层进行线性变换。nn.ReLUReLU激活函数。nn.SequentialCell有序的Cell容器按顺序执行各个Cell。nn.SoftmaxSoftmax激活函数将logits转换为概率分布。model.parameters_and_names()获取模型参数及其名称。
通过这些步骤和API的使用可以构建和管理神经网络模型并进行前向传播和参数管理。