昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建

神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同的子Cell构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。

下面我们将构建一个用于Mnist数据集分类的神经网络模型。

# 导入MindSpore框架,这是一个面向AI应用的全场景深度学习框架
import mindspore# 从MindSpore框架中导入nn(神经网络相关模块)和ops(操作相关模块)
# nn模块包含构建神经网络所需的各种层和激活函数等
# ops模块提供了执行计算任务的各种操作,例如数学运算和数组操作等
from mindspore import nn, ops

1.1 定义模型类

当我们定义神经网络时,可以继承nn.Cell类,在__init__方法中进行子Cell的实例化和状态管理,在construct方法中实现Tensor操作。

construct意为神经网络(计算图)构建,相关内容详见使用静态图加速。

# 定义一个Network类,继承自nn.Cell,Cell是MindSpore中构建网络的基类
class Network(nn.Cell):# 定义初始化方法,用于完成神经网络的构建def __init__(self):# 调用父类的构造函数super().__init__()  # 创建一个Flatten层,用于将输入展平为一维向量self.flatten = nn.Flatten()  # 创建一个SequentialCell,它将多个层按顺序组合起来self.dense_relu_sequential = nn.SequentialCell(# 第一个全连接层,输入节点(神经元)数为28*28(假设是MNIST图像的大小),输出节点数为512# 权重初始化为正态分布,偏置初始化为0nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),# ReLU激活函数nn.ReLU(),  # 第二个全连接层,512个输入节点,512个输出节点nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),# ReLU激活函数nn.ReLU(),  # 第三个全连接层,512个输入节点,10个输出节点(假设是10个类别)nn.Dense(512, 10, weight_init="normal", bias_init="zeros"))# construct方法是实现Cell向前传播的逻辑def construct(self, x):# 使用Flatten层将输入x展平x = self.flatten(x)  # 将展平后的x通过全连接层和激活函数logits = self.dense_relu_sequential(x)  # 返回最后的logits,即模型的输出return logits  # 创建Network类的实例,这将初始化神经网络模型的结构
model = 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>>>

为了方便理解,我把这个神经网络画出来了
network

为了方便理解,把tensor也画进去了,实际上,这个网络结构定义好的时候是不包含具体的向量值的。
只是一个算法结构定义,flatten层和神经元内都是没有值的。
只有在训练或预测时,传入了Tensor值时,才会如上图所示
并且Tensor基本上会做过数据变换,传入易于神经网络计算的值,不然全是正值的话,ReLU层就没有存在的必要了。
另外,模型在被创建时,一般会完成参数的初始化,即图上所有的a(mn)和b(mn)都会有初始值。
所谓对模型的训练,就是不断调整这些初始参数,使得他们能在尽可能多的情况下满足给定输入可以计算出预期输出的过程。
而模型推理指的是,使用已练训练好的这些模型参数和整个模型算法结构,给定输入后,推测出结果的过程。

1.2 使用模型进行预测

# 使用ops模块的ones函数创建一个形状为(1, 28, 28)的张量,并指定数据类型为float32
# 这个张量可以代表一个单通道的28x28像素的图像,所有元素都初始化为1
X = ops.ones((1, 28, 28), mindspore.float32)# 将创建的张量X作为输入传递给模型model,计算前向传播的输出
logits = model(X)# 打印模型输出的logits,这通常代表了模型对输入数据的预测结果
## 在Python交互式环境(如Python shell或Jupyter notebook)中,当你输入一个变量名并按下回车时,系统会自动调用该变量的__repr__或__str__方法来打印出一个可读的字符串表示,以便于用户查看变量的内容。
## 如果你在脚本文件中执行这段代码,而没有使用print函数,变量logits的内容将不会被打印出来。
logits

输出:

Tensor(shape=[1, 10], dtype=Float32, value=
[[ 4.55602678e-03, -1.45907002e-02,  1.84002449e-03 ...  8.69915355e-03,  6.90837333e-04, -4.99743177e-03]])
# 使用nn模块中的Softmax函数计算logits的softmax概率分布
# Softmax函数通常用于多分类问题,将 logits 转换为概率分布
# 通俗理解就是传入一张图片,Softmax会将这张图片是0-9每个数字(代表10个类别)的概率都计算出来。
# 参数axis=1表示在第二个维度(索引为1)上应用softmax,即对每个样本的所有类别的logits进行归一化
pred_probab = nn.Softmax(axis=1)(logits)# 使用argmax函数找到每个样本在概率分布中最大值的索引,概率最大的类别,即预测的类别
# argmax函数的参数1表示在第二个维度(索引为1)上找到最大值的索引
y_pred = pred_probab.argmax(1)# 打印预测的类别
# f-string是一种格式化字符串的语法,可以在字符串中嵌入表达式
# {y_pred}会被替换为y_pred变量的值
print(f"Predicted class: {y_pred}")

输出:

Predicted class: [4]

1.3 模型层详解

本节中我们分解上节构造的神经网络模型中的每一层。首先我们构造一个shape为(3, 28, 28)的随机数据(3个28x28的图像),依次通过每一个神经网络层来观察其效果。

# 使用ops模块的ones函数创建一个形状为(3, 28, 28)的张量,并指定数据类型为float32
# 这个张量可以代表一个3通道的28x28像素的图像,所有元素都初始化为1
input_image = ops.ones((3, 28, 28), mindspore.float32)# 打印输入图像张量的形状
print(input_image.shape)

输出:

(3, 28, 28)

1.3.1 nn.Flatten(展平层)

实例化nn.Flatten层,将28x28的2D张量转换为784大小的连续数组。

# 创建一个Flatten层实例,用于将输入张量展平为一维向量
flatten = nn.Flatten()# 使用Flatten层处理输入图像张量input_image,将其展平为一维向量
# 由于输入图像是3个通道的28x28像素,展平后每个通道将变成一个784长度的一维向量
flat_image = flatten(input_image)# 打印展平后图像张量的形状
# 输出将是(3, 784),表示有三个一维向量,每个向量长度为784
print(flat_image.shape)

输出:

(3, 784)

1.3.2 nn.Dense(全连接层)

nn.Dense为全连接层,其使用权重和偏差对输入进行线性变换。

# 创建一个全连接层layer1,其中in_channels参数设置为28*28,out_channels参数设置为20
# 这意味着该层将有28*28个输入节点和20个输出节点
layer1 = nn.Dense(in_channels=28*28, out_channels=20)# 将展平后的图像flat_image作为输入传递给全连接层layer1
# 计算全连接层的输出,这将是20个特征的一维向量,每个向量对应于输入图像的一个样本
hidden1 = layer1(flat_image)# 打印全连接层输出的形状和内容
# 输出形状将是(3, 20),表示有三个样本,每个样本有20个特征
# 输出内容将是这些特征的值
print(hidden1.shape, hidden1)

输出:

(3, 20) [[ 0.5608331  -0.06500022  0.5195999   0.45284656  0.22346526 -0.22476278-0.340589   -0.43673825 -0.57077926 -0.44966274  0.3863637   0.52841353-0.44325724  1.1107857  -1.2462549  -0.17119673  0.46310893 -0.8667695-0.204903    0.0104395 ][ 0.5608331  -0.06500022  0.5195999   0.45284656  0.22346526 -0.22476278-0.340589   -0.43673825 -0.57077926 -0.44966274  0.3863637   0.52841353-0.44325724  1.1107857  -1.2462549  -0.17119673  0.46310893 -0.8667695-0.204903    0.0104395 ][ 0.5608331  -0.06500022  0.5195999   0.45284656  0.22346526 -0.22476278-0.340589   -0.43673825 -0.57077926 -0.44966274  0.3863637   0.52841353-0.44325724  1.1107857  -1.2462549  -0.17119673  0.46310893 -0.8667695-0.204903    0.0104395 ]]

