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

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

目录

  • 《昇思25天学习打卡营第5天 | 网络构建》
  • 什么是神经网络模型
  • 构建一个用于Mnist数据集分类的神经网络模型
    • 定义模型类
    • 模型层
      • nn.Flatten
      • nn.Dense
      • nn.ReLU
      • nn.SequentialCell
      • nn.Softmax
    • 模型参数

想要学习神经网络模型的构建,我们要先对神经网络模型有一个简单的了解

什么是神经网络模型

神经网络模型是一种模仿生物神经系统结构和功能的计算模型,它由大量的节点(或称为“神经元”)组成,这些节点通过连接(或称为“权重”)相互作用,以处理信息。神经网络模型是机器学习和深度学习的核心组成部分,广泛应用于图像识别、语音识别、自然语言处理、游戏和决策系统等领域。

神经网络模型的基本结构包括以下几个关键部分:

  • 1.输入层(Input Layer):输入层接收原始数据或特征,并将其传递给网络。每个输入节点对应数据的一个特征。
  • 2.隐藏层(Hidden Layers):隐藏层位于输入层和输出层之间,可以有一个或多个。每个隐藏层包含多个神经元,这些神经元通过激活函数处理输入数据,并将结果传递给下一层。
  • 3.输出层(Output Layer):输出层产生网络的最终输出。输出层的节点数量取决于任务的类型,例如,分类任务中可能有一个节点对应一个类别。
  • 4.权重(Weights):权重是神经网络中连接神经元的边的强度。在训练过程中,权重会根据学习算法进行调整,以最小化预测输出和实际输出之间的差异。
  • 5.激活函数(Activation Function):激活函数决定神经元是否应该被激活,以及如何将输入信号转换为输出信号。常见的激活函数包括Sigmoid、Tanh、ReLU等。
  • 6.损失函数(Loss Function):损失函数衡量模型预测值与真实值之间的差异。训练的目标是最小化损失函数,以提高模型的准确性。
  • 7.优化算法(Optimization Algorithm):优化算法用于调整权重,以减少损失函数的值。常见的优化算法包括梯度下降(Gradient Descent)、Adam等。

神经网络模型可以通过增加隐藏层的数量和每层的神经元数量来构建更深层次的网络,即深度神经网络(DNN)。深度学习是指使用这些深度神经网络进行学习和预测的过程。随着网络深度的增加,模型可以学习到更复杂的数据表示,从而提高其在复杂任务上的性能。

神经网络模型的训练通常涉及以下步骤:

初始化权重和偏置。
通过网络前向传播输入数据,计算输出。
计算损失函数的值。
通过反向传播算法计算梯度,更新权重和偏置。
重复上述步骤,直到损失函数达到预定的阈值或训练次数达到预定值。
神经网络模型的灵活性和强大的学习能力使其成为解决各种复杂问题的有力工具。

构建一个用于Mnist数据集分类的神经网络模型

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

import mindspore
from mindspore import nn, ops

定义模型类

当我们定义神经网络时,可以继承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

构建完成后,实例化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>

构造一个输入数据,直接调用模型,可以获得一个十维的Tensor输出,其包含每个类别的原始预测值。

model.construct()方法不可直接调用。

X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits

Tensor(shape=[1, 10], dtype=Float32, value=
[[ 5.63525222e-03, 1.95503701e-03, 1.37578510e-03 … 3.18193645e-03, 4.75832634e-03, -1.40827773e-02]])

在此基础上,我们通过一个nn.Softmax层实例来获得预测概率。

pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")

Predicted class: [0]

模型层

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

input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)

(3, 28, 28)

nn.Flatten

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

flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)

(3, 784)

nn.Dense

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

layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)

(3, 20)

nn.ReLU

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

print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")