1.3.3 nn.ReLU(激活函数)

nn.ReLU层给网络中加入非线性的激活函数,帮助神经网络学习各种复杂的特征。

# 使用ReLU激活函数对全连接层的输出hidden1进行非线性处理
# ReLU激活函数将替换hidden1中的所有负值元素为0
hidden1 = nn.ReLU()(hidden1)# 打印经过ReLU激活函数处理后的输出
# 输出将是经过ReLU处理的特征值,其中所有负值已经被替换为0
print(f"After ReLU: {hidden1}")

输出:

After ReLU: [[0.5608331  0.         0.5195999  0.45284656 0.22346526 0.0.         0.         0.         0.         0.3863637  0.528413530.         1.1107857  0.         0.         0.46310893 0.0.         0.0104395 ][0.5608331  0.         0.5195999  0.45284656 0.22346526 0.0.         0.         0.         0.         0.3863637  0.528413530.         1.1107857  0.         0.         0.46310893 0.0.         0.0104395 ][0.5608331  0.         0.5195999  0.45284656 0.22346526 0.0.         0.         0.         0.         0.3863637  0.528413530.         1.1107857  0.         0.         0.46310893 0.0.         0.0104395 ]]

可以看到,对比激活函数应用之前,所有的负数都被替换成了0

1.3.4 nn.SequentialCell(有序神经网络)

nn.SequentialCell是一个有序的Cell容器。输入Tensor将按照定义的顺序通过所有Cell。我们可以使用SequentialCell来快速组合构造一个神经网络模型。

# 创建一个SequentialCell实例seq_modules,它将按照顺序组合多个层和激活函数
# 第一个元素是之前定义的Flatten层,用于展平输入图像
# 第二个元素是之前定义的全连接层layer1,它将展平后的图像映射到20个特征
# 第三个元素是ReLU激活函数,用于对layer1的输出进行非线性处理
# 第四个元素是另一个全连接层,它将20个特征映射到10个输出节点,通常用于分类任务的最后一层
seq_modules = nn.SequentialCell(flatten,layer1,nn.ReLU(),nn.Dense(20, 10)
)# 将输入图像input_image通过seq_modules进行处理
# 这将依次通过Flatten层、layer1、ReLU激活函数和最后一个全连接层
logits = seq_modules(input_image)# 打印经过seq_modules处理后的输出logits的形状
# 输出形状将是(3, 10),表示有三个样本,每个样本有10个输出节点
print(logits.shape)

输出:

(3, 10)

1.3.4 nn.Softmax(概率分布函数)

最后使用nn.Softmax将神经网络最后一个全连接层返回的logits的值缩放为[0, 1],表示每个类别的预测概率。axis指定的维度数值和为1。

# 创建一个Softmax实例,用于计算softmax概率分布
# 参数axis=1表示在第二个维度(索引为1)上应用softmax
# 这通常用于多分类问题,将logits转换为概率分布
softmax = nn.Softmax(axis=1)# 使用softmax函数计算logits的softmax概率分布
# 这将输出每个类别对应的概率,概率总和为1
pred_probab = softmax(logits)

1.4 模型参数

网络内部神经网络层具有权重参数和偏置参数(如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}\n")# 打印每个参数的形状print(f"Size: {param.shape}\n")# 打印每个参数的前两个值,用于查看参数的初始化情况print(f"Values : {param[:2]} \n")

输出:

Model structure: 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>>>Layer: dense_relu_sequential.0.weight
Size: (512, 784)
Values : [[-0.01270912 -0.00553937 -0.00622345 ...  0.00974897  0.00378853-0.00879488][ 0.00454485  0.00105424  0.02829224 ... -0.00480925  0.00859034-0.0075234 ]] Layer: dense_relu_sequential.0.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values : [[-0.00303549  0.02051559  0.03005496 ...  0.00813595 -0.02086384-0.00501902][ 0.00523915  0.00595684 -0.02108657 ... -0.00816013  0.00160791-0.00521205]] Layer: dense_relu_sequential.2.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.4.weight
Size: (10, 512)
Values : [[ 0.00922695 -0.00915574 -0.01120596 ... -0.00575607 -0.00918559-0.00985601][-0.01312499  0.01030371  0.01826839 ...  0.00239934 -0.01605123-0.0015749 ]] Layer: dense_relu_sequential.4.bias
Size: (10,)
Values : [0. 0.] 

更多内置神经网络层详见mindspore.nn API。
网络构建

2. 小结

今天主要学习了昇思神经网络的构建,包括模型定义、使用模型预测,深入学习了模型展平层、全连接层、激活函数、有序神经网络、概率分布函数和模型参数的相关知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quantlab5.0:一切围绕可实盘策略驱动开发

原创文章第573篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 2024年上半年即将结束&#xff0c;开始准备星球下半年的工作。 目前设想的——Quantlab5.0&#xff0c;之所以升级一个大版本&#xff0c;与4.x有很大不同。 5.0专注策略开发&…

Python28-2 机器学习算法之SVM(支持向量机)

SVM&#xff08;支持向量机&#xff09; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的监督学习模型&#xff0c;在机器学习领域中被广泛应用。SVM的目标是找到一个最佳的分割超平面&#xff0c;将不同类别的数据分开&…

【Vue】Vue.js中常见的几种语法

在 Vue.js 中&#xff0c;主要的语法可以分为以下几种&#xff1a; 插值语法 (Interpolation) 使用双大括号 {{ }} 进行文本插值。 示例&#xff1a; {{ message }} 指令语法 (Directives) 指令是特殊的标记&#xff0c;用于告诉Vue框架如何操作DOM。Vue提供了多种内置指…

【最新鸿蒙应用开发】——鸿蒙国际化

1. 国际化 鸿蒙应用开发的国际化主要是指让应用支持多种语言和适应不同地区的用户习惯。这包括对不同语言环境的支持&#xff0c;如文本和布局的本地化设置。要实现国际化&#xff0c;开发者需要准备应用程序支持的每种语言环境的一些资源&#xff0c;比如翻译后的文本、特定区…

理解论文笔记:基于贝叶斯网络和最大期望算法的可维护性研究

看了与上一篇研究方向一致的文章&#xff0c;上一篇19年的&#xff0c;这一篇22年的更新。若有侵权&#xff0c;请联系删除。 I. INTRODUCTION 介绍 主要介绍了使用贝叶斯网络和历史数据对无线传感器网络可维护性研究的重要性和必要性&#xff0c;并对下面的各章进行了…

【高性能服务器】单进程服务器

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 单进程服务器 …

认识100种电路之稳压电路

在电子电路中&#xff0c;稳压电路扮演着至关重要的角色。那么&#xff0c;为什么电路需要稳压&#xff1f;稳压的原理又是什么&#xff1f;以及稳压需要用到哪些元器件&#xff0c;数量又有多少呢&#xff1f;今天&#xff0c;就让我们一同揭开稳压电路的神秘面纱。 【电路为什…

Apple Final Cut Pro 10.8 - 专业后期制作 (视频编辑)

Apple Final Cut Pro 10.8 - 专业后期制作 (视频编辑) Final Cut Pro 10.8 Compressor 4.8 Motion 5.8 (Universal) 请访问原文链接&#xff1a;https://sysin.org/blog/apple-final-cut-pro/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

供应商关系管理(SRM)中的供应商绩效评估

供应商绩效评估是供应商关系管理&#xff08;SRM&#xff09;的核心组成部分&#xff0c;它涉及到对供应商在合作过程中的表现进行全面的分析和评价。一个有效的供应商绩效评估系统不仅可以帮助企业识别和解决供应链中的潜在问题&#xff0c;还可以促进供应商的持续改进和优化&…