Before ReLU: [[-0.09974532 0.43209994 -1.5348294 -0.01862794 -0.34712428 -0.7054299
-0.7356559 -0.4894955 0.5345057 0.39337468 -0.4733568 0.75652665
-0.1487863 -0.06488393 -0.43578142 0.37262595 -0.47728366 -0.03433053
-0.98210937 0.5067057 ]
[-0.09974532 0.43209994 -1.5348294 -0.01862794 -0.34712428 -0.7054299
-0.7356559 -0.4894955 0.5345057 0.39337468 -0.4733568 0.75652665
-0.1487863 -0.06488393 -0.43578142 0.37262595 -0.47728366 -0.03433053
-0.98210937 0.5067057 ]
[-0.09974532 0.43209994 -1.5348294 -0.01862794 -0.34712428 -0.7054299
-0.7356559 -0.4894955 0.5345057 0.39337468 -0.4733568 0.75652665
-0.1487863 -0.06488393 -0.43578142 0.37262595 -0.47728366 -0.03433053
-0.98210937 0.5067057 ]]

After ReLU: [[0. 0.43209994 0. 0. 0. 0.
0. 0. 0.5345057 0.39337468 0. 0.75652665
0. 0. 0. 0.37262595 0. 0.
0. 0.5067057 ]
[0. 0.43209994 0. 0. 0. 0.
0. 0. 0.5345057 0.39337468 0. 0.75652665
0. 0. 0. 0.37262595 0. 0.
0. 0.5067057 ]
[0. 0.43209994 0. 0. 0. 0.
0. 0. 0.5345057 0.39337468 0. 0.75652665
0. 0. 0. 0.37262595 0. 0.
0. 0.5067057 ]]

nn.SequentialCell

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

seq_modules = nn.SequentialCell(flatten,layer1,nn.ReLU(),nn.Dense(20, 10)
)logits = seq_modules(input_image)
print(logits.shape)

(3, 10)

nn.Softmax

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

softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)

模型参数

网络内部神经网络层具有权重参数和偏置参数(如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")

输出

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.00198828  0.00976331 -0.00121677 ...  0.00152741  0.01949361-0.00351514][ 0.00710773  0.01324592  0.00197527 ... -0.01315448 -0.00343975-0.00046103]] Layer: dense_relu_sequential.0.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values : [[ 1.63047947e-02 -9.95626251e-05 -3.21123237e-03 ...  2.22095232e-02-8.22230522e-03 -5.10709640e-03][-1.89869397e-03 -7.83220772e-03 -4.89277160e-03 ...  1.33626405e-02-2.49107648e-03 -2.77312868e-03]] Layer: dense_relu_sequential.2.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.4.weight
Size: (10, 512)
Values : [[-1.0803971e-02 -1.2106386e-03 -9.3358625e-03 ... -7.1796784e-03-7.5424239e-03 -1.5704501e-02][ 6.8407003e-03 -6.9631526e-05  8.0867661e-03 ...  8.8249799e-03-1.3077988e-02  8.5207196e-03]] Layer: dense_relu_sequential.4.bias
Size: (10,)
Values : [0. 0.] 

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

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

相关文章

Bazel plugin for Visual Studio Code

语法突出显示 Bazel Build Targets 树显示工作区中的构建包/目标BUILD 文件中的 CodeLens 链接可通过单击目标直接启动构建或测试Buildifier 集成以检查和格式化您的 Bazel 文件&#xff08;需要安装 Buildifier&#xff09;tasks.json 的 Bazel Task 定义在构建期间调试 .bzl…

C++:静态断言内存对齐

静态断言 C中的断言assert (1)直接参考&#xff1a;https://www.cnblogs.com/lvchaoshun/p/7816288.html (2)C的assert是运行时检测发现错误&#xff0c;而不是编译时 (3)C在编译时错误用#error来输出C静态断言 (1)C引入static_assert(表达式, “提示字符串”)来实现编译时的静…

window搭建git环境

1.下载安装window下git专用软件scm 从Git for Windows 官网网站下载&#xff0c;并且一路安装即可 安装成功后通过桌面快捷图标Git Bash点击打开 安装后软件应该会自动帮助配置环境变量&#xff0c;如果没有需要自己配置使用 2.git环境配置 2.1设置姓名和邮箱(github上你注…

封装了一个iOS滚动厨窗效果

效果图 背景 我们要实现如图的厨窗效果&#xff0c;不能通过在tableView底部添加一个背景图片的方式&#xff0c;因为这需要修改整个tableView的背景色为透明&#xff0c;影响到的范围太大&#xff0c;只能将这个效果局限在这个cell 中&#xff0c;然后通过监听tableView的滚动…

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源&#xff1a;虹科技术丨跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 原文链接&#xff1a;虹科技术 | 跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PCAN #网关 #CA…

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会

6月25日广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会在广州万富希尔顿酒店隆重召开。大会选举沙胜昔为广东省钟表行业协会第十二届理事会会长。 领导发言 新任会长 沙胜昔 首席荣誉会长 吴伟阳 新老会长交接仪式 本次大会&#xff0c;全国钟表大伽齐参与…

前端Web开发HTML5+CSS3+移动web视频教程 Day3 CSS 第1天

P29 - P43 从此开始进入 CSS 的学习。前面都是 HTML 的学习。 CSS 的作用&#xff1a;美化。 HTML 只是规定了网页内容有哪些&#xff0c;在网页中显示的位置默认是从上到下显示&#xff0c;还带有默认效果&#xff0c;比如超链接有颜色有下划线&#xff0c;无序列表有小圆点…

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …

二叉树从根节点出发的所有路径

二叉树从根节点出发的所有路径 看上图中 二叉树结构 从根节点出发的所有路径 如下 6->4->2->1 6->4->2->3 6->4->5 6->8->7 6->8->9 逻辑思路&#xff1a; 按照先序遍历 加 回溯法 实现 代码如下 // 调用此方法&#xff0c;将根节点传递…

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过要做一个报警器。如果只是简单做一个报警器呢&#xff0c;这个基本上没有什么难度。这里&#xff0c;我们就适当提高一下…

Navicat上新啦

前言 Navicat&#xff0c;在数据库界&#xff0c;几乎是一个神奇的存在&#xff0c;似乎统治了数据库开发工具的“一片天”。且看下图&#xff1a; 红的蓝的绿的橙的…&#xff0c;可以说&#xff0c;留给它的color不多了。 那么商业BI到服务监控、从云托管到云协作&#xff…

短剧App开发的全攻略

短剧App开发的全攻略可以概括为以下几个关键步骤&#xff1a; 1、市场调研与需求分析 进行市场调研&#xff0c;研究目标用户群体&#xff0c;了解他们的需求和偏好。 观察竞争对手的App&#xff0c;分析他们的优点和缺点&#xff0c;以此为基础来制定自己的开发计划。 确定App…

Zookeeper节点ACL权限设置—digest模式

ACL全称为Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode&#xff08;ZooKeeper数据树的数据节点&#xff09;的访问。 zk利用ACL策略控制节点的访问权限: CREATE c 可以创建子节点 DELETE …

3D打印随形水路在注塑生产中的显著优势

3D打印技术在模具制造中已崭露头角&#xff0c;特别是在注塑生产中&#xff0c;3D打印随形水路的应用正变得日益普遍。 首先&#xff0c;该技术能精准优化模具温度。3D打印随形水路随形冷却的设计让模具温度更加均匀&#xff0c;水路更贴近产品&#xff0c;有效提升产品品质和缩…

k8s如何使用 HPA 实现自动扩展

使用Horizontal Pod Autoscaler (HPA) 实验目标&#xff1a; 学习如何使用 HPA 实现自动扩展。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 或内存的资源请求。创建一个 HPA&#xff0c;设置扩展策略。生成负载&#xff0c;观察 HPA 如何自动扩展 Pod…

redis实战-缓存穿透问题及解决方案

定义理解 缓存穿透&#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远都不会生效&#xff08;只有数据库查到了&#xff0c;才会让redis缓存&#xff0c;但现在的问题是查不到&#xff09;&#xff0c;会频繁的去访问数据库。 解决…