Java学习 - Redis缓存问题与优化

缓存收益与成本 收益 加速读写降低后端、持久层的负载和压力 成本 可能导致数据不一致代码运维成本redis节点运维成本 缓存更新策略 策略一致性维护成本介绍LRU/LIRS算法剔除最差底剔除最近最少使用的数据超时剔除较差底定时删除、惰性删除主动更新最好高持久层更新&#x…

监控 Promethus的监控告警Alertmanager、Grafana

Promethus的监控告警Alertmanager Alertmanager 介绍 Prometheus的一个组件&#xff0c;用于定义和发送告警通知&#xff0c;内置多种第三方告警通知方式&#xff0c;同时还提供了对Webhook通知的支持基于警报规则对规则产生的警报进行分组、抑制和路由&#xff0c;并把告警发…

vue如何引入图标

方法1&#xff1a;iconify/vue pnpm add iconify/vue -D 网址&#xff1a;https://icon-sets.iconify.design/ 使用哪个需要安装 如下截图,安装指令&#xff1a; > npm install iconify/icons-gg在使用的页面引入 import { Icon } from “iconify/vue”; <template>…

Mysql存储过程用法:使用存储过程编程,来判断数据库中数据表中的字段是否重复,避免重复插入记录

目录 一、mysql的存储过程介绍 二、. 创建存储过程 1、准备 2、创建插入记录的存储过程 三. 调用存储过程 四. 删除存储过程 五. 修改存储过程&#xff0c;避免数据表的姓名出现重复 1、修改存储过程的方式 2、重新创建存储过程 六. 验证新的存储过程 1、插入新的记…

高考后的抉择:专业优先还是学校优先?

随着2024年高考的帷幕落下&#xff0c;高考生们面临的一个重要抉择再度浮上心头&#xff1a;在分数受限的情况下&#xff0c;是选择一个心仪的专业&#xff0c;还是选择一个知名度更高的学校&#xff1f;这是一个困扰了众多考生和家长的长期难题。在这个关键的时刻&#xff0c;…

好用的导航网站有哪些

网址导航网站是我们日常上网的一个重要工具。它们不仅可以帮助我们快速找到所需的资源和信息&#xff0c;还能提高我们的工作效率。以下是小编收藏的几个好用的导航网站&#xff0c;涵盖了办公、学习、娱乐等多个领域&#xff0c;分享给大家。 1. 办公人导航 办公人导航是一个…

Drag Select Compose:实现多平台图片多选功能的利器

Drag Select Compose:实现多平台图片多选功能的利器 在现代移动应用开发中,图片多选功能是一个常见且实用的需求。而实现这种功能可能涉及到复杂的手势处理和状态管理。今天,我将介绍一款强大的Compose多平台库——Drag Select Compose,它能够轻松实现类似于Google Photos…

BGP中的TCP连接源地址问题

3.TCP连接源地址&#xff08;用loop back地址是最优选择&#xff09; 应用场景与理论&#xff1a; 由于BGP应用于大型网络中&#xff0c;为了避免单点失败&#xff0c;往往需要通过多条链路连接&#xff0c;当一条链路故障时候就用另一条链路继续工作&#xff0c;但是BGP又无法…

螺旋模型:结合瀑布模型和增量模型的项目管理利器

目录 前言1. 螺旋模型概述1.1 螺旋模型的核心理念1.2 螺旋模型的四个阶段 2. 螺旋模型的详细步骤2.1 计划阶段2.2 风险分析阶段2.3 工程阶段2.4 评估阶段 3. 螺旋模型在大型项目中的应用3.1 应对需求变化3.2 有效的风险管理3.3 增强的客户参与3.4 灵活的资源分配 4. 螺旋模型的…

【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv’ 一、分析问题背景 在编写Python代码进行文件操作时&#xff0c;开发者可能会遇到…

精品UI知识付费系统源码网站EyouCMS模版源码

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软件…